10
1

[Python]requestsモジュールでSlackにメッセージを通知する

Last updated at Posted at 2023-12-03

この記事は 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

実行結果

メッセージが通知されて、
image.png

スレッドにも通知されます。
image.png

注意点

APIによって、通知先チャンネルIDを指定するパラメータのキー名が異なります。(ハマりました)

API チャンネルIDを指定するパラメータ
https://slack.com/api/chat.postMessage channel
https://slack.com/api/files.upload channels

まとめ

requestsモジュールを使用してslackにメッセージを通知することができました。

ライブラリによっては廃止になって消えたりするものもあったりするので、できるだけ汎用的なライブラリで済ませるのもありかもしれないですね。

ではでは。

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1