概要
slackで作成したbotにメンションつけて指定の文言で話しかけると
軽量webフレームワークのbottleから話しかけられた文言に紐づいた
情報を返す。返された情報はslackに投稿される。
また、bottleにhttpでアクセスしても同様の情報を取得できるので、
必ずslackを介さなくてもOK。
結果イメージ
イメージその1 アルファベットに応じたJSONを返す。
magi_caspにメンションつけて話しかけると、
JSONで情報を返してくれる。
この例では I love [A|B|C|D|E|F|G|H]という条件で
I love の後にA~Hのアルファベットを入力すると、
アルファベットに応じたJSONを返してくれる。
イメージその2 天気を返す
magi_caspにメンションで tenki
と話しかけると、
当日と翌日の天気を返してくれる。
これが良い方法なのかについて
分かりません。dockerを少し覚えて、bottleとslackbotを勉強中に
こういう使い方もできるのではと思いついてやりました。
前提
- dockerを使うのでdockerをホストするサーバがいります。
ホストOSはcentos7です。 - コンテナは2ついります。
- slackbotを動かすコンテナ
- bottleを動かすコンテナ
- さくらのクラウドで作ってます。
石狩リージョンで1core 1GBで1時間7円のプランです。 - dockerが動くサーバは準備済みとします。
- slackへのBotsのIntegrationの追加は済んでいる。
準備
cloneする。
以下のコマンドを実行して筆者が作成したgitリポジトリをcloneします。
git clonehttps://github.com/tomokitamaki/slackbotWithbottle.git
Dockerfileを使ってイメージを作る
BotsのAPItokenを記載したファイルを作成する。
cloneした中のslackbot_bottleというフォルダの中の、
slackbotというフォルダにAPITOKEN.pyというファイルを作る。
vi APITOKEN.py
以下のフォーマットでBotsのAPItokenを記載する。
APIAPI = "APIトークン"
例)APIAPI = "apitoookennnn"
slackbotが動くコンテナのイメージを作る
cloneした中のslackbot_bottleというフォルダの中の、slackbotというフォルダの中に、
build_slackbot_Dockerfile
というDockerfieがあるので、
該当ファイルがあるディレクトリに移動して、以下のようなbuildコマンドで実行する。
sudo docker build -t slackbot:centos7 build_slackbot_Dockerfile .
これでimageが出来上がります。以下のコマンドを実行するとイメージができていることを確認できます。
sudo docker images
bottleを動かすコンテナのイメージを作る
cloneした中のslackbot_bottleというフォルダの中の、bottleというフォルダの中に、
build_bottle_Dockerfile
というDockerfieがあるので、
該当ファイルがあるディレクトリに移動して、以下のようなbuildコマンドで実行する。
sudo docker build -t slackbot:centos7 build_bottle_Dockerfile .
これでimageが出来上がります。以下のコマンドを実行するとイメージができていることを確認できます。
sudo docker images
イメージからコンテナを起動させる
- slackbotのイメージからコンテナを起動させる。
以下のコマンドで起動する。
sudo docker run -d --name slackbot slackbot:centos7
- bottleのイメージからコンテナを起動させる。
以下のコマンドで起動する。
sudo docker run -d -p 3333:80 --name bottle bottle:centos7
bottleはport80で待ち受けているのでホストOSのprt3333宛ての通信をコンテナのport80に繋げます。
Botにメンションしてみる。
Botにメンションをつけて tenki と話しかけると、
今日の天気は("曇り"), 明日の天気は("晴時々曇")
と返って来ればOK。
ブラウザで見てみる
http://サーバのIP:3333/tenki/tenki
でアクセスして
今日の天気は("曇り"), 明日の天気は("晴時々曇")
と返ってくるとバッチリ。
おわり
ここまで行うと天気や、単語とアルファベットを紐付けたJSONを返してくれる、
BOTとそれと連携するbottleが使えるようになります。
以下のREADMEもぜひご覧ください。
https://github.com/tomokitamaki/slackbotWithbottle
発展
pluginsフォルダ内のファイルに追記をすれば、返信のバリエーションが増やせますし、
hello_world.py内にpythonのコードを書けばもう少し複雑なこともできます。
TIPS
- 【つまづき】slackbotのコンテナからbottleのコンテナに通信できないとき。
pluginsフォルダにあるbotのメンションを定義しているファイル内に記載をした、
URLがホストOSのグローバルのIP:ポート番号(ex:http://サーバのIP:3333)だとうまくいかなかったので、 IPをホストのグローバルIPではなくてコンテナのローカルIPにするとうまくいきました。 - bottleのインストール方法
http://tech.aainc.co.jp/archives/9826 の2. Bottleのインストールの項 からページの最後まで進めてください。 - slackbotのインストール方法
http://blog.bitmeister.jp/?p=3892 の Slack Bot環境の構築 の項からPythonでSlackbotを作る(2)まで進めてください。 すごく分かりやすいです。