概要
家の中でどこにしまったのか忘れていまいがちなものを
botにメンションをつけてpostすることで終えてもらえる。
こんなかんじ。
どうして作ったのか
ぼくはあんまり家事をしないので、日常で使うなにがしが
いまいちどこに何があるのか分からないですし教えてもらっても
たまにしか使わないので忘れちゃいます。
あんまり何度も奥さんに聞くのもあれだと思い、
代わりにslackbotに聞くことにしました。
前提
- slackでBOTは使えるようになっている
誰でも簡単にできる!SlackでBotを作る方法
https://techacademy.jp/magazine/10562
- Python 3.6が使える環境にある
準備
slackのBOTのAPIキーを準備する
APIキーが表示されているページを開いておくか
メモ帳とかにコピーしておきます。
pythonのモジュールのslackbotをインストールする
以下の記事の slackbotの初期設定 の項までやります。
PythonのslackbotライブラリでSlackボットを作る
slackbotのメンションの設定をする
上記の記事通りにしているとplugin/my_mention.py があるはずなので
以下の感じに記載をします。
# coding: utf-8
import requests
import json
from slackbot.bot import respond_to
import whereis
import json
@respond_to('どこ')
def mention_whereis(message):
message.react('panda9')#''の中は好きなemojiにしてください。ex)grin とか
message.reply(json.dumps(whereis.whereis_dict,ensure_ascii=False,separators=(',',':'), indent=4))
忘れやすいものの辞書を作る
whereis.pyというファイル名で以下のような辞書を作ります。
キーが物の名前でバリューが物が保管されている場所です。
$ cat whereis.py
whereis_dict = {'雑巾':'洗面台の後ろの棚',
'お茶パック':'シンクの下のでっかい引き出し'
}
準備おわり。
slackbotを起動させる
以下の感じでslackbotを起動させます。
python run.py
これでbotをinviteしたチャンネルでメンションをつけてどこ
と
話しかけると以下のように辞書で返してくれます。
おわり
なぜなに
- どうして探したいものの名前ではなく
どこ
というワードにしたのか。
雑巾はぞうきんかもしれないし、どう登録したのか分からなくなるとめんどくさいので、
どこ
と聞くということさえ覚えていれば良いようにしました。
TIPS
- コンテナにする場合
以下のようなDockerfileにしています。
$ cat Dockerfile
FROM python:3.6.4-jessie
add slackbotdir /slackbotdir
add requirements.txt /slackbotdir
WORKDIR /slackbotdir
RUN pip install -r requirements.txt
CMD ["python", "run.py"]
ちなみにrequirements.txtは以下の感じ。
$ cat requirements.txt
certifi==2017.11.5
chardet==3.0.4
click==6.7
Flask==0.12.2
idna==2.6
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
requests==2.18.4
six==1.11.0
slackbot==0.5.1
slacker==0.9.60
urllib3==1.22
websocket-client==0.46.0
Werkzeug==0.13
- Flaskも使う
slackbotだけでもいいのですが、slackを介さないで情報を取得したりアクションを 促したいパターンもあると思います。たとえばcurlで取得したいとか。
ex)
スケジュールを教えてくれるbotを作ったけどcurlで
そのスケジュールを取得して何かに使いたい。。。とか
たとえばmy_mention.pyを以下のように書きます。
メンション付きでtenkiと話しかけられたら、
flaskが動くコンテナのポート5000の/plz/tenki/tenkiにアクセスする感じです。
@respond_to('tenki')
def mention_tenki(message):
message.react('panda9')
response_text = requests.get('http://flaskwithslackbot_flaskforslackbot_1:5000/plz/tenki/tenki')
message.reply(response_text.text)
アクセスされたflaskは以下の感じでslackbotに天気を返します。
requestsでlivedoorの天気APIから情報をgetしてreturnで結果を返します。
@app.route('/plz/tenki/<tenki>')
def returnTenki(tenki):
tenki = requests.get('http://weather.livedoor.com/forecast/webservice/json/v1?city=016010').json()
kyouno_tenki = json.dumps(tenki['forecasts'][0]['telop'], ensure_ascii=False, indent=4, separators=(',', ': '))
ashitano_tenki = json.dumps(tenki['forecasts'][1]['telop'], ensure_ascii=False, indent=4, separators=(',', ': '))
return ('今日の天気は({kyouno_tenki}), 明日の天気は({ashitano_tenki})'.format(kyouno_tenki=kyouno_tenki,ashitano_tenki=ashitano_tenki))