slackチャンネルで発言した内容をリアルタイムで取得する方法

slackチャンネルで発言した内容をリアルタイムで取得する方法です。

slackのAPIには以下の3種類があります。
・Web API
・Events API
・RTM API
それぞれの詳細な説明は[こちら](https://api.slack.com/lang/ja-jp/which-api)

今回は「Events API」を使用します。
Events APIの使用例としては

> https://api.slack.com/lang/ja-jp/which-api
>>
・ユーザーがメッセージの投稿、チャンネルの作成や変更、ファイルの追加や変更を行った場合にイベントを受信する
・ユーザーがチャンネルにピン、スター、絵文字リアクションを追加したときに、イベントを受信する
・状態をほぼリアルタイムで保持

などに使えるようです。


今回は「slackチャンネルで発言した内容をリアルタイムで取得する」ので、この内容でOK.


#Botアプリの作成
まずは、[ここ](https://api.slack.com/apps)にアクセスして、

1. 右上のCreate New App
2. ポップアップが出てくるので、「App Name」と「Development Slack Workspace」を指定
4. Create App

以下のような画面に行けばOK(画像は、newappという名前でBotを作成しています)

<img width="1108" alt="hige.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/540addb6-56cb-a45b-608c-8a12186cfa68.png">

#Botアプリの設定
先ほどの画像の左側(Settings,Featuresなど)がBotに関する設定の場所です。

ここで、Tokenやイベントなどを設定していきます。

##slackの発言を送信する宛先URLの指定

まずは、「Event Subscriptions」にいき、

<img width="1052" alt="スクリーンショット 2019-06-26 11.39.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/4fee8de6-6723-f982-ab9f-b9a3aaf06b3a.png">

offになっているボタンを押してonにしてください。
そうすると、「Request URL」を入力する欄に、エンドポイントを入力するんですが、このエンドポイントが正しいものか確認するために、URLが入力された瞬間に、そのURLあてにリクエストが送られます。

その内容を返却することで、「このエンドポイントは正しいもの」という風に認識されます。

例えばPHPならエンドポイントに以下のようなスクリプトを用意してあげれば大丈夫です。

```php:index.php
<?php
#file_get_contents('php://input');で送られてきた内容を取得し、echoでそのまま返している
echo file_get_contents('php://input');
```


以下のようになればOKです。

<img width="721" alt="スクリーンショット 2019-06-26 11.47.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/f7c7b4cf-09fc-e0ac-bea8-4f176d6b9397.png">


##Botが発言を取得する範囲の指定

先ほどの画面の下に行くと、以下の場所があります。

<img width="745" alt="スクリーンショット 2019-06-26 11.52.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/d1e1fa93-850d-d933-9c6c-288375cea5b6.png">



ここで、BotのEvents(今回でいう「発言をリアルタイムで取得する」のようなこと)を
「ワークスペース全体」に適応するのか、「Botが招待されたチャンネルだけ」に適応するのか決めます。


今回は「Botが招待されたチャンネルだけ」に適応するので、「Subscribe to Bot Events」の方を設定していきます。

##Botuserの追加
「Subscribe to Bot Events」にある、「Add a bot user」をクリックして、bot userを追加します。
ここでは表示名を設定するようです。入力したら「Add Bot User」をクリック

<img width="821" alt="スクリーンショット 2019-06-26 11.56.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/dce41551-989d-3124-fe61-e1a92f9e1492.png">


そうして、もう一度「Event Subscriptions」に行き、以下のようになっていることを確認してください。

<img width="721" alt="スクリーンショット 2019-06-26 11.59.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/d3c532d2-bbe4-3288-3054-ce735a9f40ee.png">

##イベントの追加

先ほどの画面で「Add Bot User Event」でBotができるイベントを設定していきます。
今回は

・「(Botが招待された)パブリックチャンネルに送られたメッセージを検知」
・「(Botが招待された)プライベートチャンネルに送られたメッセージを検知」

というように設定しました。

<img width="779" alt="スクリーンショット 2019-06-26 12.02.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/fec49ac1-8468-3182-4010-3774c4f273b4.png">

他にも色々あるので、興味のある方は見てみてください。

##ワークスペース内のチャンネルにBotを招待できるようにする
「OAuth & Permissions」にいき、「Install App to Workspace」をして、ワークスペース内のチャンネルにBotを招待できるようにします。

<img width="761" alt="スクリーンショット 2019-06-26 12.07.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/b9eb87eb-987a-188e-231f-089fe4a30add.png">

##チャンネルでBotを招待する
Botをインストールしたいチャンネルにいき、右上の設定マーク（?）を押して,「アプリを追加」から、先ほど作成したアプリを追加します。

<img width="646" alt="スクリーンショット 2019-06-26 12.09.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/174748e1-8634-72cd-a54d-967f19c9634c.png">


以上で、設定は完了です。


#確認する

試しに、以下のようなスクリプトを用意し、リアルタイムで送られいる内容を取得できているか監視してみましょう。

```php:index.php
<?php
error_log(file_get_contents('php://input'),3,"/var/log/debug.log");
```

以下のコマンドで、
/var/log/debug.logをリアルタイムで表示して確認してみてください。

```shell
$ tail -f /var/log/debug.log
```