Skip to main content

Discord (Bot API)

狀態:已就緒,支援透過官方 Discord Gateway 進行私訊(DM)及伺服器頻道通訊。

配對

Discord 私訊預設使用配對模式。

斜線指令

原生指令行為與指令目錄。

頻道疑難排解

跨頻道診斷與修復流程。

快速設定

你需要建立一個含有 Bot 的應用程式、將 Bot 加入你的伺服器,並與 OpenClaw 配對。建議將 Bot 加入你自己的私人伺服器。如果你還沒有伺服器,請先建立一個(選擇 Create My Own > For me and my friends)。
1

建立 Discord 應用程式與 Bot

前往 Discord 開發者入口網站,點選 New Application。名稱可取為「OpenClaw」之類的名稱。點選側邊欄的 Bot,將 Username 設為你的 OpenClaw Agent 名稱。
2

啟用特權 Intent

Bot 頁面,向下捲動至 Privileged Gateway Intents 並啟用:
  • Message Content Intent(必要)
  • Server Members Intent(建議啟用;角色白名單與名稱轉 ID 功能需要此項)
  • Presence Intent(選填;僅在需要接收上線狀態更新時啟用)
3

複製 Bot Token

Bot 頁面向上捲動,點選 Reset Token
儘管名稱叫「Reset」,這實際上是第一次產生你的 Token,並非重置既有的 Token。
複製 Token 並妥善保存。這是你的 Bot Token,稍後需要用到。
4

產生邀請網址並將 Bot 加入伺服器

點選側邊欄的 OAuth2,產生含有適當權限的邀請網址,以將 Bot 加入伺服器。向下捲動至 OAuth2 URL Generator 並勾選:
  • bot
  • applications.commands
下方會出現 Bot Permissions 區塊,請啟用:
  • View Channels(檢視頻道)
  • Send Messages(傳送訊息)
  • Read Message History(讀取訊息記錄)
  • Embed Links(嵌入連結)
  • Attach Files(附加檔案)
  • Add Reactions(新增反應,選填)
複製底部產生的網址,貼到瀏覽器,選擇你的伺服器,點選 Continue 完成連接。你應該可以在 Discord 伺服器中看到你的 Bot。
5

啟用開發者模式並收集 ID

回到 Discord 應用程式,你需要啟用開發者模式以便複製內部 ID。
  1. 點選 用戶設定(頭像旁的齒輪圖示)→ 進階 → 開啟 開發者模式
  2. 右鍵點選側邊欄的 伺服器圖示複製伺服器 ID
  3. 右鍵點選你的 頭像複製用戶 ID
伺服器 ID用戶 ID 連同 Bot Token 一起保存——下一步你需要將三者都傳給 OpenClaw。
6

允許從伺服器成員接收私訊

要使配對功能正常運作,Discord 需要允許你的 Bot 向你傳送私訊。右鍵點選伺服器圖示隱私設定 → 開啟 私訊這讓伺服器成員(包括 Bot)可以向你傳送私訊。如果你想搭配 OpenClaw 使用 Discord 私訊,請保持此設定啟用。若你只打算使用伺服器頻道,配對完成後可以關閉。
7

步驟 0:安全地設定 Bot Token(不要在聊天中傳送)

你的 Discord Bot Token 是機密資訊(類似密碼)。請在執行 OpenClaw 的機器上設定,再開始與 Agent 聊天。
如果 OpenClaw 已作為背景服務執行,請改用 openclaw gateway restart
8

設定 OpenClaw 並配對

透過任何現有頻道(例如 Telegram)與你的 OpenClaw Agent 對話並告知它。如果 Discord 是你的第一個頻道,請改用 CLI / 設定 頁籤。
“我已在設定中設好我的 Discord Bot Token。請用 User ID <user_id> 和 Server ID <server_id> 完成 Discord 設定。”
9

核准第一次私訊配對

