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

## 環境設定

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


```python
!pip install slack-sdk
```

## Slack APIの設定手順

### アプリケーションの作成
1. [Slack API](https://api.slack.com/) にアクセス
2. 「Create a custom app」をクリック
3. アプリ名とワークスペースを選択

### 権限の設定
1. 「OAuth & Permissions」セクションに移動
2. 以下のBot Token Scopesを追加：
   - `chat:write`
3. 「Install App to Workspace」をクリック

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

## 基本的な実装

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


```python
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')
```

```python
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!")
```

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">Replitで沼ったので、普通にマニュアルで実装して確認してる。。。ようやく slack Bot ✖ Pythonで疎通できた！ <a href="https://t.co/fhuV2P0R3u">pic.twitter.com/fhuV2P0R3u</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1857565266030506165?ref_src=twsrc%5Etfw">November 15, 2024</a></blockquote> 

### 設定項目の説明

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

## 応用例

### 定期的なメッセージ送信


```python
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)
```

### リッチメッセージの送信


```python
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. 定期的なトークンのローテーション

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

### 一般的なエラーと対処法


```python
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']}")
```

### ログ機能の実装


```python
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>