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

#概要
家の中でどこにしまったのか忘れていまいがちなものを
botにメンションをつけてpostすることで終えてもらえる。
こんなかんじ。
![slackbot.jpg](https://qiita-image-store.s3.amazonaws.com/0/86853/ad23db21-593a-8209-c5b2-9fd2c6fdbb47.jpeg)

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

#前提
- slackでBOTは使えるようになっている  
誰でも簡単にできる！SlackでBotを作る方法  
https://techacademy.jp/magazine/10562  
- Python 3.6が使える環境にある

#準備
##slackのBOTのAPIキーを準備する
APIキーが表示されているページを開いておくか
メモ帳とかにコピーしておきます。

##pythonのモジュールのslackbotをインストールする　　
以下の記事の　**slackbotの初期設定**　の項までやります。　　
[PythonのslackbotライブラリでSlackボットを作る](https://qiita.com/sukesuke/items/1ac92251def87357fdf6#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%95%E3%81%9B%E3%81%A6%E3%81%84%E3%81%9F%E3%81%A0%E3%81%84%E3%81%9F%E3%83%9A%E3%83%BC%E3%82%B8)

##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))
```