読者です 読者をやめる 読者になる 読者になる

Pythonのrequestsモジュールを使ってSlackにポストする

 Pythonを使ってSlackに投稿する際は、requestsモジュールを使うと便利だ。requestsはPythonでHTTPリクエストやレスポンスを処理するためのモジュールで、標準モジュールではないが多くのPythonユーザーに使われている(GitHubのスター数はこの記事を書いている2月7日14時時点で17,440件)。

 Slackはメッセージやグループチャットを綺麗なUIで使えることに加え、Google DriveやDropbox、GitHub等の様々なサードパーティとのサービス連携が豊富であることから、利用事例にもある通り主に北米で多数の利用者を獲得している。また、Slackではbotと呼ばれる「プログラムで行動を決められるユーザー」を追加することで、特定の条件下で自動的にメッセージを飛ばしたりファイルをアップロードしたりすることができる。botについて詳しくはSlackのWebサイトを参照のこと。

 今回は、Incoming WebhooksというSlackのAPIを使ってSlackの特定チャンネルに特定のテキスト(東証の適時開示情報のタイトルとURL)をポストする。

 Incoming Webhooksの使い方は非常に簡単で、Incoming Webhooksを設定した際にもらえるURLに向けて、投稿内容のJSONを付したPOSTリクエストを送ればよい。実際のコード(汚くて申し訳ない)は以下の通りだ。設定内容は公式のドキュメントを参考にするとよい。

import json
import requests

# 投稿用のデータ作成
url = "Incoming Webhooksを設定した際に発行されるURL"

company_name = "ディーエヌエー"+"\n"
title = "平成28年3月期 第3四半期決算短信〔IFRS〕(連結)"+"\n"
link_to = "<https://www.release.tdnet.info/inbs/140120160127497359.pdf>"
content = company_name + title + link_to

payload_dic = {
    "text":content,
    "username":'投稿時に表示されるユーザー名',
    "icon_emoji":'絵文字の指定(:grin:など)',
    "channel":'#投稿先のチャンネル名',
    }

# Incoming Webhooksを使って対象のチャンネルにメッセージを送付
if __name__=='__main__':
    r = requests.post(url, data=json.dumps(payload_dic))

 usernameを"Webhooks test"、icon_emojiを":mailbox_with_mail:"とした場合、Slackには以下のように通知される。
f:id:hqac:20160207141638p:plain

JSONのエンコードについて

 最終行で辞書型のデータをJSONに出力し、dataパラメータに渡してPOSTリクエストを発行している。

r = requests.post(url, data=json.dumps(payload_dic))

 これは以下のように書くこともできる。これはrequestsモジュールのver2.4.2で追加された機能で、辞書型のデータを渡すと自動でJSONにエンコードしてくれる。

r = requests.post(url, json=payload_dic)