😊
PythonでSlackBotを作成する(📒Google Colabノートブック付)
環境設定
最初に必要なライブラリをインストールします。
!pip install slack-sdk
Slack APIの設定手順
アプリケーションの作成
- Slack API にアクセス
- 「Create a custom app」をクリック
- アプリ名とワークスペースを選択
権限の設定
- 「OAuth & Permissions」セクションに移動
- 以下のBot Token Scopesを追加:
chat:write
- 「Install App to Workspace」をクリック
チャンネルへのBotの追加
- Slackワークスペースで対象チャンネルを開く
- チャンネル詳細 > その他 > アプリを追加
基本的な実装
メッセージ送信の基本コード
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()
セキュリティ上の注意点
- トークンは環境変数として管理
- gitignoreでトークンを含むファイルを除外
- 定期的なトークンのローテーション
デバッグとトラブルシューティング
一般的なエラーと対処法
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に置き換えてください。
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Discussion