PHPで作るSlackBot(入門編)

#きっかけ
Slack上で特定のメッセージに対して返信してくれる簡易チャットボットを作ったのですが、シンプルなプロトタイプを作れるチュートリアル的な記事がなかったので書いてみました。特にPHPでの他記事は、Laravelというフレームワークでイベントの処理をしているものが多く、壁が高いように感じたので、簡単に作れるものを紹介しようと思います。
#完成品
今回紹介するのは、「サイコロ」と送信するとランダムに数字を返してくれるチャットボットの作り方です。
![slackbot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404588/a72c3d76-e356-9b61-7efb-103a021f929d.gif)
あとで公開申請してみますが、今は自分のワークスペース内でしか動きません。この記事では自分のワークスペースで動くSlackAppの作り方を説明します。
#作り方
作り方の大まかな手順は、①アプリの作成、②アプリの設定、③実装です。必要なものとして、PHPファイルを置いておくサーバーとそれにアクセスするためのURLが必要です。サーバーレスなやり方もあるとは思いますが、少なくとも**PHPファイルを実行するためのURL**が必要です。
##アプリの作成
まず、https://api.slack.com/ にアクセスして、`Start Building`をクリック。すると画面が遷移してアプリの新規作成画面になるので、アプリの名前と導入したいワークスペースを入力。名前は後で変えられるので、軽率に名付けて大丈夫です。
![slackapi_top.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404588/7ea167db-a91f-24d1-fd9e-edd7c83930f5.gif)

##アプリの設定
ここでは新しいSlackアプリのアクセス範囲、イベントAPIの登録をします。ここで早速サーバー上のPHPプログラムをいじることになります。
###ボットのアクセス範囲(Scopes)の設定
`OAuth & Permissions`>`Scopes`>`Bot Token Scopes`に`chat:write` `channels:history` `groups:history`を選んで追加してください。ここでは、チャンネルやグループについてボットの読み取れる範囲を定義しています。なお、Slackでは公開のものを`Channel`、非公開のものを`Group`と呼んで区別しています。
![slackapi_setting.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404588/86e0a49f-7d1f-e4d6-0c6a-826ed994b773.gif)
### イベントAPIの受取先の登録
まず、次のコードをサーバー上に置きます。これは、SlackAPIがPOSTしてきた情報の本体を文字列で受け取って出力するだけのコードです。
「誰かが発言した」などのイベントが起こると、SlackAPIがこのURLに情報を送ってきます。

```php:bot.php
<?php
$json_string = file_get_contents("php://input");
echo $json_string;
?>
```

これをサーバーに置いたら、`Event Subscription`>`Enable Events`をOnにし、`Request URL`にこのPHPファイルへアクセスするためのURLを入力します。`Request URL`の横に<font color="LimeGreen">Verified</font>が現れたら登録完了です。
![slack_event_subscription_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404588/a56254a6-7085-53b9-f4d9-b9a2887b00b5.jpeg)

###イベントの登録
`Event Subscription`>`Subscribe to bot events`に`message:groups` `message:channels`を選んで追加してください。これで、アプリのいるチャンネル/グループで誰かが発言したときに、イベントAPIが発火してPHPファイルが実行されます。
![slack_event_subscription_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404588/70f30094-4ff1-724b-a040-e1a57037183b.jpeg)

### アプリのインストール
最後に、`Install App`からアプリを好きなチャンネルに入れて、設定は完了です。

##アプリの実装
先ほど書いたPHPファイルに追記していく形で、次のように書きます。

```php:bot.php
<?php
#チャンネル内でメッセージがあると発火する
$json_string = file_get_contents("php://input");
echo $json_string;
$json_array = json_decode($json_string, true); #受け取ったJSONを連想配列にする
$message = $json_array["event"]["text"]; #メッセージの内容を取得
$channel = $json_array["event"]["channel"]; #メッセージが送信されたチャンネルのIDを取得

#「サイコロ」ならメッセージを投稿
if ($message == "サイコロ") {
    $url = "https://slack.com/api/chat.postMessage"; #メッセージを送信するAPIのURL
    $data = array(
        "token" => "xoxb-1234567890123-123456789012345-xxxxxxxxxxxxxxxxxxxxxxxx", #Bot User OAuth Access Token
        "channel" => $channel, #メッセージの投稿先
        "text" => mt_rand(1,100) #1~100までの整数をランダムにメッセージとする
    );
    #POSTするためのヘッダーを設定
    $context = array(
        "http" => array(
            "method" => "POST",
            'header' => implode("\r\n", array(
                'Content-Type: application/x-www-form-urlencoded'
            )),
            'content' => http_build_query($data)
        )
    );
    #APIを叩いてメッセージを投稿する
    $html = file_get_contents($url, false, stream_context_create($context));
}
?>
```

`$token`には`OAuth & Permissions`>`Bot User OAuth Token`にある文字列を入力します。
POSTのためのPHPのコードは[PHPでPOST送信まとめ](https://qiita.com/okdyy75/items/d21eb95f01b28f945cc6) を参考にしました。

#まとめ
![slackbot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404588/59a1a915-f01a-9c83-b179-d8a451b2f395.gif)
Laravelなどのフレームワークを使わずに、ただのPHPだけでも単純なSlackBotを作ることができました！PHPを使うとAPIのリクエストを簡単に捌けていいですね。あと今回はシンプルなbotのため、プライベートグループの会話内容もボットが見れてしまいます。当記事を参考にされる場合はscope(アクセス権限)の設定に気をつけてください。

このボットの機能をいろいろ拡張していけば結構なんでもできるはずなので、みなさんも軽率に人工無能、あるいは人工知能をSlackに導入していってください！
今後は「近くのくら寿司が空いてるか教えてくれるSlackBot」の作り方や、SlackAppの公開方法を紹介する記事も書こうと思います。