ChatworkのWebhook API を使って kintone にレコードを登録する方法


kintone は APIが公開されていることで、外部のクラウドサービスと連携することが可能です。
今回は Chatwork の特定のチャットルームにメッセージを書き込んだ時に kintone のアプリにレコードを登録する方法についてまとめたいと思います。

前提条件

コードは書きませんが、REST API の知識がある事が前提です。もちろんJSONとか。

  • kintoneアプリ作成の知識がある方
  • kintone REST API についての知識がある方
  • kintone のアプリ作成権限があること
  • Chatworkを利用されている方
  • Chatwork API についての知識がある方
  • ChatworkのAPI設定の権限がある方

Chatworkのメッセージを kintone にレコード登録する方法

いくつかのパターンをまとめます。

  1. ChatworkのWebhookを利用して外部のサーバーを経由してkintoneにレコード登録する方法
  2. Chatworkのbotからメッセージの書き込みをトリガーにkintoneにレコード登録する方法
  3. Chatworkとkintoneの連携プラグインを利用する方法
  4. IFTTT,Zapier等の自動化サービスを利用する方法

1.〜3.についてはたくさんの事例がありますので、各自調べていただくとして今回は4.の自動化ツールに Integromat を使う方法を説明したいと思います。

データの流れのイメージは、
[Chatworkのルームを表示] → [Chatworkにメッセージ登録] → [Chatwork Webhook(トリガー)発火] →
[Integromat Webhookでメッセージデータ受信] → [Integromat HTTP でkintoneレコード登録のAPIを叩く] → [kintoneレコード登録]
です。

準備

事前準備です。

  • Chatworkを開いておきます
  • kintoneにログインしておきます

Chatworkの設定

チャットルームの作成

Chatworkにテスト用のルームを作成することにします。
ルーム名は何でもOKです。Webhookの登録にルームIDが必要となりますのでメモっておきます。
もちろん既存のルームでもOKです。

赤の囲み部分がルームIDです。

Webhookの設定

ChatworkにはWebhookが実装されていて、チャットルームへのメッセージ投稿をトリガーに処理を行うという事が出来ます。

設定画面です。

赤囲みにチャットルームのルームIDをセットします。
[Webhook URL]には Webhookを処理するサーバーのURLをセットします。
こちらは後ほど説明する Integromat の Webhook の情報をセットします。
今回のWebhookイベントは、メッセージ作成時に設定しておきます。


Integromat でシナリオの作成

Integromat で処理するフローはシナリオと言います。
今回は、[Webhook]→[HTTP]の流れでシナリオを作成します。

完成するとこんな感じです。

Webhooks

Integormatには、Chatwork用のサービスが登録されてないので、カスタムWebhookを使って設定していきます。
ちょっと長くなりますが、スクリーンショット多めでいきます。

新規シナリオ→サービスから Webhooks を選んで次へ

シナリオのスタートを決めます。?マークをクリック

Webhooksを選んで、今回はトリガーにCustom webhookを選択

Addボタン押下→Webhook nameは何でも良いので、名前をつけてやりましょう。
Saveを忘れずに。

Webhooksに戻ると、IntegromatからURLが払い出されるので、Copy address to clipboardを押します。

ここで、ChatworkのWebhookの設定に戻って、Webhook URLに貼り付けます。

ここまでの確認

ここまででどうなってるかを確認しましょう。

  1. Chatworkのルームを作成しました。
  2. ChatworkにWebhookを設定しました。
  3. Integromatにシナリオを作成しました。
  4. シナリオにカスタムWebhookを追加しました。
  5. カスタムWebhookから払い出されたURLをChatworkのWebhookに設定しました。

流れでいうと、1.〜4.まで設定できました。
[1.Chatworkのルームを表示] → [2.Chatworkにメッセージ登録] → [3.Chatwork Webhook(トリガー)発火] →
[4.Integromat Webhookでメッセージデータ受信] → [5.Integormat HTTP でkintoneレコード登録のAPIを叩く] → [6.kintoneレコード登録]

