みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
チャットワークAPIの素敵なバージョンアップがありました。
OAuthとWebhookが使えるようになったのですが、本シリーズではWebhookについてお伝えしていきますよ。
というのも、この新機能Webhook。GASとチャットワークの連携でいうと、劇的な変化をもたらします。
簡単に言うと、チャットワークのメッセージをトリガーに、すぐさまGASを作動させられるようになるのですよ!
まず、今回はWebhookとは何か、そしてWebhookを使ってGASを動作させる仕組みについてお伝えします。
Webhookとは何か?
まず、Webhookとは
イベント発生時、指定したURLにPOSTリクエストする仕組みのこと。
を指します。
とあるサービスで何らかのイベントが発生したら、それをきっかけにURLにPOSTリクエストを送ります。
そのリクエストを受けた別のサービスが、そのPOSTリクエストを受けたことをきっかけに、その中身も受け取りつつ何らかの動作をするという仕組みです。
GETリクエストとPOSTリクエスト
HTTPリクエストは
- リクエスト行
- ヘッダー
- ボディ
という3つのエリアで構成されています。
GETリクエストは、ブラウザが「WebページのHTMLデータをくださいな」とWebサーバーにお願いをするような「頂戴」リクエストですので、URLさえあれば完結できることが多いです。したがってボディは空のときもしばしば。
一方で、POSTリクエストでは、リクエストとともにボディに本体となるデータが含めて送信をするのが基本です。
チャットワークWebhookでできること
今回実装されたチャットワークのWebhookでできることは以下の3通りです。
- アカウントイベント
- 自分へのメンション:自分宛のToを受け取った際に発生
- ルームイベント
- メッセージ作成:特定のルームへのメッセージ作成があった際に発生
- メッセージ編集:特定のルームへのメッセージ編集があった際に発生
Webhookで受け取れるデータ
チャットワークWebhookでは、そのPOSTリクエストのボディに以下のようなデータが含まれています。
フィールド名 | データ型 | 説明 |
---|---|---|
webhook_setting_id | 文字列 | WebhookID |
webhook_event_type | 文字列 | Webhookイベントの種類 |
webhook_event_time | 数値 | Webhookの発生時刻(エポック秒) |
webhook_event | JSON | Webhookイベントオブジェクト |
WebhookイベントオブジェクトはJSON形式で、さらにその中にイベントの種類に応じた内容が格納されています。
例えば、アカウントイベントであれば
フィールド名 | データ型 | 説明 |
---|---|---|
from_account_id | 数値 | メッセージ送信元のアカウントID |
to_account_id | 数値 | メッセ―ジ送信先のアカウントID |
room_id | 数値 | ルームID |
message_id | 文字列 | メッセージID |
body | 文字列 | メッセージ本文 |
send_time | 数値 | メッセージの送信時刻(エポック秒) |
update_time | 数値 | メッセージの最終編集時刻(エポック秒)※メッセージ作成時は0 |
ルームイベントであれば
フィールド名 | データ型 | 説明 |
---|---|---|
message_id | 文字列 | メッセージID |
room_id | 数値 | ルームID |
account_id | 数値 | メッセージを送信したユーザーのアカウントID |
body | 文字列 | メッセージ本文 |
send_time | 数値 | メッセージの送信時刻(エポック秒) |
update_time | 数値 | メッセージの最終編集時刻(エポック秒)※メッセージ作成時は0 |
というデータが含まれています。
これらの情報をリクエストとともに渡すことができるということです。
Webhookがなかったときはどうしていたか
例えば、以前紹介した以下の記事は、特定のルームに「おみくじ」とメッセージを送信したら、おみくじの結果を返してくれるというものでした。
チャットワークのWebhookなしで実装をしているのですが、その方法は以下のようなものでした。
- GASで時限式のトリガーを使って何分に一回かスクリプトを発動する
- チャットワークAPIにリクエストをして、指定のルームの新しいメッセージ情報を取得する
- メッセージに「おみくじ」が含まれていれば、おみくじの結果をチャットワークに送信する
なので、どうしてもメッセージを送ってからトリガーが発動するまでのタイムラグがありました。
また、何にもメッセージ入力がされていないのに、チャットワークにリクエストを何度も送るという、あんまりエコじゃない仕組みとも言えます。
Webhookを使えば、指定のルームのメッセージの入力があったときにGASにリクエストを送れるので、余計なタイムラグもなく、かつ必要なときだけ最低限のリクエストを行うという仕組みで実装ができるのです。
つまり、おみくじの結果がすぐに返ってくるよ、ということです。
GASでPOSTリクエストを受け取る方法
GASには、外部からのHTTPリクエストを受け取る仕組みがあります。
スクリプトを完成させてから、「ウェブアプリケーションとして公開」をすることで、URLを生成することができます(この方法は次回の記事で解説します)。
そのURLに外部からのHTTPリクエストがあったときに、シンプルトリガーとして用意されているdoGet関数またはdoPost関数が動作するようになっています。
リクエストのメソッドがGETであれば、doGet関数が発動します。これについては、以下の記事でも触れています。
Webhookの場合、前述の通り、送られてくるリクエストはPOSTリクエストになりますので、doPost関数を使います。
Eventオブジェクトからデータを取り出す
doPost関数では(doGet関数でもそうですが)発動の際に、Eventオブジェクトを引数として受け取ることができます。
Eventオブジェクトにはリクエストについて、色々な情報が含まれています。
EventオブジェクトからPOSTリクエストのボディのデータを取り出すには
とすることで取り出すことができます。
つまり、以下のようにdoPost関数をスクリプトとして用意すれば、Webhookがあったときにその中身を取り出して処理をすることができるわけです。
function doPost(e) { //e.postData.contentsを取得して何らかの処理をする }
まとめ
以上、チャットワークWebhookとGASの連携についての仕組みについてお伝えしました。
- Webhookとは何か
- チャットワークWebhookでできること
- GASでPOSTリクエストを受け取りデータを取り出す方法
これで全体の仕組みは理解いただけたかと思います。また、Webhookのメリット…ほんと待ってたって感じです。
では、次回は実際に、Webhookで動作するGASのスクリプトを作成していきます。
どうぞお楽しみに!