【LINE WORKS】グループトークルームで利用できるBotを作る

初めましての方もお久しぶりの方も、こんにちは！
LINE WORKS Advend Calendar 3日目にどうにか間に合いました！(ﾟ∀ﾟﾉﾉ"☆ﾊﾟﾁﾊﾟﾁﾊﾟﾁ

自分の勉強のためにも、もっと記事を書きたいのですがなかなかできず…( ﾉД`)ｼｸｼｸ
今回はようやく時間が取れたので、グループトークルームで利用できるBotを作ってましたよ(^_-)-☆

# Botをグループトークルームで利用するには

Botとの1:1のトークルームや、ユーザーを指定してのトークルームはAPIが用意されているので、簡単に作成することができます。
[LINE WORKS Developers - トークルームの登録](https://developers.worksmobile.com/jp/reference/bot-channel-create?lang=ja)

しかし、**すでに存在しているトークルームにBotを所属させるAPIはありません**。
そのため、グループや組織など既にトークルームが存在している場合は、トークの画面から手動でBotを招待する必要があります。
そして、Botもそのトークルームの `channnelId` を取得する必要があります。

まぁ、制約的な話だけされてもイメージつきませんよね( ﾟДﾟ)
どんな流れでBotが動くのか、ざっと見てみましょう。

## Reply Botの場合

ユーザーからトークが来た場合に返信する場合は以下のような流れで設定します。

1. BotをLINE WORKSに登録
1. BotをBotサーバーに構築
1. グループ/組織のトークルームでBotを招待（手動で行う）
1. ユーザーがトークを送信
1. Botサーバーがトークを受信（[Message Event](https://developers.worksmobile.com/jp/reference/bot-callback-message?lang=ja)）
1. 受信した内容から `channnelId` を取得して[トークルームへメッセージを送信](https://developers.worksmobile.com/jp/reference/bot-channel-message-send?lang=ja)

3.の手順が1:1のBotと異なり、必ず手動で行う必要があります。
6.で `userId` ではなく `channnelId` を指定してメッセージを送信していることも要注意デス。

## Push Botの場合

ユーザーからの応答には答えず、一方的にメッセージを送信する場合は以下のような流れで設定します。

1. BotをLINE WORKSに登録
1. BotをBotサーバーに構築
1. グループ/組織のトークルームでBotを招待（手動で行う）
1. Botサーバーが招待を受信（[Join Event](https://developers.worksmobile.com/jp/reference/bot-callback-join?lang=ja)）
1. 受信した内容から `channnelId` を取得してBotサーバーのDBに登録
1. 何かをトリガーにDBに登録されている `channnelId` の[トークルームへメッセージを送信](https://developers.worksmobile.com/jp/reference/bot-channel-message-send?lang=ja)

4.からの流れがだいぶ違いますね。
BotからアクションするにはBotが送信先の情報を持っていないといけません。（Google Apps ScriptであればSpread Sheetに保存しとけばいいですよ(^^)/

## Reply & Push Bot

上記二つの機能を合わせたBotです。Bot発信もしたいし応答もして欲しい！という贅沢な感じ。
もちろん可能ですが、複雑になるので今回は割愛させていただきます！( ﾟДﾟ)

# グループトークルームにReplyするBotを作ってみる

過去に書いた記事で作成したBotに手を加えますので、Google Apps Scriptで基本的なBotを作成する方法は[こちら](https://qiita.com/kunihiros/items/4cdec5784f21598cfee0)をご参考ください。

### 1. Botを複数人のトークルームに招待可能にする

前回の記事で作成したBotは1:1のBotなので、複数人のトークルームで招待可能に設定する必要があります。LINE WORKS Developer Consoleにアクセスして、Botの修正を行います。

1. Developer Consoleのbotのページにアクセス
https://developers.worksmobile.com/jp/console/bot/view
1. 登録したBotの詳細ページを開いて「修正」ボタンをクリック
1. 「複数人のトークルームに招待可」にチェックを入れる
1. 「保存」をクリック

![l_1728761_243_69d7d57b8f581a2184bc2da6b3456fce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/bb9d29af-c74a-2b39-713f-431f1aa9067c.png)

### 2. コードを変更する

`channelId` を取得してトークルームに送信するよう、以下のように変更します。


```js
function doPost(e) {
  if (e == null || e.postData == null || e.postData.contents == null) return
  let requestJSON = e.postData.contents
  let requestObj = JSON.parse(requestJSON)
  let text = requestObj.content.text // 応答メッセージ（今回はオウム返し）

  let env = getEnv_()
  // channelIdを取得
  env.channelId = requestObj.source.channelId
  // 複数人トークルームにメッセージを送信
  LINEWORKS.channelMessageSend(env, text)
}

function getEnv_() {
  return {
    CLIENT_ID: "xxxxxxxxxxxxxxxx",
    CLIENT_SECRET: "xxxxxxxxxxxxxxxx",
    SERVICE_ACCOUNT: "xxxxxx.serviceaccount@xxxxxxxxxx",
    PRIVATE_KEY: "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx==\n-----END PRIVATE KEY-----",
    DOMAIN_ID: 10000001,
    ADMIN_ID: "xxxx@xxx.com",
    BOT_ID: 20000001
  }
}

function createBot() {
  let env = getEnv_()
  env.BOT_ID= LINEWORKS.qiitaSampleBotCreate(env).botId
  LINEWORKS.qiitaSampleBotDomainRegister(env)
  Logger.log("BOT_ID: " + String(env.BOT_ID))
}
```

### 3. LINEWORKSライブラリを最新にする

Google Apps ScriptのLINEWORKSライブラリを最新にします。最新にすると `channelMessageSend()` が使用できるようになります。

1. ライブラリの一覧から `LINEWORKS` をクリック
![l_1728761_244_45f7169dc00b31a3a869500c3bd2ccb9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/eda4d093-4ca7-b92b-9b3a-c19b54d3c463.png)

1. 最新のバージョン（61以降）に変更して「保存」を選択
![l_1728761_245_056d3628033ec7114dd0b2fa08dae0b6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/c45980e0-a057-2dee-d8da-836d55c21096.png)

### 4. グループのトークルームでBotを招待

1. LINE WORKSトークを開いてグループのトークルームを開く
1. メニューから「Bot招待」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/0b6a9c2a-3f3e-6c0c-ed9a-e9f8c4fb417f.png)

1. Botを選んでOKをクリック
![l_67319250_29_9d85931ce7231527d3ca9576d1bbca08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/fb2ae0cf-61fa-544a-acf9-0ad5dfc54e32.png)

![l_17892807_151_aa55f1e39e1ca35d3dcebf6e00881d2b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/b704a610-f39f-baf5-92f7-1af58b9958d8.png)

これでグループトークルームにBotが追加されました！

さっそく話しかけてみましょう！(*´▽｀*)

![1669274057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/3985e3e1-5c33-0f9b-20c4-27b99ab6b770.png)

グループトークでちゃんと返事を返してくれましたね！やった♪ヾ(*´∀｀*)ﾉ

### おまけ
`LINEWORKS.channelMessageSend(env, text)`の中身です。

```js: channelMessageSend
function channelMessageSend(ENV, text) {
  const token = getAccessToken(ENV, "bot").access_token
  const uri = "https://www.worksapis.com/v1.0/bots/" + ENV.BOT_ID + "/channels/" + ENV.channelId + "/messages"
  const json = {
      "content": { "type": "text", "text": text }
  }
  const options = {
    "method": "POST",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + token
    },
    "payload": JSON.stringify(json)
  }
  return UrlFetchApp.fetch(uri, options)
}
```

# おわりに

ここまでお付き合いいただきありがとうございました。
前に記事書いたのは4月でした。コメントもいっぱいいただいるのになかなか返信もできず、申し訳ない気持ちでいっぱいのまま、もう師走。ようやく記事を出せてほっとしています。今年は鬼のように忙しかったのです。。。(´；ω；`)ﾕﾙｼﾃ
変わらず記事を読んでくれる皆様、温かいコメントを残してくださる皆様、本当にありがとうございました。この場を借りて、感謝を。

次回はこの記事のさらに続きで、Push Botを作ってみたいと思います。今年のAdvend Calendarに載せられるよう、頑張ってみます！モチベ上がるので応援コメ、大歓迎です！( ﾟДﾟ)

その次はReply & Push Botかなぁ。
掲示板と連動するBot作りたいなんて声もあったので、そっちも楽しそうだなー(^^♪
何かリクエストがあれば、遠慮なくどうぞー。

ではまた！(^^)/

# 参考にさせていただきましたm(_ _)m

[GoogleAppsScript 公式サイト](https://developers.google.com/apps-script/reference/)
[LINE WORKS Developers](https://developers.worksmobile.com/jp/document?lang=ja)