ChatWorkのWebhookとGoogleAppsScript(GAS)を使ってチャットルームにメンバーが追加された際に定型文をコメントするBotを作る

今更ですがChatWorkが[Webhook](https://blog-ja.chatwork.com/2017/11/api-openbeta.html)に対応したようなので、リアルタイムで応答可能なBotが作れるようになりました。
以前はチャットワークAPIでメッセージを取得して、新着があったら・・・みたいなことをしないとダメだったので非常に便利になりました。
Google Apps Script (GAS)を使えばお手軽にWebアプリケーションとして公開できるので、
この方法で試しにチャットルームに新規メンバーが追加された際に、追加されたユーザーをToにして「初めまして。」と定型文をコメントするBotを作ってみました。

# チャットワークAPIのTokenを取得する
Botとして扱いたいユーザーでチャットワークにログインして、[公式ページ](https://help.chatwork.com/hc/ja/articles/115000172402-API%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E7%99%BA%E8%A1%8C%E3%81%99%E3%82%8B)を見ながら取得します。

# Google Apps Script (GAS)の新規プロジェクトを作成する
Googleドライブを開いて、下記のようにGoogle Apps Scriptの新規プロジェクトを作成します。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/d17776c4-3ea4-b6d4-8bdb-87dab51beb15.png)

赤枠で囲んだ「Google Apps Script」が見当たらない場合は、その下にある「＋アプリを追加」から「Google Apps Script」を検索して追加してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/7d73c610-c0e7-560c-cc8a-059ce11e42bc.png)

# GASにコードを書く
ChatWorkのWebhookからはHTTPS POSTリクエストが来るので、GAS側にPOSTの受け口となるdoPost関数を作成します。
その関数に、今回作成する「チャットルームにメンバーが追加された際に定型文をコメントする」という処理を記述します。
リクエストされるパラメータの詳細は、[公式ドキュメント](http://developer.chatwork.com/ja/webhook.html)を参照ください。

```js
// botとして扱うアカウントIDを設定しないと、作成する処理によっては無限ループに入るので注意
var BOT_ACCOUNT_ID = '必要ならここにbotとして扱うアカウントIDを書く';
var API_TOKEN = '先述の項で取得したチャットワークAPIのTokenをここに書く';

function doPost(event) {
  var contents = JSON.parse(event.postData.contents);
  var accountId = contents.webhook_event.account_id;
  
  if (accountId == BOT_ACCOUNT_ID) {
    return;
  }
  
  var contentsBody = contents.webhook_event.body
  var addAccountIdArray = getAddedAccountIdArray(contentsBody);
  
  if (addAccountIdArray.length > 0) {
    var replyMessage = "初めまして。";
    var params = {
      headers : {"X-ChatWorkToken" : API_TOKEN},
      method : "post",
      payload : {body : createHelloMessage(addAccountIdArray) + replyMessage}
    };
    var url = "https://api.chatwork.com/v2/rooms/" + contents.webhook_event.room_id + "/messages";
    UrlFetchApp.fetch(url, params);
  }
}

function getAddedAccountIdArray(contentsBody) {
  var accountIdArray = [];
  if (contentsBody.match(/dtext:chatroom_member_is\S+piconname\S+dtext:chatroom_added/)) {
	var regex = /(piconname:(\d+))+/g
	while ((piconname = regex.exec(contentsBody)) != null) {
		accountIdArray.push(piconname[2]);
	}
  }
  return accountIdArray;
}

function createHelloMessage(accountIdArray) {
  var message = "";
  for (var i=0; i<accountIdArray.length; i++) {
    message += "[To:" + accountIdArray[i] + "][piconname:" + accountIdArray[i] + "] さん\n";
  }
  return message;
}
```

# GASでウェブアプリケーションとして公開する
[公開] -> [ウェブ アプリケーションとして導入] を選択し、必要項目を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/d734f3bc-ab94-23e1-c59c-8cd6e0701ef1.png)
赤枠で囲んである部分がこのウェブアプリケーションのURLですので、このURLを控えておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/aabca7bd-3969-9655-3284-152c5f9cb7d9.png)

# チャットーワークWebhookの設定
APIトークンと同じくBotとして扱いたいユーザーでチャットワークにログインして、[公式ページ](https://help.chatwork.com/hc/ja/articles/115000169541-Webhook%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)を見ながら設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/0f090227-a23e-9cc5-a503-da99e0813f4c.png)
赤枠で囲んだところには、GASでウェブアプリケーションとして導入をした時に控えたURLを設定します。
イベントは「ルームイベント」でメッセージ投稿時に発動してほしいでの「メッセージ作成」にチェックをつけます。
ルームIDにはこのWebhookが発動する部屋を指定しますので、ルームIDは別途このページに書いてある方法で調べてください。

# 動かしてみました
以上でチャットワークのWebhookとGASを連携させる設定ができたので、実際に動かしてみました。
※ぺんぎんさんがみつばちさんを部屋に招待したらお知らせするマンさん(Bot)が応答してくれるの図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/bfee6828-dec8-9c27-c03b-db2cc326d792.png)