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

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

More than 1 year has passed since last update.

概要

家の中でどこにしまったのか忘れていまいがちなものを
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))
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
ユーザーは見つかりませんでした