Discord (Bot API)
狀態:已就緒,支援透過官方 Discord Gateway 進行私訊(DM)及伺服器頻道通訊。配對
Discord 私訊預設使用配對模式。
斜線指令
原生指令行為與指令目錄。
頻道疑難排解
跨頻道診斷與修復流程。
快速設定
你需要建立一個含有 Bot 的應用程式、將 Bot 加入你的伺服器,並與 OpenClaw 配對。建議將 Bot 加入你自己的私人伺服器。如果你還沒有伺服器,請先建立一個(選擇 Create My Own > For me and my friends)。建立 Discord 應用程式與 Bot
前往 Discord 開發者入口網站,點選 New Application。名稱可取為「OpenClaw」之類的名稱。點選側邊欄的 Bot,將 Username 設為你的 OpenClaw Agent 名稱。
啟用特權 Intent
在 Bot 頁面,向下捲動至 Privileged Gateway Intents 並啟用:
- Message Content Intent(必要)
- Server Members Intent(建議啟用;角色白名單與名稱轉 ID 功能需要此項)
- Presence Intent(選填;僅在需要接收上線狀態更新時啟用)
複製 Bot Token
在 Bot 頁面向上捲動,點選 Reset Token。複製 Token 並妥善保存。這是你的 Bot Token,稍後需要用到。
儘管名稱叫「Reset」,這實際上是第一次產生你的 Token,並非重置既有的 Token。
產生邀請網址並將 Bot 加入伺服器
點選側邊欄的 OAuth2,產生含有適當權限的邀請網址,以將 Bot 加入伺服器。向下捲動至 OAuth2 URL Generator 並勾選:
botapplications.commands
- View Channels(檢視頻道)
- Send Messages(傳送訊息)
- Read Message History(讀取訊息記錄)
- Embed Links(嵌入連結)
- Attach Files(附加檔案)
- Add Reactions(新增反應,選填)
啟用開發者模式並收集 ID
回到 Discord 應用程式,你需要啟用開發者模式以便複製內部 ID。
- 點選 用戶設定(頭像旁的齒輪圖示)→ 進階 → 開啟 開發者模式
- 右鍵點選側邊欄的 伺服器圖示 → 複製伺服器 ID
- 右鍵點選你的 頭像 → 複製用戶 ID
允許從伺服器成員接收私訊
要使配對功能正常運作,Discord 需要允許你的 Bot 向你傳送私訊。右鍵點選伺服器圖示 → 隱私設定 → 開啟 私訊。這讓伺服器成員(包括 Bot)可以向你傳送私訊。如果你想搭配 OpenClaw 使用 Discord 私訊,請保持此設定啟用。若你只打算使用伺服器頻道,配對完成後可以關閉。
步驟 0:安全地設定 Bot Token(不要在聊天中傳送)
你的 Discord Bot Token 是機密資訊(類似密碼)。請在執行 OpenClaw 的機器上設定,再開始與 Agent 聊天。如果 OpenClaw 已作為背景服務執行,請改用
openclaw gateway restart。設定 OpenClaw 並配對
- 詢問你的 Agent
- CLI / 設定
透過任何現有頻道(例如 Telegram)與你的 OpenClaw Agent 對話並告知它。如果 Discord 是你的第一個頻道,請改用 CLI / 設定 頁籤。
“我已在設定中設好我的 Discord Bot Token。請用 User ID<user_id>和 Server ID<server_id>完成 Discord 設定。”
Token 解析具備帳號感知能力。設定中的 Token 優先於環境變數備援。
DISCORD_BOT_TOKEN 僅適用於預設帳號。
進階輸出呼叫(訊息工具/頻道操作)使用該呼叫的明確 per-call token。帳號政策/重試設定仍來自當前執行快照中選取的帳號。建議:設定伺服器工作區
私訊運作正常後,你可以將 Discord 伺服器設定為完整工作區,讓每個頻道擁有獨立的 Agent 工作階段與情境。這對於只有你和 Bot 的私人伺服器特別推薦。將你的伺服器加入伺服器白名單
這讓你的 Agent 能在伺服器的任何頻道回覆,而不只是私訊。
- 詢問你的 Agent
- 設定
“請將我的 Discord 伺服器 ID <server_id> 加入伺服器白名單”
允許不需要 @mention 即可回覆
預設情況下,你的 Agent 只會在伺服器頻道被 @mention 時回覆。對於私人伺服器,你可能希望它回覆每一條訊息。
- 詢問你的 Agent
- 設定
“讓我的 Agent 在這個伺服器上無需被 @mention 就能回覆”
#coding、#home、#research,或任何符合你工作流程的頻道。
執行模型
- Gateway 擁有 Discord 連線。
- 回覆路由是確定性的:Discord 收入的訊息回覆至 Discord。
- 預設情況下(
session.dmScope=main),直接聊天共用 Agent 主要工作階段(agent:main:main)。 - 伺服器頻道使用獨立的工作階段金鑰(
agent:<agentId>:discord:channel:<channelId>)。 - 群組私訊預設被忽略(
channels.discord.dm.groupEnabled=false)。 - 原生斜線指令在獨立的指令工作階段中執行(
agent:<agentId>:discord:slash:<userId>),同時仍將CommandTargetSessionKey傳遞至路由的對話工作階段。
論壇頻道
Discord 論壇與媒體頻道只接受討論串貼文。OpenClaw 支援兩種建立方式:- 傳送訊息至論壇父頻道(
channel:<forumId>)以自動建立討論串。討論串標題使用訊息的第一個非空行。 - 使用
openclaw message thread create直接建立討論串。論壇頻道不要傳入--message-id。
channel:<threadId>)。
互動元件
OpenClaw 支援 Agent 訊息使用 Discord 元件 v2 容器。使用訊息工具並附上components 載荷。互動結果會作為一般收入訊息路由回 Agent,並遵循現有的 Discord replyToMode 設定。
支援的區塊:
text、section、separator、actions、media-gallery、file- Action rows 允許最多 5 個按鈕或一個下拉選單
- 下拉選單類型:
string、user、role、mentionable、channel
components.reusable=true 可讓按鈕、下拉選單和表單在過期前多次使用。
若要限制誰可以點擊按鈕,請在該按鈕上設定 allowedUsers(Discord 用戶 ID、標籤或 *)。設定後,不符合的用戶會收到暫時性拒絕通知。
/model 和 /models 斜線指令會開啟互動式模型選擇器,包含提供者和模型下拉選單及提交步驟。選擇器回覆為暫時性,只有呼叫者可以使用。
檔案附件:
file區塊必須指向附件參照(attachment://<filename>)- 透過
media/path/filePath提供附件(單一檔案);多個檔案使用media-gallery - 使用
filename在上傳名稱需要符合附件參照時覆寫名稱
- 在
components.modal中新增最多 5 個欄位 - 欄位類型:
text、checkbox、radio、select、role-select、user-select - OpenClaw 會自動新增觸發按鈕
存取控制與路由
- 私訊政策
- 伺服器政策
- Mention 與群組私訊
channels.discord.dmPolicy 控制私訊存取(舊版:channels.discord.dm.policy):pairing(預設)allowlistopen(需要channels.discord.allowFrom包含"*";舊版:channels.discord.dm.allowFrom)disabled
pairing 模式下提示配對)。多帳號優先順序:channels.discord.accounts.default.allowFrom僅適用於default帳號。- 具名帳號在未設定自己的
allowFrom時,繼承channels.discord.allowFrom。 - 具名帳號不繼承
channels.discord.accounts.default.allowFrom。
user:<id><@id>mention
基於角色的 Agent 路由
使用bindings[].match.roles 可依角色 ID 將 Discord 伺服器成員路由至不同的 Agent。基於角色的 binding 僅接受角色 ID,優先順序在 peer 或 parent-peer binding 之後、純伺服器 binding 之前評估。若 binding 同時設定了其他 match 欄位(例如 peer + guildId + roles),所有設定的欄位都必須符合。
開發者入口網站設定
建立應用程式與 Bot
建立應用程式與 Bot
- Discord 開發者入口網站 -> Applications -> New Application
- Bot -> Add Bot
- 複製 Bot Token
特權 Intent
特權 Intent
在 Bot -> Privileged Gateway Intents 中啟用:
- Message Content Intent
- Server Members Intent(建議)
setPresence)不需要啟用成員 presence 更新。OAuth 範圍與基本權限
OAuth 範圍與基本權限
OAuth URL 產生器:
- 範圍:
bot、applications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions(選填)
Administrator。複製 ID
複製 ID
啟用 Discord 開發者模式,然後複製:
- 伺服器 ID
- 頻道 ID
- 用戶 ID
原生指令與指令驗證
commands.native預設為"auto",在 Discord 上已啟用。- 每頻道覆寫:
channels.discord.commands.native。 commands.native=false會明確清除先前已註冊的 Discord 原生指令。- 原生指令驗證使用與一般訊息處理相同的 Discord 白名單/政策。
- 未獲授權的用戶仍可能在 Discord UI 中看到指令;執行仍會強制執行 OpenClaw 驗證並回傳「未授權」。
ephemeral: true
功能詳細說明
回覆標籤與原生回覆
回覆標籤與原生回覆
Discord 支援 Agent 輸出中的回覆標籤:
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode 控制:off(預設)firstall
off 停用隱式回覆串。明確的 [[reply_to_*]] 標籤仍然有效。訊息 ID 會顯示在情境/記錄中,讓 Agent 可以針對特定訊息回覆。即時串流預覽
即時串流預覽
OpenClaw 可以透過傳送暫時訊息並在文字到來時編輯它來串流草稿回覆。預覽串流僅適用於文字;媒體回覆會退回到一般傳送方式。注意:預覽串流與區塊串流是分開的。當 Discord 明確啟用區塊串流時,OpenClaw 會跳過預覽串流以避免雙重串流。
channels.discord.streaming控制預覽串流(off|partial|block|progress,預設:off)。progress為跨頻道一致性而被接受,在 Discord 上映射為partial。channels.discord.streamMode是舊版別名,會自動遷移。partial在 Token 到來時編輯單一預覽訊息。block發出草稿大小的區塊(使用draftChunk調整大小和分割點)。
block 模式區塊預設值(受 channels.discord.textChunkLimit 限制):記錄、情境與討論串行為
記錄、情境與討論串行為
伺服器記錄情境:
channels.discord.historyLimit預設20- 備援:
messages.groupChat.historyLimit 0停用
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Discord 討論串以頻道工作階段路由
- 父討論串中繼資料可用於父工作階段連結
- 討論串設定繼承父頻道設定,除非有特定的討論串項目
子 Agent 的討論串綁定工作階段
子 Agent 的討論串綁定工作階段
Discord 可以將討論串綁定至工作階段目標,讓該討論串的後續訊息持續路由至相同工作階段(包括子 Agent 工作階段)。指令:注意:
/focus <target>將當前/新討論串綁定至子 Agent/工作階段目標/unfocus移除當前討論串綁定/agents顯示執行中的工作階段與綁定狀態/session idle <duration|off>查看/更新已聚焦綁定的閒置自動解除綁定設定/session max-age <duration|off>查看/更新已聚焦綁定的最大存活時間
session.threadBindings.*設定全域預設值。channels.discord.threadBindings.*覆寫 Discord 行為。spawnSubagentSessions必須為 true 才能自動為sessions_spawn({ thread: true })建立/綁定討論串。spawnAcpSessions必須為 true 才能自動為 ACP(/acp spawn ... --thread ...或sessions_spawn({ runtime: "acp", thread: true }))建立/綁定討論串。- 若某帳號停用了討論串綁定,
/focus及相關討論串綁定操作將無法使用。
持久性 ACP 頻道綁定
持久性 ACP 頻道綁定
若要建立穩定的「永遠在線」ACP 工作區,請設定指向 Discord 對話的頂層類型化 ACP binding。設定路徑:注意:
bindings[]包含type: "acp"且match.channel: "discord"
- 討論串訊息可繼承父頻道的 ACP binding。
- 在已綁定的頻道或討論串中,
/new和/reset會就地重置相同的 ACP 工作階段。 - 暫時性討論串綁定仍有效,可在活躍時覆寫目標解析。
反應通知
反應通知
每個伺服器的反應通知模式:
offown(預設)allallowlist(使用guilds.<id>.users)
確認反應
確認反應
ackReaction 在 OpenClaw 處理收入訊息時傳送確認 emoji。解析順序:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- Agent 身份 emoji 備援(
agents.list[].identity.emoji,否則使用 ”👀”)
- Discord 接受 unicode emoji 或自訂 emoji 名稱。
- 使用
""停用特定頻道或帳號的反應。
設定寫入
設定寫入
頻道發起的設定寫入預設啟用。這影響
/config set|unset 流程(當指令功能已啟用時)。停用:Gateway Proxy
Gateway Proxy
透過 每帳號覆寫:
channels.discord.proxy 將 Discord Gateway WebSocket 流量和啟動 REST 查詢(應用程式 ID + 白名單解析)路由至 HTTP(S) Proxy。PluralKit 支援
PluralKit 支援
啟用 PluralKit 解析以將代理訊息映射至系統成員身份:注意:
- 白名單可使用
pk:<memberId> - 成員顯示名稱僅在
channels.discord.dangerouslyAllowNameMatching: true時才以名稱/slug 比對 - 查詢使用原始訊息 ID 並受時間窗限制
- 若查詢失敗,代理訊息被視為 Bot 訊息而被丟棄,除非設定了
allowBots=true
上線狀態設定
上線狀態設定
當你設定狀態或活動欄位,或啟用自動上線狀態時,上線狀態更新會被套用。僅設定狀態範例:活動範例(自訂狀態是預設活動類型):串流範例:活動類型對應:自動上線狀態將執行時可用性映射至 Discord 狀態:健康 => online,降級或未知 => idle,耗盡或不可用 => dnd。選填文字覆寫:
- 0:Playing(遊玩)
- 1:Streaming(串流,需要
activityUrl) - 2:Listening(聆聽)
- 3:Watching(觀看)
- 4:Custom(自訂,使用活動文字作為狀態文字;emoji 選填)
- 5:Competing(競技)
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(支援{reason}佔位符)
Discord 中的執行核准
Discord 中的執行核准
Discord 支援私訊中基於按鈕的執行核准,也可以選擇性地在來源頻道張貼核准提示。設定路徑:
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approverschannels.discord.execApprovals.target(dm|channel|both,預設:dm)agentFilter、sessionFilter、cleanupAfterResolve
target 為 channel 或 both 時,核准提示在頻道中可見。只有已設定的核准者可以使用按鈕;其他用戶會收到暫時性拒絕。核准提示包含指令文字,因此請只在受信任的頻道啟用頻道傳送。若頻道 ID 無法從工作階段金鑰取得,OpenClaw 會退回至私訊傳送。此處理程式的 Gateway 驗證使用與其他 Gateway 客戶端相同的共享憑證解析:- 環境優先的本地驗證(
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD,然後gateway.auth.*) - 本地模式下,只有在
gateway.auth.*未設定時,gateway.remote.*才可作為備援;已設定但無法解析的本地 SecretRef 會失敗關閉 - 適用時透過
gateway.remote.*支援遠端模式 - URL 覆寫是安全的:CLI 覆寫不重用隱式憑證,環境覆寫僅使用環境憑證
工具與操作閘門
Discord 訊息操作包括訊息傳送、頻道管理、版主操作、上線狀態和中繼資料操作。 核心範例:- 訊息:
sendMessage、readMessages、editMessage、deleteMessage、threadReply - 反應:
react、reactions、emojiList - 版主:
timeout、kick、ban - 上線狀態:
setPresence
channels.discord.actions.*。
預設閘門行為:
| 操作群組 | 預設 |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | 啟用 |
| roles | 停用 |
| moderation | 停用 |
| presence | 停用 |
元件 v2 UI
OpenClaw 使用 Discord 元件 v2 進行執行核准和跨情境標記。Discord 訊息操作也可接受components 自訂 UI(進階功能;需要 Carbon 元件實例),而舊版 embeds 仍可使用但不建議。
channels.discord.ui.components.accentColor設定 Discord 元件容器使用的強調色(十六進位)。- 每帳號設定:
channels.discord.accounts.<id>.ui.components.accentColor。 - 存在元件 v2 時會忽略
embeds。
語音頻道
OpenClaw 可以加入 Discord 語音頻道進行即時、持續的對話。這與語音訊息附件是不同的功能。 需求:- 啟用原生指令(
commands.native或channels.discord.commands.native)。 - 設定
channels.discord.voice。 - Bot 需要在目標語音頻道擁有 Connect + Speak 權限。
/vc join|leave|status 控制工作階段。該指令使用帳號預設 Agent,並遵循與其他 Discord 指令相同的白名單和群組政策規則。
自動加入範例:
voice.tts僅覆寫語音播放的messages.tts。- 語音轉錄輪次從 Discord
allowFrom(或dm.allowFrom)取得擁有者狀態;非擁有者的發言者無法存取僅限擁有者的工具(例如gateway和cron)。 - 語音預設啟用;設定
channels.discord.voice.enabled=false可停用。 voice.daveEncryption和voice.decryptionFailureTolerance傳遞至@discordjs/voice的加入選項。@discordjs/voice的預設值為daveEncryption=true和decryptionFailureTolerance=24(若未設定)。- OpenClaw 也監視接收解密失敗,並在短時間內重複失敗後自動離開/重新加入語音頻道進行恢復。
- 若接收日誌持續顯示
DecryptionFailed(UnencryptedWhenPassthroughDisabled),這可能是 discord.js #11419 追蹤的上游@discordjs/voice接收錯誤。
語音訊息
Discord 語音訊息顯示波形預覽,需要 OGG/Opus 音訊及中繼資料。OpenClaw 會自動產生波形,但需要 Gateway 主機上有ffmpeg 和 ffprobe 才能檢視和轉換音訊檔案。
需求與限制:
- 必須提供本地檔案路徑(不接受 URL)。
- 省略文字內容(Discord 不允許在相同載荷中同時包含文字和語音訊息)。
- 接受任何音訊格式;OpenClaw 在需要時會轉換為 OGG/Opus。
疑難排解
使用了不允許的 Intent 或 Bot 看不到伺服器訊息
使用了不允許的 Intent 或 Bot 看不到伺服器訊息
- 啟用 Message Content Intent
- 當你依賴用戶/成員解析時,啟用 Server Members Intent
- 變更 Intent 後重啟 Gateway
伺服器訊息意外被封鎖
伺服器訊息意外被封鎖
- 確認
groupPolicy - 確認
channels.discord.guilds下的伺服器白名單 - 若伺服器有
channels映射,只有列出的頻道才被允許 - 確認
requireMention行為與 mention 模式
requireMention 設為 false 但仍然被封鎖
requireMention 設為 false 但仍然被封鎖
常見原因:
groupPolicy="allowlist"但沒有符合的伺服器/頻道白名單requireMention設定在錯誤的位置(必須在channels.discord.guilds或頻道項目下)- 發送者被伺服器/頻道的
users白名單封鎖
長時間執行的處理程式超時或重複回覆
長時間執行的處理程式超時或重複回覆
典型日誌:慢速監聽器設定使用
Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATESlow listener detected ...discord inbound worker timed out after ...
- 單帳號:
channels.discord.eventQueue.listenerTimeout - 多帳號:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
- 單帳號:
channels.discord.inboundWorker.runTimeoutMs - 多帳號:
channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs - 預設:
1800000(30 分鐘);設為0停用
eventQueue.listenerTimeout;只有在需要額外的佇列 Agent 輪次安全閥時才使用 inboundWorker.runTimeoutMs。權限稽核不符
權限稽核不符
channels status --probe 的權限檢查只適用於數字頻道 ID。若你使用 slug 金鑰,執行時比對仍可運作,但探測無法完整驗證權限。私訊與配對問題
私訊與配對問題
- 私訊已停用:
channels.discord.dm.enabled=false - 私訊政策已停用:
channels.discord.dmPolicy="disabled"(舊版:channels.discord.dm.policy) - 在
pairing模式下等待配對核准
Bot 對 Bot 的循環問題
Bot 對 Bot 的循環問題
預設情況下,Bot 發送的訊息會被忽略。若你設定了
channels.discord.allowBots=true,請使用嚴格的 mention 和白名單規則以避免循環行為。
建議使用 channels.discord.allowBots="mentions" 以僅接受有 mention Bot 的 Bot 訊息。語音 STT 因 DecryptionFailed(...) 中斷
語音 STT 因 DecryptionFailed(...) 中斷
- 保持 OpenClaw 最新(
openclaw update)以確保 Discord 語音接收恢復邏輯存在 - 確認
channels.discord.voice.daveEncryption=true(預設值) - 從
channels.discord.voice.decryptionFailureTolerance=24(上游預設)開始,只在需要時調整 - 監看日誌:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- 若在自動重新加入後仍持續失敗,請收集日誌並對照 discord.js #11419
設定參考指引
主要參考: Discord 重要欄位:- 啟動/驗證:
enabled、token、accounts.*、allowBots - 政策:
groupPolicy、dm.*、guilds.*、guilds.*.channels.* - 指令:
commands.native、commands.useAccessGroups、configWrites、slashCommand.* - 事件佇列:
eventQueue.listenerTimeout(監聽器預算)、eventQueue.maxQueueSize、eventQueue.maxConcurrency - 收入工作:
inboundWorker.runTimeoutMs - 回覆/記錄:
replyToMode、historyLimit、dmHistoryLimit、dms.*.historyLimit - 傳送:
textChunkLimit、chunkMode、maxLinesPerMessage - 串流:
streaming(舊版別名:streamMode)、draftChunk、blockStreaming、blockStreamingCoalesce - 媒體/重試:
mediaMaxMb、retrymediaMaxMb限制 Discord 上傳大小(預設:8MB)
- 操作:
actions.* - 上線狀態:
activity、status、activityType、activityUrl - UI:
ui.components.accentColor - 功能:
threadBindings、頂層bindings[](type: "acp")、pluralkit、execApprovals、intents、agentComponents、heartbeat、responsePrefix
安全性與操作
- 將 Bot Token 視為機密資訊(建議在受監控的環境中使用
DISCORD_BOT_TOKEN)。 - 授予最小必要的 Discord 權限。
- 若指令部署/狀態已過期,重啟 Gateway 並用
openclaw channels status --probe重新確認。