😊

PythonでSlackBotを作成する(📒Google Colabノートブック付)

2024/11/19に公開

環境設定

最初に必要なライブラリをインストールします。

!pip install slack-sdk

Slack APIの設定手順

アプリケーションの作成

  1. Slack API にアクセス
  2. 「Create a custom app」をクリック
  3. アプリ名とワークスペースを選択

権限の設定

  1. 「OAuth & Permissions」セクションに移動
  2. 以下のBot Token Scopesを追加:
    • chat:write
  3. 「Install App to Workspace」をクリック

チャンネルへのBotの追加

  1. Slackワークスペースで対象チャンネルを開く
  2. チャンネル詳細 > その他 > アプリを追加

基本的な実装

メッセージ送信の基本コード

from google.colab import userdata

# Slack Bot User OAuth Token (xoxb-)
# - ボットユーザーの認証に使用
# - 'xoxb-' で始まる文字列
# - Slack APIの 'OAuth & Permissions' ページで取得可能
# - チャンネルへの投稿やファイルのアップロードなどの操作が可能
# - 設定した権限(スコープ)に基づいて操作が制限される
SLACK_BOT_TOKEN = userdata.get('SLACK_BOT_TOKEN')

# Slack Channel ID (C*******)
# - メッセージを投稿するチャンネルのID
# - 通常 'C' で始まる文字列
# - Slackのウェブ版でチャンネルを開いたときのURLから取得可能
# - プライベートチャンネルの場合は 'G' で始まることもある
# - DMの場合は 'D' で始まる
SLACK_CHANNEL_ID = userdata.get('SLACK_CHANNEL_ID')
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

def send_slack_message(message):
    # Botトークンを設定
    client = WebClient(token=SLACK_BOT_TOKEN)


    # メッセージを送信
    response = client.chat_postMessage(
        channel=SLACK_CHANNEL_ID,
        text=message
    )
    return response


# テスト送信
send_slack_message("Hello World!")

設定項目の説明

  • token: OAuth & PermissionsページでBot User OAuth Tokenを取得
    • 形式: xoxb- で始まる文字列
  • channel: 投稿先チャンネルのID
    • ブラウザのSlackでチャンネルを開いたときのURLから取得可能

応用例

定期的なメッセージ送信

import schedule
import time

def scheduled_message():
    send_slack_message("定期メッセージです")

# 平日の午前9時に実行
schedule.every().monday.at("09:00").do(scheduled_message)
schedule.every().tuesday.at("09:00").do(scheduled_message)
schedule.every().wednesday.at("09:00").do(scheduled_message)
schedule.every().thursday.at("09:00").do(scheduled_message)
schedule.every().friday.at("09:00").do(scheduled_message)

while True:
    schedule.run_pending()
    time.sleep(60)

リッチメッセージの送信

def send_rich_message():
    client = WebClient(token=SLACK_BOT_TOKEN)

    blocks = [
        # ヘッダーセクション
        {
            "type": "header",
            "text": {
                "type": "plain_text",
                "text": "🚀 週次プロジェクト進捗報告",
                "emoji": True
            }
        },
        # 区切り線
        {"type": "divider"},

        # プロジェクト概要
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "*プロジェクト: アプリケーション改善*\n*期限: 2024年12月31日*"
            }
        },

        # タスクの進捗状況
        {
            "type": "section",
            "fields": [
                {
                    "type": "mrkdwn",
                    "text": "*完了タスク:*\n• デザインレビュー\n• API実装\n• テスト環境構築"
                },
                {
                    "type": "mrkdwn",
                    "text": "*未完了タスク:*\n• パフォーマンス改善\n• ドキュメント作成\n• 最終テスト"
                }
            ]
        },

        # 区切り線
        {"type": "divider"},

        # 重要な通知
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "⚠️ *注意事項*\n• 来週の水曜日にクライアントミーティング\n• テスト環境のデプロイは本日実施予定"
            }
        },

        # ボタンセクション
        {
            "type": "actions",
            "elements": [
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "詳細を確認",
                        "emoji": True
                    },
                    "value": "view_details",
                    "style": "primary"
                },
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "タスク追加",
                        "emoji": True
                    },
                    "value": "add_task"
                }
            ]
        },

        # フッター
        {
            "type": "context",
            "elements": [
                {
                    "type": "mrkdwn",
                    "text": "🕐 最終更新: 2024-11-16 10:00 JST"
                }
            ]
        }
    ]

    try:
        response = client.chat_postMessage(
            channel=SLACK_CHANNEL_ID,
            blocks=blocks,
            text="週次プロジェクト進捗報告" # blocks未対応クライアント用のフォールバックテキスト
        )
        print("リッチメッセージが送信されました")
        return response
    except SlackApiError as e:
        print(f"エラーが発生しました: {e.response['error']}")
        raise e

# テスト実行
if __name__ == "__main__":
    send_rich_message()

セキュリティ上の注意点

  1. トークンは環境変数として管理
  2. gitignoreでトークンを含むファイルを除外
  3. 定期的なトークンのローテーション

デバッグとトラブルシューティング

一般的なエラーと対処法

try:
    response = client.chat_postMessage(
        channel='your-channel-id',
        text="テストメッセージ"
    )
except SlackApiError as e:
    if e.response["error"] == "channel_not_found":
        print("チャンネルIDが間違っています")
    elif e.response["error"] == "invalid_auth":
        print("トークンが無効です")
    else:
        print(f"その他のエラー: {e.response['error']}")

ログ機能の実装

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='slack_bot.log'
)

def send_message_with_logging(message):
    try:
        response = send_slack_message(message)
        logging.info(f"メッセージ送信成功: {message}")
        return response
    except Exception as e:
        logging.error(f"エラー発生: {str(e)}")
        raise

Googgle colab

https://colab.research.google.com/drive/1av4iemrIyYOUinNTLeXbXJIBiFYqKI2r?usp=sharing

まとめ

  • Slack SDKを使用することで簡単にBotを作成可能
  • 適切な権限設定と認証情報の管理が重要
  • エラーハンドリングとログ機能の実装を推奨

このノートブックを実行する際は、必ず自身のSlack APIトークンとチャンネルIDに置き換えてください。

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Discussion