- tl;dr
- 参考
- 下調べ
— Real Time Messaging API
— Python で slack ボット - 出来たもの
— github
— ひとまず - 使い方
— 準備
— 設定(setting.toml)
— 実行
— 天気
— 遅延 - 以上
- (memo)python-slackclient で RTM API
— slackへの接続
— 各channel を読み取る
tl;dr
短い冬休みを利用して Python で slack ボットを作ってみることにした。(もう、冬休みは終わったけど)
参考
www.fullstackpython.com
上記のサイトをほぼ写経しただけです。
下調べ
Real Time Messaging API
今まで Incoming Webhooks で Slack にアラートを通知したり、RSS インテグレーションは触ったことあったけど、ボットを育てていくにあたっては Real Time Messaging API を利用する必要があるとのことです。
Websocket ベースの Real Time Messaging API(以降 RTM API) を利用することで、手元の端末からでもメッセージの送受信がリアルタイムで行うことが出来るようになり、ボットを手軽に作成し、運用出来るようになるようです。
Python で slack ボット
Python で slack ボットを育てるには以下のようなモジュールを使うと良さそうです。
- https://github.com/lins05/slackbot
- https://github.com/slackhq/python-rtmbot
- https://github.com/slackapi/python-slackclient
slackbot と python-rtmbot ちゃんと触っていないので、詳しいことは割愛しますが、Slack API コールや Websocket 周りをうまーくラップしているようで、ボットにさせたいアクションをプラグインとして組み込むような実装になっているようです(プラグインのみの実装に注力すれば良いというのが良いですな)が、今回は python-slackclient を使って RTM API を意識しながらボットを作ってみたいと思います。
出来たもの
github
github.com
ひとまず
- 電車遅延
- 天気
を教えてくれるボット、名付けて pikapika ボット。
使い方
準備
pip install -r requirements.txt
設定(setting.toml)
slack の API トークンやボットの ID を設定する。
[common] interval = 1 example_command = '教えて' [slack] api_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' bot_id = 'XXXXXXXXXXX' [get_weather] uri = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=400010' [train_delay] uri = 'http://api.tetsudo.com/traffic/atom.xml?qshu'
bot_id については、以下のように Python スクリプトを実行して確認する。
python print_bot_id.py ${bot_name}
bot_id は以下の xxxxxxxxx のように出力される。
Bot ID for '${bot_name}' is xxxxxxxxx
実行
$ python pika.py 2017-01-04 23:27:34,948 DEBUG Starting new HTTPS connection (1): slack.com 2017-01-04 23:27:35,292 DEBUG https://slack.com:443 "POST /api/rtm.start HTTP/1.1" 200 5147 2017-01-04 23:27:36,126 INFO bot を開始しました...
天気
@pika 教えて 天気
うーん。
遅延
@pika 教えて 遅延
まあ、こんなものかな…
以上
天気とか遅延だけでは面白くないので、この pikapika ボットを色々と育てていきたいと考えています。
(memo) python-slackclient で RTM API
slack への接続
slack_client = SlackClient('api_token') slack_client.rtm_connect()
各 channel を読み取る
slack_client.rtm_read()