PythonでSlack通知botを作ったら業務連絡が楽になった

Slack通知botを作ったきっかけ

毎朝、チームの担当タスクや期限が近いチケットを手動でSlackに投稿していました。「今日の担当タスク」「期限が3日以内のもの」を確認してコピペするだけで15分かかっていたので、Pythonで自動化することにしました。

Slack APIとPythonの組み合わせは想像以上に簡単で、半日で動くものが完成しました。この記事ではその手順を共有します。

Slack APIのセットアップ

1. Slack Appを作成する

Slack APIにアクセスし、「Create New App」→「From scratch」を選択。アプリ名とワークスペースを設定します。

2. Bot Tokenのスコープを設定する

「OAuth & Permissions」→「Scopes」→「Bot Token Scopes」に以下を追加します。

  • chat:write — チャンネルへのメッセージ送信
  • chat:write.public — Botが参加していないパブリックチャンネルへの送信

3. Botをインストールする

「Install to Workspace」でインストールし、Bot User OAuth Tokenxoxb-で始まるトークン)を取得します。

4. チャンネルIDを確認する

通知を送りたいチャンネルを右クリック→「チャンネル詳細を表示」の最下部にチャンネルIDがあります。

Pythonでの実装

pip install slack-sdk python-dotenv

.envファイルにトークンを保存します。

SLACK_BOT_TOKEN=xoxb-xxxxxxxxxx
SLACK_CHANNEL_ID=C0XXXXXXXXXX

シンプルなテキスト通知

import os
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from dotenv import load_dotenv

load_dotenv()

client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])
channel = os.environ["SLACK_CHANNEL_ID"]


def send_message(text: str) -> None:
    try:
        client.chat_postMessage(channel=channel, text=text)
    except SlackApiError as e:
        print(f"Slack APIエラー: {e.response['error']}")


send_message("おはようございます!今日もよろしくお願いします。")

Block Kitでリッチなメッセージを送る

Slackの「Block Kit」を使うと、ボタンや区切り線、コードブロックなどを含むリッチなメッセージが作れます。

from datetime import date


def send_daily_report(tasks: list[dict]) -> None:
    today = date.today().strftime("%Y年%m月%d日")

    blocks = [
        {
            "type": "header",
            "text": {"type": "plain_text", "text": f"本日のタスク ({today})"}
        },
        {"type": "divider"},
    ]

    for task in tasks:
        deadline_text = f"期限: {task['deadline']}" if task.get("deadline") else "期限なし"
        blocks.append({
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": f"*{task['title']}*\n{deadline_text} | 担当: {task['assignee']}"
            }
        })

    blocks.append({"type": "divider"})
    blocks.append({
        "type": "context",
        "elements": [{"type": "mrkdwn", "text": "自動送信 by Python Bot"}]
    })

    try:
        client.chat_postMessage(
            channel=channel,
            text=f"本日のタスク ({today})",  # 通知プレビュー用
            blocks=blocks
        )
    except SlackApiError as e:
        print(f"エラー: {e.response['error']}")


# 使用例
tasks = [
    {"title": "週次レポート作成", "deadline": "2026-03-07", "assignee": "中野"},
    {"title": "サーバー監視確認", "deadline": None, "assignee": "中野"},
]
send_daily_report(tasks)

cronで定期実行する

MacまたはLinuxのcronに登録すれば、毎朝自動で通知が飛びます。

crontab -e
# 毎日午前8時に実行
0 8 * * * /path/to/venv/bin/python /path/to/slack_bot.py >> /tmp/slack_bot.log 2>&1

Windowsの場合はタスクスケジューラを使います。

エラー通知botとしても活用する

バッチ処理やスクレイピングが失敗したときにSlackに通知する使い方も非常に便利です。

import traceback
import functools


def notify_on_error(func):
    """エラー発生時にSlackに通知するデコレータ"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            error_msg = f":red_circle: `{func.__name__}` でエラーが発生しました\n```{traceback.format_exc()}```"
            send_message(error_msg)
            raise
    return wrapper


@notify_on_error
def risky_batch_job():
    # エラーが起きるとSlackに通知される
    raise ValueError("テストエラー")

まとめ

PythonのSlack botは想像より簡単に作れます。ポイントは以下の3点です。

  • slack-sdkWebClientchat_postMessageだけで基本的な通知は実装できる
  • Block Kitを使うとリッチなレイアウトが作れる
  • cronやタスクスケジューラと組み合わせることで定期通知を自動化できる

手動でやっていた朝の報告作業が完全になくなったことで、チーム全員が朝から本来の仕事に集中できるようになりました。試したことがない方はぜひ試してみてください。