RaspberryPiにPHPでSlackのBOTを作ってみた
一部で流行っているチャットツールのSlackってのがあります。
チャットワーク等のツールと同類のものですが、他のクラウドサービスとの親和性とか使いやすいインターフェイスとか色んな所で褒められているツールらしいです。
私も試しに使っています。
たしかに分かりやすい。
基本英語ですが、中学英語の記憶をたよりに雰囲気でなんとかなっています。
このSlackには、他のWebサービスやクラウドサービスと連携を取るためのAPIが多数用意されていて、その中の一つを使ってBOTを作ろうと試みます。
BOTはRaspberryPiに仕込みます。
なぜわざわざRaspberryPiに仕込むのかと言いますと。
(*´∀`)ノ「電気つけて!温度は?湿度は?」
などと話しかけることにより、BOT(RapsberryPi)が接続されているセンサーの値やら家電の電源制御やらをやってくれるって話です。
※センサー値取得及び荷電制御は後日掲載予定
前提条件
- RapsberryPiがインターネット上に公開されていること
- RaspberryPiでWebサーバーが動作/起動されていること
- RaspberryPiでPHP5が動作していること
- Slackのアカウントを持っていること
- PHPのコードの書き方について自分で調べられるか知っていること
OutgoingWebHooksをSlackに導入する
導入ページにアクセスし、「Outgoing WebHooks」を選択。
指示に従って設定するだけです。
- Channel → TriggerWords(打ち込んだ単語)を拾うチャンネルを指定。
- TriggerWords → 反応させたい単語を登録。複数登録するときはカンマ区切りで(「hello」とか「オン」とかの単語)
- URL → RaspberryPiに配置したphpファイルを指定(例: http://www.foo.bar/test.php)
- Token → 変更しない
- DescriptiveLabel → 空欄でもいい
- CustmizeName → 好きなのに変える
- CustomizeIcon → 変えたい場合は適当に変える(雰囲気出るので変えるのをオススメ)
設定できたら、「Save Settings」ボタンをクリック!!
実際にメッセージをSlackで投稿してみる
Outgoing WebHooksの設定にある「Channel」で指定したチャンネルにメッセージを投稿します。
投稿する文字列の中に、TriggerWordsで指定した単語を混ぜて投稿すると
はろー!
が返ってくるはずです。
話しかけるユーザーによって動作を変化させる
APIの説明はここにあります。(英語)
$_POSTで受け取れる情報の中に、「user_id」、「user_name」の項目があるので、メッセージを投稿した人を識別して処理を行うことができそう。
こんな感じのソースで判別できました。
このサンプルでは、「hello」と「world」ってTriggerWordsを指定していると仮定しています。
<?php $token = $_POST['token']; $team_id = $_POST['team_id']; $channel_id = $_POST['channel_id']; $timestamp = $_POST['timestamp']; $user_id = $_POST['user_id']; $user_name = $_POST['user_name']; $text = $_POST['text']; $trigger_word = $_POST['trigger_word']; if (strcmp($user_id,'ここに反応させたいユーザーのIDを記述') == 0) { if(preg_match('/hello/',$text)) { echo '{"text":"はろーだぜ!"}'; }else{ if (preg_match('/world/',$text)) { echo '{"text":"わーるどだぜ!"}'; } } } else { echo '{"text":"お前の話はつまらん!!"}'; } ?>
user_idってどうやって調べる??
って所ですが、Slackの画面上の何処に記載されているのかわからなかったので
$user_id = $_POST['user_id']; echo '{"text":"user_id = '.$user_id.'"}';
ってコード書いて調べてみました。