Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

RaspberryPiをSlackのBOTにしてみた

RaspberryPiにPHPでSlackのBOTを作ってみた

一部で流行っているチャットツールSlackってのがあります。
チャットワーク等のツールと同類のものですが、他のクラウドサービスとの親和性とか使いやすいインターフェイスとか色んな所で褒められているツールらしいです。

私も試しに使っています。
たしかに分かりやすい。
基本英語ですが、中学英語の記憶をたよりに雰囲気でなんとかなっています。

このSlackには、他のWebサービスクラウドサービスと連携を取るためのAPIが多数用意されていて、その中の一つを使ってBOTを作ろうと試みます。
BOTはRaspberryPiに仕込みます。
なぜわざわざRaspberryPiに仕込むのかと言いますと。

(*´∀`)ノ「電気つけて!温度は?湿度は?」

などと話しかけることにより、BOT(RapsberryPi)が接続されているセンサーの値やら家電の電源制御やらをやってくれるって話です。
※センサー値取得及び荷電制御は後日掲載予定

前提条件
  • RapsberryPiがインターネット上に公開されていること
  • RaspberryPiでWebサーバーが動作/起動されていること
  • RaspberryPiでPHP5が動作していること
  • Slackのアカウントを持っていること
  • PHPのコードの書き方について自分で調べられるか知っていること

<<目次>>

  • PHPファイルを作成
  • RaspberryPiにPHPコードを配置
  • OutgoingWebHooksをSlackに導入する
  • 実際にメッセージをSlackで投稿してみる
  • 話しかけるユーザーによって動作を変化させる

PHPファイルを作成

何も考えず、このファイルを用意する。
ファイル名は、test.phpとか好きなのを適当に。

<?php
echo '{"text":"はろー!"}';  
?>

RaspberryPiにPHPコードを配置

RaspberryPiに上記で作成したphpファイルを配置する。
配置するのは、WebサーバーのDocumentRootに。

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.'"}';  

ってコード書いて調べてみました。


優良アダルトサイト紹介の最終形態!!MaxInfo