等待 Gateway 啟動後,在 Discord 中向你的 Bot 傳送私訊,Bot 會回覆一組配對碼。
透過現有頻道將配對碼傳給你的 Agent:
“請核准此 Discord 配對碼:<CODE>
配對碼在 1 小時後過期。你現在應該可以透過 Discord 私訊與你的 Agent 聊天了。
Token 解析具備帳號感知能力。設定中的 Token 優先於環境變數備援。DISCORD_BOT_TOKEN 僅適用於預設帳號。 進階輸出呼叫(訊息工具/頻道操作)使用該呼叫的明確 per-call token。帳號政策/重試設定仍來自當前執行快照中選取的帳號。

建議:設定伺服器工作區

私訊運作正常後,你可以將 Discord 伺服器設定為完整工作區,讓每個頻道擁有獨立的 Agent 工作階段與情境。這對於只有你和 Bot 的私人伺服器特別推薦。
1

將你的伺服器加入伺服器白名單

這讓你的 Agent 能在伺服器的任何頻道回覆,而不只是私訊。
“請將我的 Discord 伺服器 ID <server_id> 加入伺服器白名單”
2

允許不需要 @mention 即可回覆

預設情況下,你的 Agent 只會在伺服器頻道被 @mention 時回覆。對於私人伺服器,你可能希望它回覆每一條訊息。
“讓我的 Agent 在這個伺服器上無需被 @mention 就能回覆”
3

規劃伺服器頻道的記憶機制

預設情況下,長期記憶(MEMORY.md)只會在私訊工作階段載入。伺服器頻道不會自動載入 MEMORY.md。
“當我在 Discord 頻道提問時,如需 MEMORY.md 的長期情境請使用 memory_search 或 memory_get。”
現在在你的 Discord 伺服器上建立一些頻道並開始聊天。你的 Agent 可以看到頻道名稱,每個頻道都有自己獨立的工作階段,所以你可以設定 #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
範例:傳送至論壇父頻道以建立討論串
範例:明確建立論壇討論串
論壇父頻道不接受 Discord 元件。如果需要元件,請傳送至討論串本身(channel:<threadId>)。

互動元件

OpenClaw 支援 Agent 訊息使用 Discord 元件 v2 容器。使用訊息工具並附上 components 載荷。互動結果會作為一般收入訊息路由回 Agent,並遵循現有的 Discord replyToMode 設定。 支援的區塊:
  • textsectionseparatoractionsmedia-galleryfile
  • Action rows 允許最多 5 個按鈕或一個下拉選單
  • 下拉選單類型:stringuserrolementionablechannel
