Help us understand the problem. What is going on with this article?

slackbotを中継につかって、bottleからjsonの形式でslackに返す。

More than 1 year has passed since last update.

概要

slackで作成したbotにメンションつけて指定の文言で話しかけると
軽量webフレームワークのbottleから話しかけられた文言に紐づいた
情報を返す。返された情報はslackに投稿される。
また、bottleにhttpでアクセスしても同様の情報を取得できるので、
必ずslackを介さなくてもOK。

結果イメージ

イメージその1 アルファベットに応じたJSONを返す。

sample.png

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を使ってイメージを作る

  1. BotsのAPItokenを記載したファイルを作成する。
    cloneした中のslackbot_bottleというフォルダの中の、
    slackbotというフォルダにAPITOKEN.pyというファイルを作る。
    vi APITOKEN.py
    以下のフォーマットでBotsのAPItokenを記載する。
    APIAPI = "APIトークン"
    例)APIAPI = "apitoookennnn"

  2. slackbotが動くコンテナのイメージを作る
    cloneした中のslackbot_bottleというフォルダの中の、slackbotというフォルダの中に、
    build_slackbot_Dockerfile というDockerfieがあるので、
    該当ファイルがあるディレクトリに移動して、以下のようなbuildコマンドで実行する。

    sudo docker build -t slackbot:centos7 build_slackbot_Dockerfile .

    これでimageが出来上がります。以下のコマンドを実行するとイメージができていることを確認できます。

    sudo docker images
      

  3. bottleを動かすコンテナのイメージを作る
    cloneした中のslackbot_bottleというフォルダの中の、bottleというフォルダの中に、
    build_bottle_Dockerfile というDockerfieがあるので、
    該当ファイルがあるディレクトリに移動して、以下のようなbuildコマンドで実行する。

    sudo docker build -t slackbot:centos7 build_bottle_Dockerfile .

    これでimageが出来上がります。以下のコマンドを実行するとイメージができていることを確認できます。

    sudo docker images

イメージからコンテナを起動させる

  1. slackbotのイメージからコンテナを起動させる。
    以下のコマンドで起動する。
    sudo docker run -d --name slackbot slackbot:centos7
  2. 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)まで進めてください。 すごく分かりやすいです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした