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-sdk`の`WebClient`と`chat_postMessage`だけで基本的な通知は実装できる
  • Block Kitを使うとリッチなレイアウトが作れる
  • cronやタスクスケジューラと組み合わせることで定期通知を自動化できる
  • 手動でやっていた朝の報告作業が完全になくなったことで、チーム全員が朝から本来の仕事に集中できるようになりました。試したことがない方はぜひ試してみてください。