SlackにBot Userを追加する

## 背景
Qwiklabsの「[Dialogflow で AI チャットボットを実装する](https://www.qwiklabs.com/focuses/634?locale=ja)」を実施し、課題をクリアしてChatbotデモができるようになったのですが、1時間だけ環境を借りて実施するのでは勿体無いので、自分のアカウントで実施してみました。さらに、他のサービスとのインテグレーションとしてSlackにチャットボットを載せるところまでやってみようと考えました。

ところが、参考にした「[Slack | Dialogflow のドキュメント](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja)」の通りにはいかなかったところがありました。ここではその違いをまとめます。

## ポイント

* [Bot Users] > [Add a Bot User]はない。代わりに、アプリにbot token をつける。
* 作成したアプリとは別に Dialogflow Bot というボットができていて、こちらと会話するとうまくいく。

## 作成手順

### Slackアプリを作成する ([リンク](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#create_a_slack_app))

ここは基本的に同じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/fd139b93-89aa-8d1c-b3d8-8b637c2b00ac.png)
もともと"HelpDesk" という名前で作ったが、ステップを再現するために新たに "HelpAgent" という新しい名前をつけています。

### ボットユーザーを追加する ([リンク](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#add_a_bot_user))

"左側のメニューで [Bot Users] をクリックします。" とあるが、この [Bot Users] というのがない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/9d1b637c-3dd4-4eb6-1b81-651bd50cc772.png)
そのかわりに "Where's Bot User" というのがあるので、これをクリックすると、次のようなダイアログが出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/b0be3117-7093-f1a7-fbda-9f0704e6d4f0.png)

App Homeに行ってみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/324ffd5e-a1b1-de13-28c0-863be889f8bc.png)
2番目のブロックに、「bot token にスコープをアサインせよ」とある。

ここで [Review Scopes to Add] をクリックすると、[OAuth & Permissions] のセクションにいく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/8eced393-8d5b-e325-7a6a-5614613f37fc.png)
ここから先は、元の文書「[OAuth URL を追加する](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#add_oauth_url)」 と同じになる。
1. Dialogflow の Slack 設定ページから、[OAuth URL] の値をコピーする。
2. [Add a new Redirect URL] ボタンをクリックし、コピーした OAuth URL を貼り付ける。
3. [Add] をクリックする。

まだスコープをつけるということをやっていないので、このページの下の方の [Scope] のところで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/c6d4b6e5-b7f8-74cf-520e-e94ba15e86a9.png)
"Add permission by Scope or API method..." から、とりあえずはapp_mentions:readを選んだ。残りはあとで追加されることになる。

* app_mentions:read アプリがいる会話の中で @helpdesk を直接メンションするメッセージを読むことができる
* channels:history Helpdesk が追加されているパブリックチャネルでメッセージや他のコンテントをみることができる
* groups:history Helpdesk が追加されているプライベートチャネルでメッセージや他のコンテントをみることができる
* im:history Helpdesk が追加されているダイレクトメッセージでメッセージや他のコンテントをみることができる
* im:read Helpdesk が追加されているダイレクトメッセージの基本情報をみることができる

ここではじめて、Redirect URLの "Save URLs" が有効になっている。"Save URLs" をクリックする。

Dialogflowの設定がまだだった。もとの文書にあるステップに戻る。

### Slack を Dialogflow にリンクする ([リンク](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#link_slack_to_dialogflow))

1. Dialogflow の左側のメニューで [Integrations] に移動する。
2. [Slack] タイルをクリックする。
3. 次のフィールドに関連する値を入力する。
 + クライアント ID (Slack Client ID)
 + クライアント シークレット (Slack Client Secret)
 + 検証トークン (Slack Verification Token)
4. [Start] ボタンをクリックする。

### OAuth URL を追加する ([リンク](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#add_oauth_url))
ここはすでに行なっていた。

### イベント リクエスト URL を追加する ([リンク](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#add_event_request_url))

1. Dialogflow の Slack 設定ページから、[Event Request URL] の値をコピーする。
2. Slack のデベロッパー コンソールで、左側のメニューで [Event Subscriptions] をクリックする。
3. スイッチをクリックし、イベントのサブスクリプション URL をリクエスト URL フィールドに貼り付ける。

リクエスト URL の欄の上に緑色の「確認済み」 (チェックマーク) が表示される。

### イベント サブスクリプションを有効にする ([リンク](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#enable_event_subscriptions))

1. 左側のメニューで [Event Subscriptions] をクリック。
2. スイッチをクリックしてオプションを有効にする。
3. [Subscribe to Bot Events] で、[Add Bot User Event] ボタンをクリック。次のイベントを追加する。

| Event Name | Description | Required Scope |
| ---- | ---- | ---- |
| im_created | A DM was created （DM が作成された)| im:read |
| message.channels | A message was posted to a channel  (メッセージがチャンネルに投稿された） | channels:history |
| message.groups | A message was posted to a private channel (メッセージがプライベート チャンネルに投稿された)| groups:history |
| message.im | A message was posted in a direct message channel (メッセージがダイレクト メッセージ チャンネルに投稿されました)| im:history |

右側のカラムの "Required Scope" は自動的に追加されたもの。

イベントを追加したら、最後に画面の下部にある [Save Changes] ボタンをクリックする。

### Slack ボットをチームに追加する([リンク](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#add_your_slack_bot_to_a_team))

1. Slack のデベロッパー コンソールで、左側のメニューにある [Manage Distribution] をクリック。
2. [Share Your App with Your Team] セクションで、[Add to Slack] ボタンをクリック。
3. 次に表示されるページで [Authorize] ボタンをクリックして、エージェントを追加。

次のページは「Bot connection success」とのみ書かれたプレーンなページである。

### テスト ([リンク](https://cloud.google.com/dialogflow/docs/integrations/slack?hl=ja#add_your_slack_bot_to_a_team))

これで成功したはずだが、[Test In Slack] ボタンが出てこない。

SlackにはサイドバーのAppを選ぶと次のように出て、アプリ自体は登録されていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/54aabaf8-986d-7cab-83b3-4409b4aca247.png)

ここでHelpdeskを選択するとHelpdeskのページにいくのだが、「作業がまだ進行中です」と出る。
![wait.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/881531b6-c413-9ad4-ad27-cbc7e524d83e.jpeg)

この @helpdesk にDMで話しかけても、なんの反応もない。

### ここで Dialogflow Bot の登場 

そこで寝てしまったのだが、起きてもう一度見ると、メッセージの送り先に"Dialogflow Bot" というのが現れている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/7bd7dcdb-bda6-9c69-9fe8-7887476793a0.png)

この人に "Hello" とメッセージを送ってみたら、その後会話が続いた。![imgo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/64979c34-52e3-a889-6646-cad02b4a9c87.jpeg)

## 結論

というわけで、思った通りではありませんでした、作成したアプリとは別に Dialogflow Bot というボットができていて、こちらと会話するとうまくいくという形で、なんとか動きました。

しかし、次に別のBotを加える場合、Dialogflow Botにかわるものができるでしょうか。名前はどうなるでしょうか。もし同じ名前でできたりしたら、このHelpdeskのアプリが呼びさせなくなるかもしれません。またおなじことをすれば復活できるのですが、ちょっとためらいますね。