mcpField
D
discordbot

discordbot

github.com/acedatacloud生産性17172 回インストール今日更新
リポジトリ

discordbot について

curl と jq で Discord API を操作する、登録済み Bot 向けのスキルです。Bot がアクセスできるサーバーやチャンネルの確認、メッセージの読み取りと送信に対応し、権限や同意、安全性の確認を重視します。

主な機能

  1. 01Bot の認証とサーバー一覧の取得
  2. 02テキスト・告知チャンネルの検索
  3. 03チャンネルの直近メッセージの取得
  4. 04チャンネルへのメッセージ送信と返信
  5. 051対1 DM の同意確認

活用シーン

  1. 01Bot がアクセスできるサーバーの確認
  2. 02権限のあるチャンネルの直近メッセージ確認
  3. 03確認済みメッセージの送信や返信
  4. 04受信者の同意を確認した DM 送信

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/acedatacloud/skills --skill discordbot

インストール後、Claude Code で/discordbotを入力して読み込まれたか確認します。

同梱ファイルscripts/discordbot.py

詳細

curl + jq を使用して、$DISCORDBOT_TOKEN に設定されたユーザーの bot トークンで Discord API を操作します。認証ヘッダーは Authorization: Bot $DISCORDBOT_TOKEN です。Bot というリテラルのプレフィックスに注意してください(Bearer ではありません)。ベース URL は https://discord.com/api/v10 です。

これはユーザーの登録済み bot として動作するため、bot が招待されているサーバー(ギルド)で、かつ必要な権限(チャンネルを見る/メッセージを送信/メッセージ履歴を読む)がある場合に限り、そのサーバーを表示して操作できます。403 Forbidden(コード 50001「アクセス権がありません」/50013「権限がありません」がほとんどです)が返された場合、通常はbotがそのサーバーに参加していないか、必要な権限がありません。再試行するのではなく、botを招待するか権限を付与するようユーザーに伝えてください。

エラーは {"code": <n>, "message": "<reason>"} 形式の JSON です。401 はbotトークンが誤っているか、リセットされていることを意味します。ユーザーに studio.acedata.cloud/console/connectors でトークンを貼り直すよう依頼してください。429 には retry_after(秒)が含まれます。その時間だけ待ってから再試行してください。並列実行は決して行わないでください。

送信時の安全対策

  • 送信前に、宛先と最終的な内容をユーザーに確認してください。送信は取り消せません。
  • DMは、広告されたキーワードを返信してbotに詳細を尋ねるなど、受信者側の操作によって開始される必要があります。サーバーへの参加、公開プロフィール、メンバーリストへの掲載は、同意を意味しません。
  • 1回の実行で送信する相手は必ず1人にしてください。メンバーの列挙、ループによるDMチャンネルの作成、同意のない一斉送信は決して行わないでください。
  • 無人のスケジュール実行では、タスク定義に正確な recipient_id、consent_channel_id、consent_message_id、consent_keyword、承認済みの content がすべて含まれている場合に限り送信してください。いずれかが欠けている場合は、送信せず下書きを返してください。
  • 受信者から返信がない限り、追加の連絡はしないでください。stop、unsubscribe、またはそれに相当する拒否は、永続的な配信停止として扱ってください。

レシピ

bot を確認する(必ず最初に実行)
curl -sS -H "Authorization: Bot $DISCORDBOT_TOKEN" \
  "https://discord.com/api/v10/users/@me" \
  | jq '{id, username, bot}'
bot が参加しているサーバー(ギルド)を一覧表示する
curl -sS -H "Authorization: Bot $DISCORDBOT_TOKEN" \
  "https://discord.com/api/v10/users/@me/guilds" \
  | jq 'map({id, name})'
サーバー内のテキストチャンネルを一覧表示する

チャンネルの type は、0 がテキスト、5 がアナウンスです。2 はボイス、4 はカテゴリ(メッセージ送信では対象外)です。上記の呼び出しで取得したギルド ID が必要です。

GUILD_ID="123456789012345678"
curl -sS -H "Authorization: Bot $DISCORDBOT_TOKEN" \
  "https://discord.com/api/v10/guilds/$GUILD_ID/channels" \
  | jq 'map(select(.type==0 or .type==5) | {id, name, type})'
