ChatworkからWordPressに記事を投稿する

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タグも反映できますが、状況に応じてサニタイズするようにしましょう。

コメント