0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

環境設定

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

!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

まとめ

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

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

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?