チャンネルの最近のメッセージを読む

メッセージの内容を読むには、bot で Message Content Intent を有効にする必要があります(Developer Portal → Bot → Privileged Gateway Intents)。有効になっていない場合、botにメンションしていないメッセージは content が空になります。そのチャンネルで Read Message History 権限も必要です。

CHANNEL_ID="123456789012345678"
curl -sS -H "Authorization: Bot $DISCORDBOT_TOKEN" \
  "https://discord.com/api/v10/channels/$CHANNEL_ID/messages?limit=20" \
  | jq 'map({id, author_id: .author.id, author: .author.username, author_bot: .author.bot, ts: .timestamp, content})'
チャンネルにメッセージを送信する
CHANNEL_ID="123456789012345678"
curl -sS -X POST \
  -H "Authorization: Bot $DISCORDBOT_TOKEN" \
  -H "Content-Type: application/json" \
  "https://discord.com/api/v10/channels/$CHANNEL_ID/messages" \
  -d "$(jq -nc --arg c "Hello from the bot." '{content: $c}')"
特定のメッセージに返信する
CHANNEL_ID="123456789012345678"; MESSAGE_ID="987654321098765432"
curl -sS -X POST \
  -H "Authorization: Bot $DISCORDBOT_TOKEN" \
  -H "Content-Type: application/json" \
  "https://discord.com/api/v10/channels/$CHANNEL_ID/messages" \
  -d "$(jq -nc --arg c "On it!" --arg m "$MESSAGE_ID" \
        '{content: $c, message_reference: {message_id: $m}}')"
同意を得た相手にDMを1件送信する

送信時の安全対策のルールをすべて適用した後に限り使用してください。このヘルパーは Discord から元のメッセージを取得し、bot以外の投稿者が RECIPIENT_ID と一致すること、およびメッセージ全体が CONSENT_KEYWORD と一致することを検証します。Create DM エンドポイントを直接呼び出さないでください。一致判定では大文字と小文字を区別せず、前後や連続する空白はまとめて扱います。

RECIPIENT_ID="123456789012345678"
CONSENT_CHANNEL_ID="223456789012345678"
CONSENT_MESSAGE_ID="323456789012345678"
CONSENT_KEYWORD="details"

python3 "$SKILL_DIR/scripts/discordbot.py" send-opt-in-dm \
  --recipient-id "$RECIPIENT_ID" \
  --consent-channel-id "$CONSENT_CHANNEL_ID" \
  --consent-message-id "$CONSENT_MESSAGE_ID" \
  --consent-keyword "$CONSENT_KEYWORD" \
  --content "Here are the details you requested."

最後の引数に --confirm を指定しない限り、このコマンドはドライランです。事前承認済みのスケジュールタスクでは、代わりに最後の引数として --unattended-confirm を使用してください。ヘルパーはすべての ID を検証し、同意メッセージを確認したうえで、DM 履歴に同じメッセージがすでに存在する場合は送信をスキップします。Discord は多数のDMを開くbotをブロックしたり、レート制限を適用したりすることがあります。別のアカウントを宛先にして再試行しないでください。

注意事項

  • UI の「サーバー」は API では「ギルド」にあたり、メッセージはギルド内のチャンネルにあります。必ず、ギルドを一覧表示 → そのギルドのチャンネルを一覧表示 → チャンネル ID を使って操作、の順に進めてください。ID を推測してはいけません。
  • ボットが参照できるのは、招待されたサーバーのみです。追加するには、Developer Portal → OAuth2 → URL Generator の順に進み、スコープ bot と必要な権限を選択 → URL を開く → サーバーを選択します(ユーザーには、そのサーバーの サーバー管理 権限が必要です)。
  • これはボットであり、ユーザーのアカウントではありません。ユーザーの DM やユーザーのサーバー一覧全体を読み取ることはできず、ボット自身がアクセスできるものだけを参照できます。
  • ボットは、同意したユーザー 1 人との DM チャンネルを自分で開くことができますが、接続されたユーザーの個人的な DM にアクセスできるようになるわけではありません。
  • メンション:<@USER_ID> でユーザーに通知し、<#CHANNEL_ID> でチャンネルへのリンクを作成します。通常のメッセージにはプレーンテキストを使用できます。

コメント