PythonでSlackに実験結果(テキストと画像)を通知する方法

機械学習の実験など、時間のかかる処理が完了した際に、その結果をSlackに通知すると非常に便利です。この記事では、Pythonを使ってSlackにテキストメッセージと画像を送信する方法を解説します。

1. テキストを送信する (Incoming Webhook)

Incoming Webhookは、外部からSlackにメッセージを投稿するための最もシンプルな方法です。特定のURLにHTTPリクエストを送るだけで、指定したチャンネルにメッセージを投稿できます。

Slack側の設定

  1. Slackの「設定と管理」から「アプリを管理する」を選択します。 fig1.png

  2. Appディレクトリで「Incoming Webhooks」を検索し、Slackに追加します。 fig2.png fig3.png

  3. 「Slackに追加」ボタンを押した後、メッセージを投稿したいチャンネルを選択し、「Incoming Webhookインテグレーションの追加」をクリックします。 fig4.png

  4. 生成された「Webhook URL」をコピーします。このURLは外部に漏れないように注意して扱ってください。 fig5.png

  5. 設定ページでは、通知時のアイコンやボットの名前をカスタマイズすることも可能です。 fig6.png

Pythonコード

slackweb ライブラリを使用すると、簡単に通知を実装できます。

pip install slackweb
import slackweb

# 設定でコピーしたWebhook URLをセット
slack = slackweb.Slack(url="YOUR_WEBHOOK_URL")

def notify_text(title, text, color):
    """
    Slackにテキストメッセージを通知する関数
    
    :param title: メッセージのタイトル
    :param text: メッセージの本文
    :param color: メッセージの左側に表示される線の色 ('good', 'warning', 'danger' または16進数カラーコード)
    """
    attachments = [{
        "title": title,
        "text": text,
        "color": color,
        "footer": "Sent from Python Script",
    }]
    slack.notify(attachments=attachments)

# --- 使用例 ---
notify_text("実験完了", "モデルAの学習が完了しました。", "good")
notify_text("警告", "ディスク容量が残りわずかです。", "warning")
notify_text("エラー発生", "学習プロセスで例外が発生しました。", "danger")
  • : attachments を使ったメッセージの書式設定は、現在ではレガシーな方法とされています。より表現力豊かなメッセージを作成するには、Block Kit の利用が推奨されます。

実行結果

fig7.png


2. 画像を送信する (files.upload API)

実験結果のグラフなどを画像ファイルとして送信したい場合は、Slack APIの files.upload メソッドを利用します。これには、Incoming Webhookとは別の認証情報(APIトークン)が必要です。

Slack側の設定

  1. Slack APIサイトにアクセスし、「Create New App」から新しいアプリを作成します。
  2. アプリの管理画面で「OAuth & Permissions」に移動します。
  3. 「Scopes」の「Bot Token Scopes」セクションで、「files:write」スコープを追加します。これにより、アプリがファイルをアップロードする権限を持ちます。
  4. ページ上部の「Install to Workspace」をクリックして、アプリをワークスペースにインストールし、連携を許可します。
  5. インストール後、「Bot User OAuth Token」が表示されます。このトークン(通常 xoxb- で始まります)をコピーします。このトークンも外部に漏れないように厳重に管理してください。

Pythonコード

requests ライブラリを使用して、APIにリクエストを送信します。

import requests

def notify_image(channel, title, image_path, token):
    """
    Slackに画像をアップロードして通知する関数
    
    :param channel: 投稿したいチャンネル名 (例: '#general')
    :param title: 画像のタイトル
    :param image_path: アップロードする画像のファイルパス
    :param token: SlackアプリのBot User OAuth Token
    """
    files = {'file': open(image_path, 'rb')}
    params = {
        'token': token,
        'channels': channel,
        'title': title,
    }
    requests.post(url="https://slack.com/api/files.upload", params=params, files=files)

# --- 使用例 ---
SLACK_API_TOKEN = "YOUR_BOT_USER_OAUTH_TOKEN"
CHANNEL_NAME = "#random" # 通知したいチャンネル名
IMAGE_FILE_PATH = "test.png" # 送信する画像のパス

notify_image(CHANNEL_NAME, "学習結果のグラフ", IMAGE_FILE_PATH, SLACK_API_TOKEN)

実行結果

fig8.png fig9.png

参考