discordbot について
curl と jq で Discord API を操作する、登録済み Bot 向けのスキルです。Bot がアクセスできるサーバーやチャンネルの確認、メッセージの読み取りと送信に対応し、権限や同意、安全性の確認を重視します。
主な機能
- 01Bot の認証とサーバー一覧の取得
- 02テキスト・告知チャンネルの検索
- 03チャンネルの直近メッセージの取得
- 04チャンネルへのメッセージ送信と返信
- 051対1 DM の同意確認
活用シーン
- 01Bot がアクセスできるサーバーの確認
- 02権限のあるチャンネルの直近メッセージ確認
- 03確認済みメッセージの送信や返信
- 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>でチャンネルへのリンクを作成します。通常のメッセージにはプレーンテキストを使用できます。