Chatwork投稿 → Integromat Webhookデータ受信テスト

ここまでをテストしてみます。
問題無ければIntegromatのカスタムWebhookログで投稿内容が確認できると思います。

作成したIntegromatのシナリオの左下[Run once]をクリック

作成したChatworkのルームで適当に書き込んでみます。

IntegromatのWebhookを確認します。
[The scenario run was completed.]が出てたらOK。

リクエストを確認します。

Chatwork API

Chatwork APIのWebhookリクエスト情報とIntegromatのWebhookで受け取った情報を確認してみます。
Chatwork APIのWebhookリクエスト情報

IntegromatのWebhookの受信情報
ChatworkのWebhookのリクエストボディのサンプルと比較すると良いかと思います。

kintoneにデータ登録

いくつかやり方はありますが、今回はノーコードらしくOAuthでkintoneに認証してレコードを登録していきます。

kintone接続までの流れ

  1. kintoneアプリ作成
  2. kintoneにIntegromatのOAuthクラインアント情報を登録
  3. IntegromatにHTTPのモジュールを追加
  4. IntegromatのHTTPモジュールにOAuthを設定
  5. Integromatにkintoneレコード登録の設定

1. kintoneアプリ作成

下記のように設定しています。

2. kintoneにIntegromatのOAuthクラインアント情報を登録

下記を参考に設定して下さい。

3. IntegromatにHTTPのモジュールを追加

4. IntegromatのHTTPモジュールにOAuthを設定

[Make a OAuth 2.0 request]を選択します。

[Add]を選択してOAuthの接続設定をします。
設定は下記を参照。
OAuthクライアントの使用
kintoneに登録するモジュールの設定

5. Integromatにkintoneレコード登録の設定

kintoneにレコードを登録する設定をします。

下記を参考に設定します。
* https://support.integromat.com/hc/en-us/articles/360006249313-Webhooks
* https://developer.cybozu.io/hc/ja/articles/202166160#step1
* https://developer.cybozu.io/hc/ja/articles/201941754

この辺りは kintone REST API の知識があれば問題なく設定できるかと思います。

[Run once]を押してから、Chatworkのルームにメッセージを入力します。

Integromatへのリクエスト情報と戻り値を確認。

kintoneにレコードが登録されていることを確認します。

後は、Integormatの設定でスケジュールを設定することで、Chatworkのメッセージ入力都度kintoneにレコード登録することが出来ます。


参考

その他サービス連携


あとがき

カスタムWebhook最強。設定を理解すれば他にも色々なサービスと繋げられると思います。
後、Qiitaへの投稿が99本まで来ました。意外と時間が掛かった。

追記

2021-05-20

Chatworkの日時データの変換

ChatworkのWebhookで送信されるWebhookイベントオブジェクトにある、例えば"send_time"(メッセージの送信時刻(エポック秒))のような日時情報を取り扱う方法は2つあります。

  • Chatwork APIで利用される日時データ形式は、エポック秒(UNIXタイム)になっています。

1 Integromatで変換する

parceDate関数やformatDate関数を利用してUNIXタイムを変換することができます。

{
    "app": "67",
    "record": {
        "title": {
            "value": "{{1.webhook_event.room_id}} {{formatDate(parseDate(1.webhook_event.send_time; "X"); "YYYY-MM-DD HH:mm:ss"; "Japan")}}"
        },
        "subject": {
            "value": "{{1.webhook_event.body}}"
        },
        "send_time": {
            "value": {{1.webhook_event.send_time}}
        }
    }
}

2 kintoneで変換する

kintone側では数値フィールドで受け取って、計算フィールドを使って変換します。
計算式のフォーマットに日時を設定したり、DATE_FORMAT関数を使ってよしなに表示すると良いでしょう。