この記事は MicroAd Advent Calendar 2023 の4日目の記事です。
こんにちは。
マイクロアドのタカギです。
PythonでSlackにメッセージを通知したい場合、slack-boltを使用するのが一般的ですが、requestsモジュールを使用してSlack通知してみようと思います。
ソースコード
requirements.txt
requests==2.31.0
app.py
import os
import logging
import requests
from requests import Response
LOGGER = logging.getLogger('app')
CHANNEL_ID = 'xxxxxxxxxxx'
SLACK_BOT_TOKEN = os.environ['SLACK_BOT_TOKEN']
def send_message(msg: str, channel_id: str, token: str) -> Response:
"""
slack通知
Args:
msg: 通知メッセージ
channel_id: slackのチャンネルID
token: slackトークン
Returns:
APIのレスポンス情報
"""
LOGGER.info("send message to slack.")
url = "https://slack.com/api/chat.postMessage"
header = {
"Authorization": f"Bearer {token}"
}
data = {
"channel": channel_id,
"text": msg
}
response = requests.post(url, headers=header, data=data)
response.raise_for_status()
LOGGER.info(response.json())
return response
def send_by_snippet(
content: str, channel_id: str, ts: str, token: str,
title: str = 'thread content', filename: str = 'content.txt') -> None:
"""
slack通知
スレッドにスニペット形式で通知
添付ファイルとして通知される
Args:
content: 添付ファイルの本文
channel_id: slackのチャンネルID
ts: slackメッセージ通知レスポンスのts
token: slackトークン
title: 添付ファイルのタイトル
filename: 添付ファイルのファイル名
"""
LOGGER.info("send content to slack thread.")
url = "https://slack.com/api/files.upload"
header = {
"Authorization": f"Bearer {token}"
}
data = {
"channels": channel_id,
"thread_ts": ts,
"title": title,
"content": content,
"filename": filename
}
response = requests.post(url, headers=header, data=data)
response.raise_for_status()
LOGGER.info(response.json())
def main() -> None:
"""
メイン処理
"""
msg = 'slack通知メッセージ'
response = send_message(msg, CHANNEL_ID, SLACK_BOT_TOKEN)
# メッセージ通知したスレッドに添付ファイルで通知
ts = response.json()['ts']
content = """
添付ファイルの内容
"""
send_by_snippet(content, CHANNEL_ID, ts, SLACK_BOT_TOKEN)
if __name__ == "__main__":
main()
アプリ実行
python app.py
実行結果
注意点
APIによって、通知先チャンネルIDを指定するパラメータのキー名が異なります。(ハマりました)
API | チャンネルIDを指定するパラメータ |
---|---|
https://slack.com/api/chat.postMessage | channel |
https://slack.com/api/files.upload | channels |
まとめ
requestsモジュールを使用してslackにメッセージを通知することができました。
ライブラリによっては廃止になって消えたりするものもあったりするので、できるだけ汎用的なライブラリで済ませるのもありかもしれないですね。
ではでは。