ChatworkのWebhookを使って、WordPressに記事を投稿する方法を紹介します。
独自エンドポイントの追加
まず、WordPressに独自のエンドポイントを追加します。
リクエストを受けたら署名認証を経て、新規投稿を作成します。
add_action('rest_api_init', function() {
register_rest_route('myapi/v1', '/chatwork', [
'methods' => 'POST',
'callback' => 'my_insert_post_from_chatwork',
'permission_callback' => '__return_true'
]);
});
function my_insert_post_from_chatwork( $request ) {
// リクエストの署名検証
$token = 'xxxxxyyyyyzzzzz'; // Chatwork Webhookのトークン(後ほど取得)
$headers = $request->get_headers();
$request_signature = $headers['x_chatworkwebhooksignature'];
$request_raw_body = $request->get_body();
$key = base64_decode($token);
$digest = hash_hmac('sha256', $request_raw_body, $key, TRUE);
$expected_signature = base64_encode($digest);
if ( $request_signature[0] == $expected_signature ) {
$request_body = json_decode($request_raw_body, true);
if ( $request_body ) {
// メッセージの本文を取得
$chat_msg = $request_body['webhook_event']['body'];
// タイトルを抽出
$title = '';
$title_start = mb_strpos($chat_msg, '[title]');
$title_end = mb_strpos($chat_msg, '[/title]');
if ( $title_start !== FALSE && $title_end !== FALSE ) {
$title = mb_substr($chat_msg, $title_start + 7, $title_end - $title_start - 7);
}
// 本文を抽出
$content = '';
$info_end = mb_strpos($chat_msg, '[/info]');
if ( $title_end !== FALSE && $info_end !== FALSE ) {
$content = mb_substr($chat_msg, $title_end + 8, $info_end - $title_end - 8);
}
if ( $title && $content ) {
$allowed_html = array(
'h2' => array(),
'p' => array(),
);
$args = array(
'post_title' => wp_kses($title, $allowed_html),
'post_author' => 1,
'post_content' => wp_kses($content, $allowed_html),
);
$id = wp_insert_post($args, TRUE);
}
}
}
return new WP_REST_Response(null, 200);
}
署名認証はChatwork Creator’s Noteの記事を参考にさせて頂きました。
https://creators-note.chatwork.com/entry/2017/11/22/165516
Chatwork側の作業
Chatwork画面のメニューにある【サービス連携】からWebhookに進み、新規作成します。
先ほど作成したエンドポイントをWebhook URLに入力しましょう。
表示されているトークンをmy_insert_post_from_chatwork関数内に追記して、実装完了です。
投稿してみる
Chatworkのinfoタグとtitleタグを使って実際にメッセージを送信すると、WordPressに記事が投稿されるのが確認できます。
HTMLタグも反映できますが、状況に応じてサニタイズするようにしましょう。
コメント