定期的に Twitter で特定の内容を検索して通知してくれる Bot を作った話（続編）

大変お待たせいたしましたが、ようやく続編書けました！
見捨てないで読んでくださっている方々、本当に感謝です。ありがとうございます！( ;∀;)

念のため。
これは [定期的に Twitter で特定の内容を検索して通知してくれる Bot を作った話（前編）](https://qiita.com/kunihiros/items/a2686c11faaa39dec60b) および [定期的に Twitter で特定の内容を検索して通知してくれる Bot を作った話（後編）](https://qiita.com/kunihiros/items/2991223f39997c96ed75) の続きです。

書ききれなかった、「共有するボタンを押したら全体のトークルームに送信する方法」を解説していきます。
どうぞよろしくお願いいたします。

## 「共有する」ボタンを押したら別のトークルームに送信

前回の記事で実装した「共有する」ボタンは [メッセージ送信 (buttonTemplate)](https://developers.worksmobile.com/jp/document/100500804?lang=ja) を使用しています。


![1583810815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/9be180a7-a4e2-8a60-9ab8-282afe35bd0f.png)


メッセージ内の「共有する」ボタンを押すと、Bot の CallbackURL 宛にメッセージが送信されます。
詳しくは [メッセージ受信 - Callback 形式](https://developers.worksmobile.com/jp/document/1005009?lang=ja) を参考にしてください。

CallbackURL は、[実は前編で設定していた](https://qiita.com/kunihiros/items/a2686c11faaa39dec60b#lineworks-developer-console-%E3%81%AE%E8%A8%AD%E5%AE%9A)のです！

・・・わかってますって？
ですよねー(*‘∀‘)

なので、GoogleAppsScripts のコードに、Callback を受信したときの処理を追加します！

```js:app.gs
function doPost(e) {
  if (e == null || e.postData == null || e.postData.contents == null) return;
  const requestJSON = e.postData.contents;
  const requestObj = JSON.parse(requestJSON);
  var text = requestObj.content.text;
  text = text.replace(/.*?text=/,""); // 不要な部分の削除
  const sendMsg = text.replace("\n\n\">全体のトークルームに共有します。",""); // 不要な部分の削除
  const keys = {
    "apiId" : "API ID",
    "consumerKey" : "Server API Consumer Key",
    "serverId" : "Server List(ID登録タイプ) の ID",
    "privateKey" : "Server List(ID登録タイプ) の認証キー",
    "botNo" : "botNo"
  };
  const roomId = "1234567890"; // 送信したいトークルームの roomId
  const uri = "https://apis.worksmobile.com/r/" + keys.apiId + "/message/v1/bot/" + keys.botNo + "/message/push";
  const headers = {
    "Content-type": "application/json",
    "consumerKey": keys.consumerKey,
    "Authorization": "Bearer " + LINEWORKS.getToken(keys)
  };
  const options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify({
      "roomId": roomId,
      "content": {
        "type": "text",
        "text": sendMsg
      }
    })
  }
  UrlFetchApp.fetch(uri, options); 
}  
```

- 8行目の `keys` には自身の DeveloperConsole 画面で確認した API ID などを入れてください
- 15行目の `roomId` には共有先のトークルームの `roomId` を入れてください。

トークルームの `roomId` を取得するにはいくつか方法があるのですが、良かったら過去の記事「[トークルームの roomId を取得する bot](https://qiita.com/kunihiros/items/16bd30676c8f17480646)」を参考にしてくださいませ(*'ω'*)

6、7行目ではテキストの不要な部分を削除しています。
何もしないと以下のような文章が送られてきます。

```
<postback callbackBotNo="xxxxxx" data="action=share&text=Thu Mar 05 03:32:02 +0000 2020
こぐまのケーキ屋さんはほっこりするなぁ
クリームちゃん

">全体のトークルームに共有します。
```

`text=` よりあとの文章が必要なので、前半部分を6行目で、後半部分を7行目で削除しています。

コードをコピペして、`keys` と `roomId` を修正したら、GoogleAppsScript を公開して完成です！
公開の仕方は前編で紹介した [GoogleAppsScript の作成](https://qiita.com/kunihiros/items/a2686c11faaa39dec60b#googleappsscripts-%E3%81%AE%E4%BD%9C%E6%88%90) で説明している手順と同様に行えば更新版を公開できます。

公開したのち、Bot から送られてきたメッセージの「共有する」ボタンを押すと・・・

![1583810843.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/dea30350-2e2a-b0d6-16df-c2fe13dbb83b.png)

全体のトークルームに共有できました！

#おわりに
ここまでお付き合いいただき、本当に、本当にありがとうございました！(*´Д｀)
ようやく書き終わることができました。。。
長い文章書くのって本当に大変だなぁ。諸先輩方の凄さに感服している次第です。

今回の失敗を反省し、次回に生かす所存であります！('◇')ゞ

あと、`Keys` の値はいくつかの `function` で使用するのでどこかで Getter を作っておいた方が楽な気がします。

それから、あんまり使ったことなかったのですが、LINEWORKS API の [URL スキーム](https://developers.worksmobile.com/jp/document/17?lang=ja) を使うと `roomId` を指定せず、好きなトークルームをユーザが指定できるみたいです。

色々と精進しないとなー。頑張ります('ω')

ではまた！(^^)/

#参考にさせていただきましたm(_ _)m
[GoogleAppsScript 公式](https://developers.google.com/apps-script/reference/)
[Twitter Developers 公式](https://developer.twitter.com/en/docs)
[LINEWORKS Developers 公式](https://developers.worksmobile.com/jp/document?lang=ja)