ようへいの日々精進XP

よかろうもん

短い冬休みに Python で slack ボットを作るぞ(1)

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 ボットを育てるには以下のようなモジュールを使うと良さそうです。

slackbot と python-rtmbot ちゃんと触っていないので、詳しいことは割愛しますが、Slack API コールや Websocket 周りをうまーくラップしているようで、ボットにさせたいアクションをプラグインとして組み込むような実装になっているようです(プラグインのみの実装に注力すれば良いというのが良いですな)が、今回は python-slackclient を使って RTM API を意識しながらボットを作ってみたいと思います。

出来たもの

github

github.com

ひとまず

f:id:inokara:20170104224918p:plain

  • 電車遅延
  • 天気

を教えてくれるボット、名付けて 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 教えて 天気

f:id:inokara:20170105095555p:plain

うーん。

遅延

@pika 教えて 遅延

f:id:inokara:20170105095606p:plain

まあ、こんなものかな...

以上

天気とか遅延だけでは面白くないので、この pikapika ボットを色々と育てていきたいと考えています。

(memo) python-slackclient で RTM API

slack への接続

slack_client = SlackClient('api_token')
slack_client.rtm_connect()

各 channel を読み取る

slack_client.rtm_read()