Discord (Bot API)
状态:已准备好通过官方 Discord Gateway 网关支持私信和频道。Pairing
Slash commands
Channel 故障排除
快速设置
您需要创建一个带有机器人的新应用程序,将该机器人添加到您的服务器,并将其与 OpenClaw 配对。我们建议将您的机器人添加到您自己的私人服务器。如果您还没有私人服务器,请先创建一个(选择 Create My Own > For me and my friends)。创建 Discord 应用程序和机器人
Enable privileged intents
- Message Content Intent(必需)
- Server Members Intent(推荐;角色允许列表和名称到 ID 匹配所必需)
- Presence Intent(可选;仅需要用于状态更新)
复制您的机器人令牌
生成邀请链接并将机器人添加到您的服务器
botapplications.commands
- View Channels(查看频道)
- Send Messages(发送消息)
- Read Message History(阅读消息历史)
- Embed Links(嵌入链接)
- Attach Files(附件)
- Add Reactions(添加表情,可选)
启用开发者模式并收集您的 ID
- 点击 User Settings(头像旁边的齿轮图标)→ Advanced → 打开 Developer Mode 开关
- 右键点击侧边栏中的 server icon(服务器图标)→ Copy Server ID(复制服务器 ID)
- 右键点击您 own avatar(自己的头像)→ Copy User ID(复制用户 ID)
Allow 私信 from server members
安全设置您的机器人令牌(不要在聊天中发送它)
openclaw gateway restart。配置 OpenClaw 并配对
- 询问您的代理
- CLI / config
“我已经在配置中设置了我的 Discord 机器人令牌。请使用用户 ID<user_id>和服务器 ID<server_id>完成 Discord 设置。”
DISCORD_BOT_TOKEN
仅用于默认账户。对于高级出站调用(消息工具/渠道操作), 该调用使用显式的每次调用
token。这适用于发送和读取/探测风格
的操作(例如读取/搜索/获取/线程/置顶/权限)。账户策略/重试设置
仍然来自活动运行时快照中选定的账户。推荐:设置 guild 工作区
一旦私信开始工作,你就可以将你的 Discord 服务器设置为完整的工作区,其中每个渠道都有自己的 agent 会话和上下文。建议对于只有你和你的机器人的私有服务器使用此设置。将你的服务器添加到公会允许列表
- 询问你的 Agent
- Config
“将我的 Discord 服务器 ID <server_id> 添加到公会允许列表”
允许在无需 @提及的情况下响应
- 询问你的 Agent
- Config
“允许我的 Agent 在此服务器上响应而无需被 @提及”
#coding、#home、#research 或任何适合你工作流程的频道。
运行时模型
- Gateway(网关) 网关拥有 Discord 连接。
- 回复路由是确定性的:Discord 的入站消息会回复到 Discord。
- 默认情况下 (
session.dmScope=main),直接聊天共享智能体主会话 (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 支持用于代理消息的 Discord 组件 v2 容器。将消息工具与components 载荷一起使用。交互结果作为普通入站消息路由回代理,并遵循现有的 Discord replyToMode 设置。
支持的块:
text、section、separator、actions、media-gallery、file- 操作行最多允许 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 会自动添加一个触发按钮
访问控制和路由
- 私信 policy
- Guild policy
- Mentions and group 私信
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>提及
基于角色的代理路由
使用bindings[].match.roles 根据 角色 ID 将 Discord 服务器成员路由到不同的代理。基于角色的绑定仅接受角色 ID,并在对等或父级对等绑定之后、仅服务器绑定之前进行评估。如果绑定还设置了其他匹配字段(例如 peer + guildId + roles),则所有配置的字段都必须匹配。
开发者门户设置
创建应用和机器人
创建应用和机器人
- Discord 开发者门户 -> Applications -> New Application
- Bot -> Add Bot
- 复制机器人令牌
Privileged intents
Privileged intents
- Message Content Intent
- Server Members Intent(推荐)
setPresence) 不需要为成员启用在线状态更新。OAuth scopes and baseline permissions
OAuth scopes and baseline permissions
- scopes:
bot,applications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions(可选)
Administrator。复制 ID
复制 ID
- 服务器 ID
- 渠道 ID
- 用户 ID
原生命令和命令身份验证
commands.native默认为"auto"并已针对 Discord 启用。- 按渠道覆盖:
channels.discord.commands.native。 commands.native=false明确清除先前注册的 Discord 原生命令。- 原生命令身份验证使用与普通消息处理相同的 Discord 允许列表/策略。
- 对于未获授权的用户,命令在 Discord UI 中可能仍然可见;执行时仍会强制执行 OpenClaw 身份验证并返回“未授权”。
ephemeral: true
功能详情
Reply tags and native replies
Reply tags and native replies
实时流预览
实时流预览
channels.discord.streaming控制预览流式传输(off|partial|block|progress,默认值:off)。- 默认保持
off,因为 Discord 预览编辑可能会很快达到速率限制,尤其是当多个机器人或网关共享同一帐户或服务器流量时。 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 线程被作为渠道会话进行路由
- 父线程元数据可用于父会话链接
- 线程配置继承父渠道配置,除非存在特定于线程的条目
Thread-bound sessions for subagents
Thread-bound sessions for subagents
/focus <target>将当前/新线程绑定到子代理/会话目标/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和相关的线程绑定操作将不可用。
Persistent ACP 渠道 bindings
Persistent ACP 渠道 bindings
bindings[]以及type: "acp"和match.channel: "discord"
- 线程消息可以继承父渠道 ACP 绑定。
- 在绑定的渠道或线程中,
/new和/reset会就地重置同一 ACP 会话。 - 临时线程绑定仍然有效,并且可以在活动时覆盖目标解析。
Reaction notifications
Reaction notifications
offown(默认)allallowlist(使用guilds.<id>.users)
Ack reactions
Ack reactions
ackReaction 会发送确认表情符号。解析顺序:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- 代理身份表情符号回退(
agents.list[].identity.emoji,否则为 ”👀”)
- Discord 接受 unicode 表情符号或自定义表情符号名称。
- 使用
""为渠道或账户禁用反应。
Config writes
Config writes
/config set|unset 流程(当命令功能启用时)。禁用:Gateway(网关) proxy
Gateway(网关) proxy
channels.discord.proxy 的 HTTP(S) 代理路由 Discord 网关 WebSocket 流量和启动 REST 查询(应用程序 ID + 允许列表解析)。PluralKit support
PluralKit support
- 允许列表可以使用
pk:<memberId> - 仅在
channels.discord.dangerouslyAllowNameMatching: true时按名称/缩略名匹配成员显示名称 - 查询使用原始消息 ID 并受时间窗口限制
- 如果查询失败,代理消息将被视为机器人消息并丢弃,除非
allowBots=true
在线状态配置
在线状态配置
- 0:正在游戏
- 1:正在直播(需要
activityUrl) - 2:正在听
- 3:正在观看
- 4:自定义(将活动文本用作状态状态;表情符号可选)
- 5:正在竞争
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(支持{reason}占位符)
在 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.*用作回退;已配置但未解析的本地 SecretRefs 将以失败关闭 - 在适用时通过
gateway.remote.*支持远程模式 - URL 覆盖是覆盖安全的:CLI 覆盖不重用隐式凭据,环境覆盖仅使用环境凭据
工具和操作门控
Discord 消息操作包括消息传递、渠道管理、审核、在线状态和元数据操作。 核心示例:- 消息传递:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - 回应:
react,reactions,emojiList - 管理:
timeout,kick,ban - presence:
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 components v2 进行执行审批和跨上下文标记。Discord 消息操作还可以接受components 以实现自定义 UI(高级;需要 Carbon 组件实例),而旧版的 embeds 仍然可用,但不推荐使用。
channels.discord.ui.components.accentColor设置 Discord 组件容器使用的强调色(十六进制)。- 使用
channels.discord.accounts.<id>.ui.components.accentColor为每个账户进行设置。 - 当存在 components v2 时,
embeds会被忽略。
语音频道
OpenClaw 可以加入 Discord 语音频道进行实时、连续的对话。这与语音消息附件是分开的。 要求:- 启用原生命令(
commands.native或channels.discord.commands.native)。 - 配置
channels.discord.voice。 - 机器人需要在目标语音频道中拥有连接和发言权限。
/vc join|leave|status 来控制会话。该命令使用账户默认代理,并遵循与其他 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 会自动生成波形,但它需要网关主机上可用ffmpeg 和 ffprobe 来检查和转换音频文件。
要求和限制:
- 提供 本地文件路径 (不接受 URL)。
- 省略文本内容( Discord 不允许在同一载荷中同时包含文本和语音消息)。
- 接受任何音频格式; OpenClaw 会在需要时将其转换为 OGG/Opus。
故障排除
使用了不允许的意图或机器人看不到服务器消息
使用了不允许的意图或机器人看不到服务器消息
- 启用消息内容意图
- 当您依赖用户/成员解析时,启用服务器成员意图
- 更改意图后重启网关
Guild messages blocked unexpectedly
Guild messages blocked unexpectedly
- 验证
groupPolicy - 验证
channels.discord.guilds下的公会允许列表 - 如果存在
channels映射,则仅允许列出的渠道 - 验证
requireMention行为和提及模式
Require mention false but still blocked
Require mention false but still blocked
groupPolicy="allowlist"没有匹配的公会/渠道允许列表requireMention配置位置错误(必须在channels.discord.guilds或渠道条目下)- 发送者被公会/渠道
users允许列表阻止
Long-running handlers time out or duplicate replies
Long-running handlers time out or duplicate replies
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 进行慢速监听器设置,仅当您希望为排队的智能体轮次设置单独的安全阀时才使用 inboundWorker.runTimeoutMs。Permissions audit mismatches
Permissions audit mismatches
channels status --probe 权限检查仅适用于数字渠道 ID。如果使用 slug 键,运行时匹配仍然可以工作,但探针无法完全验证权限。私信和配对问题
私信和配对问题
- 私信已禁用:
channels.discord.dm.enabled=false - 私信策略已禁用:
channels.discord.dmPolicy="disabled"(旧版:channels.discord.dm.policy) - 正在
pairing模式下等待配对批准
机器人之间的循环
机器人之间的循环
channels.discord.allowBots=true,请使用严格的提及和允许列表规则来避免循环行为。
优先使用 channels.discord.allowBots="mentions" 以仅接受提及该机器人的机器人消息。语音 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 字段:- startup/auth:
enabled,token,accounts.*,allowBots - policy:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - command:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - event queue:
eventQueue.listenerTimeout(listener budget),eventQueue.maxQueueSize,eventQueue.maxConcurrency - inbound worker:
inboundWorker.runTimeoutMs - reply/history:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - delivery:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(legacy alias:streamMode),draftChunk,blockStreaming,blockStreamingCoalesce - media/retry:
mediaMaxMb,retrymediaMaxMb限制出站 Discord 上传(默认:8MB)
- actions:
actions.* - presence:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - features:
threadBindings, 顶级bindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
安全与运维
- 请将 bot token 视为机密信息(在受监管的环境中首选
DISCORD_BOT_TOKEN)。 - 授予最小权限 Discord 权限。
- 如果 command deploy/state 过时,请重启网关并使用
openclaw channels status --probe重新检查。
相关
本页面源自 openclaw/openclaw,由 BeaversLab 翻译,遵循 MIT 协议 发布。