slack-bot-builder について
slack-bot-builderは、Bolt、Block Kit、OAuthによるインストールのパターンを扱うSlackアプリ開発スキルです。Slack連携を開発する人を対象としています。
主な機能
- 01Python、JavaScript、JavaでのBoltアプリ構築
- 02インタラクティブなBlock Kitメッセージレイアウト
- 03OAuthによる複数ワークスペースへのインストール
- 04トークン、スコープ、リクエスト処理の指針
活用シーン
- 01新しいSlackアプリの開始
- 02操作可能なフォームやメッセージの追加
- 03複数ワークスペースへのアプリ配布
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ davila7/ claude-code-templates --skill slack-bot-builderインストール後、Claude Code で/slack-bot-builderを入力して読み込まれたか確認します。
詳細
Slack Bot Builder
パターン
Bolt アプリ基盤パターン
Bolt フレームワークは、Slack が推奨するアプリ構築のアプローチです。 認証、イベントルーティング、リクエストの検証、HTTP リクエストの処理を担うため、アプリのロジックに集中できます。
主な利点:
- 数行のコードでイベント処理を実装できる
- セキュリティチェックとペイロードの検証が組み込まれている
- 整理された一貫性のあるパターン
- 実験用途と本番環境の両方で使用できる
対応言語: Python、JavaScript (Node.js)、Java
使用するタイミング: ['新しい Slack アプリを作成するとき', 'レガシーな Slack API から移行するとき', '本番環境向けの Slack 連携を構築するとき']
# Python Bolt App
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import os
# Initialize with tokens from environment
app = App(
token=os.environ["SLACK_BOT_TOKEN"],
signing_secret=os.environ["SLACK_SIGNING_SECRET"]
)
# Handle messages containing "hello"
@app.message("hello")
def handle_hello(message, say):
"""Respond to messages containing 'hello'."""
user = message["user"]
say(f"Hey there <@{user}>!")
# Handle slash command
@app.command("/ticket")
def handle_ticket_command(ack, body, client):
"""Handle /ticket slash command."""
# Acknowledge immediately (within 3 seconds)
ack()
# Open a modal for ticket creation
client.views_open(
trigger_id=body["trigger_id"],
view={
"type": "modal",
"callback_id": "ticket_modal",
"title": {"type": "plain_text", "text": "Create Ticket"},
"submit": {"type": "plain_text", "text": "Submit"},
"blocks": [
{
"type": "input",
"block_id": "title_block",
"element": {
"type": "plain_text_input",
"action_id": "title_input"
},
"label": {"type": "plain_text", "text": "Title"}
},
{
"type": "input",
"block_id": "desc_block",
"element": {
"type": "plain_text_input",
"multiline": True,
"action_id": "desc_input"
},
"label": {"type": "plain_text", "text": "Description"}
},
{
"type": "input",
"block_id": "priority_block",
"element": {
"type": "static_select",
"action_id": "priority_select",
Block Kit UI パターン
Block Kit は、リッチでインタラクティブなメッセージを構築するための Slack の UI フレームワークです。 ブロック (セクション、アクション、入力) と要素 (ボタン、メニュー、テキスト入力) を組み合わせてメッセージを構成します。
制限:
- メッセージあたり最大 50 ブロック
- モーダルやホームタブでは最大 100 ブロック
- ブロックのテキストは 3000 文字まで
プロトタイプの作成には Block Kit Builder を使用してください: https://app.slack.com/block-kit-builder
使用するタイミング: ['リッチなメッセージレイアウトを構築するとき', 'メッセージにインタラクティブなコンポーネントを追加するとき', 'モーダルでフォームを作成するとき', 'ホームタブの体験を構築するとき']
from slack_bolt import App
import os
app = App(token=os.environ["SLACK_BOT_TOKEN"])
def build_notification_blocks(incident: dict) -> list:
"""Build Block Kit blocks for incident notification."""
severity_emoji = {
"critical": ":red_circle:",
"high": ":large_orange_circle:",
"medium": ":large_yellow_circle:",
"low": ":white_circle:"
}
return [
# Header
{
"type": "header",
"text": {
"type": "plain_text",
"text": f"{severity_emoji.get(incident['severity'], '')} Incident Alert"
}
},
# Details section
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": f"*Incident:*\n{incident['title']}"
},
{
"type": "mrkdwn",
"text": f"*Severity:*\n{incident['severity'].upper()}"
},
{
"type": "mrkdwn",
"text": f"*Service:*\n{incident['service']}"
},
{
"type": "mrkdwn",
"text": f"*Reported:*\n<!date^{incident['timestamp']}^{date_short} {time}|{incident['timestamp']}>"
}
]
},
# Description
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": f"*Description:*\n{incident['description'][:2000]}"
}
},
# Divider
{"type": "divider"},
# Action buttons
{
"type": "actions",
"block_id": f"incident_actions_{incident['id']}",
"elements": [
{
"type": "button",
"text": {"type": "plain_text", "text": "Acknowledge"},
"style": "primary",
"action_id": "acknowle
OAuth インストールパターン
OAuth 2.0 を介して、ユーザーが自分のワークスペースにアプリをインストールできるようにします。 Bolt が OAuth フローの大部分を処理しますが、設定を行い、トークンを安全に保存する必要があります。
OAuth の主な概念:
- スコープは権限を定義します (必要最小限を要求してください)
- トークンはワークスペースごとに固有です
- インストールデータは永続的に保存する必要があります
- ユーザーは後からスコープを追加できます (追加方式)
過剰な権限要求に直面すると、70% のユーザーがインストールを中止します。必要なものだけを要求してください!
使用するタイミング: ['アプリを複数のワークスペースに配布するとき', '公開 Slack アプリを構築するとき', 'エンタープライズグレードの連携を構築するとき']
from slack_bolt import App
from slack_bolt.oauth.oauth_settings import OAuthSettings
from slack_sdk.oauth.installation_store import FileInstallationStore
from slack_sdk.oauth.state_store import FileOAuthStateStore
import os
# For production, use database-backed stores
# For example: PostgreSQL, MongoDB, Redis
class DatabaseInstallationStore:
"""Store installation data in your database."""
async def save(self, installation):
"""Save installation when user completes OAuth."""
await db.installations.upsert({
"team_id": installation.team_id,
"enterprise_id": installation.enterprise_id,
"bot_token": encrypt(installation.bot_token),
"bot_user_id": installation.bot_user_id,
"bot_scopes": installation.bot_scopes,
"user_id": installation.user_id,
"installed_at": installation.installed_at
})
async def find_installation(self, *, enterprise_id, team_id, user_id=None, is_enterprise_install=False):
"""Find installation for a workspace."""
record = await db.installations.find_one({
"team_id": team_id,
"enterprise_id": enterprise_id
})
if record:
return Installation(
bot_token=decrypt(record["bot_token"]),
# ... other fields
)
return None
# Initialize OAuth-enabled app
app = App(
signing_secret=os.environ["SLACK_SIGNING_SECRET"],
oauth_settings=OAuthSettings(
client_id=os.environ["SLACK_CLIENT_ID"],
client_secret=os.environ["SLACK_CLIENT_SECRET"],
scopes=[
"channels:history",
"channels:read",
"chat:write",
"commands",
"users:read"
],
user_scopes=[], # User token scopes if needed
installation_store=DatabaseInstallationStore(),
state_store=FileOAuthStateStore(expiration_seconds=600)
)
)
# OAuth routes are handled a
⚠️ 注意すべき点
| 問題 | 重大度 | 解決策 |
|---|---|---|
| 問題 | critical | ## 即座に応答し、後で処理する |
| 問題 | critical | ## 適切な state の検証を行う |
| 問題 | critical | ## トークンをハードコードしたりログに出力したりしない |
| 問題 | high | ## 必要最小限のスコープを要求する |
| 問題 | medium | ## 制限を把握し、遵守する |
| 問題 | high | ## Socket Mode は開発用途のみに使用する |
| 問題 | critical | ## Bolt が自動的に処理する |