トーク Bot  とのトークルームをたくさん作る


LINEWORKS Advent Calendar 2019 の 5日目を担当させていただきます！
どうぞよろしくおねがいしますm(_　_)m

最近見つけた、ちょっとした小ネタを紹介しますね～。

# トーク Bot  とのトークルームをたくさん作る

タイトルの通りなのですが、トーク Bot とのトークルームをたくさん作ります。
つまり、こんな感じ。
![1574306918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/e4f8506c-e92e-d5f3-ab60-73c5ee03066e.png)
仕組みとしては単純です。
１：１トークルームではなくて、Bot と２人きりの１：N トークルームを作っているだけです。
なので、この方法を使うときは DeveloperConsole で Bot の Bot ポリシーの「複数人のトークルームに招待可」に必ずチェックを入れておいてくださいね(*'▽')

## Bot とのトークルームの作り方

トークルームの作り方はみなさんご存じだと思いますので、さささっと説明しちゃいますが、
トーク画面の左上の追加ボタンを押すと Bot を招待することができます。

![1574300569.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/9094acc4-d23c-27aa-0c42-b8fb225234be.png)

このとき、Bot を１つしか選ばないと１：１のトークルームになってしまうので、別の Bot も一緒に招待します。
それで、１：N のトークルームが出来上がったらいらない方の Bot をトークルームから退出させます！
![1574311849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/93ab2f38-8c68-2a95-b10d-29a4dce2bc2d.png)
![1574312222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/81a1a5d5-9e8a-05d1-82bb-8d9f64ba8a7b.png)

('Д')ﾄﾞｲﾋｰ

そうすると Bot 二人きりのトークルームになるので、これを繰り返すと Bot とのトークルームをたくさん作ることができます。

（　＾ω＾）・・・うん、めんどくさいですね！

## API を使って、Bot とのトークルームをたくさん作る

面倒なことは自動でやれるようにすればいいのです。
[Bot を含むトークルーム作成 API](https://developers.worksmobile.com/jp/document/1005022?lang=ja) と [メッセージ送信 API](https://developers.worksmobile.com/jp/document/100500801?lang=ja) を駆使して一気に作っちゃいましょう！(^^)/

node.js でのコードになります。
あらかじめ `request-promise` モジュールをインストールしておいてくださいませ。

```
> npm install request-promise
```

API ID などの Key はご自身のものを入力してください。

```makeManyTalkRooms.js
const request = require("request-promise");

const apiId = "API ID";
const botNo = "部屋をいっぱい作りたい Bot の botNo";
const headers = {
    Authorization: "Bearer " + "Token",
    consumerKey: "consumerKey",
    "Content-Type": "application/json"
};
const url = "https://apis.worksmobile.com/r/" + apiId + "/message/v1/bot/" + botNo;
const titles = [ "room A", "room B", "room C", "room D", "room E"];

titles.forEach((title) => {
    let options = {
        url: url + "/room",
        headers: headers,
        json: {
            accountIds: [ "accountId" ],
            title: title
        }
    };
    request.post(options).then((body) => {
        let options = {
            url: url + "/message/push",
            headers: headers,
            json: {
                roomId: body.roomId,
                content: { type: "text", text: "To " + title }
            }
        };
        request.post(options).catch((error) => { throw new Error(error) }); 
    }).catch((error) => { throw new Error(error) });
});
```

トークルーム名は 11 行目の `titles` に格納されています。
`titles` の要素を増やせばいくらでもトークルームを作ることが可能です！ヾ(*´∀｀*)ﾉ

# トークルームをたくさん作ることによってできること

言っておいてなんなのですが、あまり思いつきませんね。。。
ルームを分けるということは、処理によって対応を分ける必要があるということだと思うのですけど、それなら Bot を複数作った方がわかりやすいですよね。
Bot の利用範囲の制限もできるし、メンバーのメンテナンスも LINEWORKS のメンバー管理と紐づけられるし。

ひとつだけ思いついたのは、外部ユーザへの問い合わせ対応的なものでしょうか？
外部ユーザとのトークルームには LINEWORKS Bot を招待できないので。
例えば、LINE 公式アカウントにトークすると担当者の LINEWORKS に専用トークルームが作られて、そこへトークされる。
そのトークルームに担当者が返事を書くと、LINE 公式アカウントが LINE ユーザに返事をする。
みたいな？

![1574321110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/325439f0-bfd7-082d-3393-2409d56586bd.png)

- LINE ユーザは LINE 公式アカウントへ話しかける
- LINE 公式アカウントへのトーク内容を LINEWORKS Bot が LINEWROKS 担当者へトークする
- そのとき、個別のトークルームにトークする（例：ユーザ A のトークはルーム A に送信）
- LINE の userId と LINEWORKS の roomId を紐づかせて保持しておく
- 個別のトークルームでのトークは紐づいた LINE ユーザへ送信される（例：ルーム A のトークはユーザ A に送信）

メリットとしては、担当者の匿名性が保てることでしょうか。
あとは、担当者が複数居た場合に、誰が返事をしても公式アカウントからの返答になることですかね。

んー、どんなシチュエーションですかね。
この仕組みでサービスとして実現できたら、ぜひ教えてくださいm(_　_)m

#おわりに
ここまでお付き合いいただきありがとうございました。

そして、LINEWORKS Advent Calendar 2019 の 5日目として参加させていただきありがとうございました。

Advent Calendar の後半、まだ空いてるから今回の仕組み、作ってみようかな～。
間に合わないから無理かな～( ﾟДﾟ)

ではまた！(^^)/

#参考にさせていただきましたm(_ _)m
[LINEWORKS Developers](https://developers.worksmobile.com/jp/document?lang=ja)