Monthly Hacker's Blog

毎月のテーマに沿ったプログラミング記事を中心に書きます。

Pythonを使ってSlack Botを作成してみた

Duramenteです。
今月のテーマがBotということで、ここ最近使い始めたSlackで動くBotを作成しました。

この記事では、

  • Slack Botの作成方法
  • Bot作成でつまづいた部分
  • 簡単な機能実装例

を紹介します。

参考サイト

Slack BotでGoogle検索するとbotkitで作ってみたというブログなどが多かったため、以下のサイトを参考にbotkitで作成したりもしたのですが、JavaScriptにあまり慣れていないため途中で断念しました。

http://toach.click/slack-botkit/

どうしようかと思っているときに、Pythonで作成してみたという以下のブログを発見したので、参考にさせていただきました。

PythonでSlackbotを作る(1) | ビットログ

Slack Botの作成

先ほどのブログを参考に、
・Slack Botアカウントの作成
・Pythonライブラリのインストール
・botの起動
の順で進めてSlack Botを起動することができました。

しかし、この後プラグインスクリプトの作成を行なうのですが、ここで少しつまづいてしまいました。プラグインスクリプトの内容がBotに反映されないのです。

f:id:Duramente:20160806103927p:plain

default_replyに記述した反応になってしまいます。

どうやらslackbot_settings.pyにプラグインに関する設定を記述しないといけないようで、以下のコードを追加することで解決しました。

PLUGINS = [
	'plugins'
]

f:id:Duramente:20160806103940p:plain

ちゃんと反応してくれました。

天気情報を出力させる

プラグインの問題が解決したので、ここからBotに機能を追加していきます。
今回は、Botへ「天気」とメッセージを送ると天気情報を返信してくれる機能を追加したいと思います。

天気の情報取得には以下のAPIを用いています。

weather.livedoor.com

json形式でデータを返してくれるので、そこから必要な情報を取得し、Botが教えてくれるようにします。

以下のコードをrespond.pyに追加することで機能が追加できます。

@respond_to('天気')
def weather(message):
	import urllib
	import json

	url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city='
	# '130010'とすると東京の情報を取得してくれる
	# ここを変えれば任意の地域の天気情報を取得できる
	city_id = '130010'
	
	html = urllib.request.urlopen(url+city_id)
	jsonfile = json.loads(html.read().decode('utf-8'))
	text = jsonfile['description']['text']

	message.send(text)

f:id:Duramente:20160806205311p:plain

urlの'city='の後の数字を変更することで、どこの天気情報を取得するかを変更することができます。今回は東京の天気を取得しています。

以下のURLからリクエストする地域のidを取得できます。

http://weather.livedoor.com/forecast/rss/primary_area.xml