チャットワークのメッセージの送信をトリガーにGASを作動させられるWebhookが使えるようになった

★気に入ったらシェアをお願いします!


blog_newapi

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

チャットワークAPIの素敵なバージョンアップがありました。

ChatWorkブログ: OAuthとWebhookに対応し、オープンβ版として一般公開を開始!

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がなかったときはどうしていたか

例えば、以前紹介した以下の記事は、特定のルームに「おみくじ」とメッセージを送信したら、おみくじの結果を返してくれるというものでした。

Google Apps Scriptでチャットワーク上におみくじチャットを作る
Google Apps ScriptとチャットワークAPIを使ってチャットワークで「おみくじ」と送信すると、大吉から凶までのおみくじの結果を生成してチャットワークに返す「おみくじチャット」を作成します。

チャットワークのWebhookなしで実装をしているのですが、その方法は以下のようなものでした。

  1. GASで時限式のトリガーを使って何分に一回かスクリプトを発動する
  2. チャットワークAPIにリクエストをして、指定のルームの新しいメッセージ情報を取得する
  3. メッセージに「おみくじ」が含まれていれば、おみくじの結果をチャットワークに送信する

なので、どうしてもメッセージを送ってからトリガーが発動するまでのタイムラグがありました。

また、何にもメッセージ入力がされていないのに、チャットワークにリクエストを何度も送るという、あんまりエコじゃない仕組みとも言えます。

Webhookを使えば、指定のルームのメッセージの入力があったときにGASにリクエストを送れるので、余計なタイムラグもなく、かつ必要なときだけ最低限のリクエストを行うという仕組みで実装ができるのです。

つまり、おみくじの結果がすぐに返ってくるよ、ということです。

GASでPOSTリクエストを受け取る方法

GASには、外部からのHTTPリクエストを受け取る仕組みがあります。

スクリプトを完成させてから、「ウェブアプリケーションとして公開」をすることで、URLを生成することができます(この方法は次回の記事で解説します)。

そのURLに外部からのHTTPリクエストがあったときに、シンプルトリガーとして用意されているdoGet関数またはdoPost関数が動作するようになっています。

リクエストのメソッドがGETであれば、doGet関数が発動します。これについては、以下の記事でも触れています。

Google Apps ScriptでWebアプリケーションを作る最初の一歩
初心者向けにGoogle Apps ScriptによるWebアプリケーションの作り方を解説していきます。まずは、最初の一歩して静的なWebページを表示するWebアプリケーションを作成していきます。

Webhookの場合、前述の通り、送られてくるリクエストはPOSTリクエストになりますので、doPost関数を使います。

Eventオブジェクトからデータを取り出す

doPost関数では(doGet関数でもそうですが)発動の際に、Eventオブジェクトを引数として受け取ることができます。

Eventオブジェクトにはリクエストについて、色々な情報が含まれています。

EventオブジェクトからPOSTリクエストのボディのデータを取り出すには

Eventオブジェクト.postData.contents

とすることで取り出すことができます。

つまり、以下のようにdoPost関数をスクリプトとして用意すれば、Webhookがあったときにその中身を取り出して処理をすることができるわけです。

まとめ

以上、チャットワークWebhookとGASの連携についての仕組みについてお伝えしました。

  • Webhookとは何か
  • チャットワークWebhookでできること
  • GASでPOSTリクエストを受け取りデータを取り出す方法

これで全体の仕組みは理解いただけたかと思います。また、Webhookのメリット…ほんと待ってたって感じです。

では、次回は実際に、Webhookで動作するGASのスクリプトを作成していきます。

チャットワークWebhookを使ってメッセージ送信をトリガーにGASを起動させる方法
チャットワークWebhookとGASの連携方法についてお伝えしております。今回はいよいよチャットワークWebhookを使ってメッセージをトリガーにGASを起動するスクリプトとその手順をお伝えしていきます。

どうぞお楽しみに!

連載目次:GASとチャットワークWebhookを連携させた便利ツール

チャットワークAPIのバージョンアップでメッセージ送信や自分へのメンションをトリガーにしたWebhookを使用することができるようになりました。GASとの連携により色々な便利ツールを作っていきます。
  1. チャットワークのメッセージの送信をトリガーにGASを作動させられるWebhookが使えるようになった
  2. チャットワークWebhookを使ってメッセージ送信をトリガーにGASを起動させる方法
  3. GASとチャットワークWebhookで即レスポンスのおみくじチャットを作る方法

The following two tabs change content below.
1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、コンサル、執筆本を中心に活動しています。→詳しいプロフィールはコチラ ★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ ★フォロー頂ければ嬉しいです。