LoginSignup
3
4

More than 5 years have passed since last update.

家の中でどこにしまったのか忘れやすいものをbotに教えてもらう(奥さんに怒られなくなる)

Last updated at Posted at 2018-01-01

概要

家の中でどこにしまったのか忘れていまいがちなものを
botにメンションをつけてpostすることで終えてもらえる。
こんなかんじ。
slackbot.jpg

どうして作ったのか

ぼくはあんまり家事をしないので、日常で使うなにがしが
いまいちどこに何があるのか分からないですし教えてもらっても
たまにしか使わないので忘れちゃいます。
あんまり何度も奥さんに聞くのもあれだと思い、
代わりにslackbotに聞くことにしました。

前提

準備

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))
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4