預設情況下,元件為單次使用。設定 components.reusable=true 可讓按鈕、下拉選單和表單在過期前多次使用。 若要限制誰可以點擊按鈕,請在該按鈕上設定 allowedUsers(Discord 用戶 ID、標籤或 *)。設定後,不符合的用戶會收到暫時性拒絕通知。 /model/models 斜線指令會開啟互動式模型選擇器,包含提供者和模型下拉選單及提交步驟。選擇器回覆為暫時性,只有呼叫者可以使用。 檔案附件:
  • file 區塊必須指向附件參照(attachment://<filename>
  • 透過 media/path/filePath 提供附件(單一檔案);多個檔案使用 media-gallery
  • 使用 filename 在上傳名稱需要符合附件參照時覆寫名稱
Modal 表單:
  • components.modal 中新增最多 5 個欄位
  • 欄位類型:textcheckboxradioselectrole-selectuser-select
  • OpenClaw 會自動新增觸發按鈕
範例:

存取控制與路由

channels.discord.dmPolicy 控制私訊存取(舊版:channels.discord.dm.policy):
  • pairing(預設)
  • allowlist
  • open(需要 channels.discord.allowFrom 包含 "*";舊版:channels.discord.dm.allowFrom
  • disabled
若私訊政策非 open,未知用戶將被封鎖(或在 pairing 模式下提示配對)。多帳號優先順序:
  • channels.discord.accounts.default.allowFrom 僅適用於 default 帳號。
  • 具名帳號在未設定自己的 allowFrom 時,繼承 channels.discord.allowFrom
  • 具名帳號不繼承 channels.discord.accounts.default.allowFrom
傳送的私訊目標格式:
  • user:<id>
  • <@id> mention
裸數字 ID 因具有歧義性而被拒絕,除非提供明確的 user/channel 目標類型。

基於角色的 Agent 路由

使用 bindings[].match.roles 可依角色 ID 將 Discord 伺服器成員路由至不同的 Agent。基於角色的 binding 僅接受角色 ID,優先順序在 peer 或 parent-peer binding 之後、純伺服器 binding 之前評估。若 binding 同時設定了其他 match 欄位(例如 peer + guildId + roles),所有設定的欄位都必須符合。

開發者入口網站設定

  1. Discord 開發者入口網站 -> Applications -> New Application
  2. Bot -> Add Bot
  3. 複製 Bot Token
Bot -> Privileged Gateway Intents 中啟用:
  • Message Content Intent
  • Server Members Intent(建議)
Presence Intent 為選填,只有在需要接收成員上線狀態更新時才需要。設定 Bot presence(setPresence)不需要啟用成員 presence 更新。
OAuth URL 產生器:
  • 範圍:botapplications.commands
典型基本權限:
  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions(選填)
除非明確需要,否則避免 Administrator
啟用 Discord 開發者模式,然後複製:
  • 伺服器 ID
  • 頻道 ID
  • 用戶 ID
在 OpenClaw 設定中優先使用數字 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(預設)
  • first
  • all
注意:off 停用隱式回覆串。明確的 [[reply_to_*]] 標籤仍然有效。訊息 ID 會顯示在情境/記錄中,讓 Agent 可以針對特定訊息回覆。
OpenClaw 可以透過傳送暫時訊息並在文字到來時編輯它來串流草稿回覆。
  • channels.discord.streaming 控制預覽串流(off | partial | block | progress,預設:off)。
  • progress 為跨頻道一致性而被接受,在 Discord 上映射為 partial
  • channels.discord.streamMode 是舊版別名,會自動遷移。
  • partial 在 Token 到來時編輯單一預覽訊息。
  • block 發出草稿大小的區塊(使用 draftChunk 調整大小和分割點)。
範例:
block 模式區塊預設值(受 channels.discord.textChunkLimit 限制):
預覽串流僅適用於文字;媒體回覆會退回到一般傳送方式。注意:預覽串流與區塊串流是分開的。當 Discord 明確啟用區塊串流時,OpenClaw 會跳過預覽串流以避免雙重串流。
伺服器記錄情境:
  • channels.discord.historyLimit 預設 20
  • 備援:messages.groupChat.historyLimit
  • 0 停用
私訊記錄控制:
  • channels.discord.dmHistoryLimit
  • channels.discord.dms["<user_id>"].historyLimit
討論串行為:
  • Discord 討論串以頻道工作階段路由
  • 父討論串中繼資料可用於父工作階段連結
  • 討論串設定繼承父頻道設定,除非有特定的討論串項目
頻道主題注入為不可信任的情境(不作為系統提示)。
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 及相關討論串綁定操作將無法使用。
請參閱子 AgentACP Agents設定參考
若要建立穩定的「永遠在線」ACP 工作區,請設定指向 Discord 對話的頂層類型化 ACP binding。設定路徑:
  • bindings[] 包含 type: "acp"match.channel: "discord"
範例:
注意:
  • 討論串訊息可繼承父頻道的 ACP binding。
  • 在已綁定的頻道或討論串中,/new/reset 會就地重置相同的 ACP 工作階段。
  • 暫時性討論串綁定仍有效,可在活躍時覆寫目標解析。
請參閱 ACP Agents 了解 binding 行為詳細說明。
每個伺服器的反應通知模式:
  • off
  • own(預設)
  • all
  • allowlist(使用 guilds.<id>.users
反應事件會轉換為系統事件,並附加至路由的 Discord 工作階段。
ackReaction 在 OpenClaw 處理收入訊息時傳送確認 emoji。解析順序:
  • channels.discord.accounts.<accountId>.ackReaction
  • channels.discord.ackReaction
  • messages.ackReaction
  • Agent 身份 emoji 備援(agents.list[].identity.emoji,否則使用 ”👀”)
注意:
  • Discord 接受 unicode emoji 或自訂 emoji 名稱。
  • 使用 "" 停用特定頻道或帳號的反應。
頻道發起的設定寫入預設啟用。這影響 /config set|unset 流程(當指令功能已啟用時)。停用:
透過 channels.discord.proxy 將 Discord Gateway WebSocket 流量和啟動 REST 查詢(應用程式 ID + 白名單解析)路由至 HTTP(S) Proxy。
每帳號覆寫:
啟用 PluralKit 解析以將代理訊息映射至系統成員身份:
注意:
  • 白名單可使用 pk:<memberId>
  • 成員顯示名稱僅在 channels.discord.dangerouslyAllowNameMatching: true 時才以名稱/slug 比對
  • 查詢使用原始訊息 ID 並受時間窗限制
  • 若查詢失敗,代理訊息被視為 Bot 訊息而被丟棄,除非設定了 allowBots=true
當你設定狀態或活動欄位,或啟用自動上線狀態時,上線狀態更新會被套用。僅設定狀態範例:
活動範例(自訂狀態是預設活動類型):
串流範例:
活動類型對應:
  • 0:Playing(遊玩)
  • 1:Streaming(串流,需要 activityUrl
  • 2:Listening(聆聽)
  • 3:Watching(觀看)
  • 4:Custom(自訂,使用活動文字作為狀態文字;emoji 選填)
  • 5:Competing(競技)
自動上線狀態範例(執行時健康訊號):
自動上線狀態將執行時可用性映射至 Discord 狀態:健康 => online,降級或未知 => idle,耗盡或不可用 => dnd。選填文字覆寫:
  • autoPresence.healthyText
  • autoPresence.degradedText
  • autoPresence.exhaustedText(支援 {reason} 佔位符)
Discord 支援私訊中基於按鈕的執行核准,也可以選擇性地在來源頻道張貼核准提示。設定路徑:
  • channels.discord.execApprovals.enabled
  • channels.discord.execApprovals.approvers
  • channels.discord.execApprovals.targetdm | channel | both,預設:dm
  • agentFiltersessionFiltercleanupAfterResolve
targetchannelboth 時,核准提示在頻道中可見。只有已設定的核准者可以使用按鈕;其他用戶會收到暫時性拒絕。核准提示包含指令文字,因此請只在受信任的頻道啟用頻道傳送。若頻道 ID 無法從工作階段金鑰取得,OpenClaw 會退回至私訊傳送。此處理程式的 Gateway 驗證使用與其他 Gateway 客戶端相同的共享憑證解析:
  • 環境優先的本地驗證(OPENCLAW_GATEWAY_TOKEN / OPENCLAW_GATEWAY_PASSWORD,然後 gateway.auth.*
  • 本地模式下,只有在 gateway.auth.* 未設定時,gateway.remote.* 才可作為備援;已設定但無法解析的本地 SecretRef 會失敗關閉
  • 適用時透過 gateway.remote.* 支援遠端模式
  • URL 覆寫是安全的:CLI 覆寫不重用隱式憑證,環境覆寫僅使用環境憑證
若核准失敗並顯示未知的核准 ID,請確認核准者清單和功能啟用狀態。相關文件:執行核准

工具與操作閘門

Discord 訊息操作包括訊息傳送、頻道管理、版主操作、上線狀態和中繼資料操作。 核心範例:
  • 訊息:sendMessagereadMessageseditMessagedeleteMessagethreadReply
  • 反應:reactreactionsemojiList
  • 版主:timeoutkickban
  • 上線狀態:setPresence
操作閘門位於 channels.discord.actions.* 預設閘門行為:

元件 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.nativechannels.discord.commands.native)。
  • 設定 channels.discord.voice
  • Bot 需要在目標語音頻道擁有 Connect + Speak 權限。
使用 Discord 限定的原生指令 /vc join|leave|status 控制工作階段。該指令使用帳號預設 Agent,並遵循與其他 Discord 指令相同的白名單和群組政策規則。 自動加入範例:
注意:
  • voice.tts 僅覆寫語音播放的 messages.tts
  • 語音轉錄輪次從 Discord allowFrom(或 dm.allowFrom)取得擁有者狀態;非擁有者的發言者無法存取僅限擁有者的工具(例如 gatewaycron)。
  • 語音預設啟用;設定 channels.discord.voice.enabled=false 可停用。
  • voice.daveEncryptionvoice.decryptionFailureTolerance 傳遞至 @discordjs/voice 的加入選項。
  • @discordjs/voice 的預設值為 daveEncryption=truedecryptionFailureTolerance=24(若未設定)。
  • OpenClaw 也監視接收解密失敗,並在短時間內重複失敗後自動離開/重新加入語音頻道進行恢復。
  • 若接收日誌持續顯示 DecryptionFailed(UnencryptedWhenPassthroughDisabled),這可能是 discord.js #11419 追蹤的上游 @discordjs/voice 接收錯誤。

語音訊息

Discord 語音訊息顯示波形預覽,需要 OGG/Opus 音訊及中繼資料。OpenClaw 會自動產生波形,但需要 Gateway 主機上有 ffmpegffprobe 才能檢視和轉換音訊檔案。 需求與限制:
  • 必須提供本地檔案路徑(不接受 URL)。
  • 省略文字內容(Discord 不允許在相同載荷中同時包含文字和語音訊息)。
  • 接受任何音訊格式;OpenClaw 在需要時會轉換為 OGG/Opus。
範例:

疑難排解

  • 啟用 Message Content Intent
  • 當你依賴用戶/成員解析時,啟用 Server Members Intent
  • 變更 Intent 後重啟 Gateway
  • 確認 groupPolicy
  • 確認 channels.discord.guilds 下的伺服器白名單
  • 若伺服器有 channels 映射,只有列出的頻道才被允許
  • 確認 requireMention 行為與 mention 模式
實用的指令:
常見原因:
  • groupPolicy="allowlist" 但沒有符合的伺服器/頻道白名單
  • requireMention 設定在錯誤的位置(必須在 channels.discord.guilds 或頻道項目下)
  • 發送者被伺服器/頻道的 users 白名單封鎖
典型日誌:
  • Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATE
  • Slow 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 發送的訊息會被忽略。若你設定了 channels.discord.allowBots=true,請使用嚴格的 mention 和白名單規則以避免循環行為。 建議使用 channels.discord.allowBots="mentions" 以僅接受有 mention Bot 的 Bot 訊息。
  • 保持 OpenClaw 最新(openclaw update)以確保 Discord 語音接收恢復邏輯存在
  • 確認 channels.discord.voice.daveEncryption=true(預設值)
  • channels.discord.voice.decryptionFailureTolerance=24(上游預設)開始,只在需要時調整
  • 監看日誌:
    • discord voice: DAVE decrypt failures detected
    • discord voice: repeated decrypt failures; attempting rejoin
  • 若在自動重新加入後仍持續失敗,請收集日誌並對照 discord.js #11419

設定參考指引

主要參考: Discord 重要欄位:
  • 啟動/驗證:enabledtokenaccounts.*allowBots
  • 政策:groupPolicydm.*guilds.*guilds.*.channels.*
  • 指令:commands.nativecommands.useAccessGroupsconfigWritesslashCommand.*
  • 事件佇列:eventQueue.listenerTimeout(監聽器預算)、eventQueue.maxQueueSizeeventQueue.maxConcurrency
  • 收入工作:inboundWorker.runTimeoutMs
  • 回覆/記錄:replyToModehistoryLimitdmHistoryLimitdms.*.historyLimit
  • 傳送:textChunkLimitchunkModemaxLinesPerMessage
  • 串流:streaming(舊版別名:streamMode)、draftChunkblockStreamingblockStreamingCoalesce
  • 媒體/重試:mediaMaxMbretry
    • mediaMaxMb 限制 Discord 上傳大小(預設:8MB
  • 操作:actions.*
  • 上線狀態:activitystatusactivityTypeactivityUrl
  • UI:ui.components.accentColor
  • 功能:threadBindings、頂層 bindings[]type: "acp")、pluralkitexecApprovalsintentsagentComponentsheartbeatresponsePrefix

安全性與操作

  • 將 Bot Token 視為機密資訊(建議在受監控的環境中使用 DISCORD_BOT_TOKEN)。
  • 授予最小必要的 Discord 權限。
  • 若指令部署/狀態已過期,重啟 Gateway 並用 openclaw channels status --probe 重新確認。

相關文件