Discord(机器人 API)
状态:通过官方 Discord 网关已准备好支持私信和公会频道。快速设置
你需要创建一个新的应用程序和机器人,将机器人添加到服务器,并将其配对到 OpenClaw。建议将机器人添加到你自己的私有服务器。如果还没有服务器,请先创建一个(选择创建我的专属服务器 > 为我和我的朋友)。创建 Discord 应用程序和机器人
访问 Discord 开发者门户 并点击 新应用。命名为类似 “OpenClaw”。点击侧边栏中的 机器人。将 用户名 设置为你的 OpenClaw 代理名称。
启用特权 intents
仍在 机器人 页面,向下滚动到 特权网关 Intents 并启用:
- 消息内容意图(必需)
- 服务器成员意图(建议;角色白名单和名称到 ID 匹配所需)
- 在线状态意图(可选;仅在需要在线状态更新时启用)
生成邀请链接并将机器人添加到服务器
点击侧边栏的 OAuth2。你将生成具备正确权限的邀请链接以添加机器人到服务器。向下滚动至 OAuth2 URL 生成器,启用:
botapplications.commands
- 查看频道
- 发送消息
- 读取消息历史
- 嵌入链接
- 附加文件
- 添加表情反应(可选)
启用开发者模式并收集 ID
返回 Discord 应用,需启用开发者模式以便复制内部 ID。
- 点击 用户设置(头像旁齿轮图标)→ 高级 → 打开 开发者模式
- 右击侧边栏的服务器图标→复制服务器 ID
- 右击你的头像→复制用户 ID
允许服务器成员发送私信
为了配对生效,Discord 需要允许机器人给你发私信。右击服务器图标→隐私设置→启用私信。这允许服务器成员(包括机器人)向你发送私信。若想用 OpenClaw 的 Discord 私信功能,请保持开启。若只打算使用公会频道,配对完成后可以关闭私信。
第 0 步:安全设置机器人令牌(勿在聊天中发送)
你的 Discord 机器人令牌是机密(类似密码)。请在运行 OpenClaw 的机器上设置它,然后再给你的代理发消息。如果 OpenClaw 已作为后台服务运行,请用
openclaw gateway restart 重启。配置 OpenClaw 并配对
- 向代理询问
- CLI / 配置
在任何已有频道(如 Telegram)与 OpenClaw 代理聊天并告知。如果 Discord 是你的第一个频道,请使用 CLI / 配置标签页。
“我已经在配置中设置了 Discord 机器人令牌。请用用户 ID<user_id>和服务器 ID<server_id>完成 Discord 设置。”
令牌解析是账户感知的。配置中的令牌优先于环境变量回退。
DISCORD_BOT_TOKEN 仅用于默认账户。推荐:设置公会工作区
私信功能正常后,你可以将 Discord 服务器设置为完整工作区,每个频道都有自己的代理会话和上下文。建议在只有你和机器人使用的私有服务器上这样做。
现在你可以在 Discord 服务器创建频道并开始对话。代理能看到频道名,每个频道拥有独立会话 — 你可以设立
#coding、#home、#research 等,以契合你的工作流程。
运行时模型
- 网关拥有 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 会自动添加触发按钮
访问控制与路由
- 私信策略
- 公会策略
- 提及与群体私信
channels.discord.dmPolicy 控制私信访问(旧名:channels.discord.dm.policy):pairing(默认)allowlistopen(需要channels.discord.allowFrom包含"*";旧名:channels.discord.dm.allowFrom)disabled
pairing 模式提示配对)。多账户优先级:channels.discord.accounts.default.allowFrom仅适用于默认账户。- 命名账户继承
channels.discord.allowFrom,若自身无设置。 - 命名账户不继承
channels.discord.accounts.default.allowFrom。
user:<id><@id>提及格式
基于角色的代理路由
使用bindings[].match.roles 按角色 ID 将 Discord 公会成员路由至不同代理。基于角色的绑定仅接受角色 ID,优先级低于 peer 或 parent-peer 绑定,高于仅公会绑定。如果绑定同时设置多个匹配字段(如 peer + guildId + roles),则所有字段须匹配。
开发者门户设置
创建应用和机器人
创建应用和机器人
- Discord 开发者门户 -> 应用 -> 新建应用程序
- 机器人 -> 添加机器人
- 复制机器人令牌
特权 Intents
特权 Intents
在 机器人 -> 特权网关 Intents,启用:
- 消息内容意图
- 服务器成员意图(建议)
setPresence)不需开启成员在线状态更新。OAuth 范围与基础权限
OAuth 范围与基础权限
OAuth URL 生成器:
- 范围:
bot、applications.commands
- 查看频道
- 发送消息
- 读取消息历史
- 嵌入链接
- 附加文件
- 添加表情反应(可选)
复制 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 支持代理输出中的回复标签:
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode 控制:off(默认)firstall
off 禁用隐式回复线程。显式 [[reply_to_*]] 仍然生效。消息 ID 会在上下文/历史中提供,供代理指向特定消息。实时流预览
实时流预览
OpenClaw 可通过发送临时消息并编辑其内容流式传输草稿回复。预览流限文本,媒体回复回落为常规发送。注意:预览流与块流区分,若启用 Discord 的块流,OpenClaw 会跳过预览避免重复流。
channels.discord.streaming控制预览流模式(off|partial|block|progress,默认off)。progress为跨频道一致性被接受,但在 Discord 映射为partial。channels.discord.streamMode为旧别名,支持自动迁移。partial模式下,单条预览消息随代币渐进编辑。block模式下,输出草稿大小块(可使用draftChunk调整大小和断点)。
block 模式默认分块(受限于 channels.discord.textChunkLimit):历史、上下文与线程行为
历史、上下文与线程行为
公会历史上下文:
channels.discord.historyLimit默认20- 后备:
messages.groupChat.historyLimit - 设
0以禁用
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Discord 线程被路由为频道会话
- 可用父线程元数据做父会话关联
- 线程配置继承父频道配置,除非存在线程专用配置
线程绑定会话支持子代理
线程绑定会话支持子代理
Discord 可将线程绑定到会话目标,线程内后续消息保留同会话(含子代理会话)。命令:说明:
/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及相关线程绑定操作不可用。
持久 ACP 频道绑定
持久 ACP 频道绑定
对于稳定“常驻” ACP 工作区,可配置顶层 Typed ACP 绑定目标为 Discord 会话。配置路径:说明:
bindings[],type: "acp",match.channel: "discord"
- 线程消息可继承父频道 ACP 绑定。
- 在绑定频道或线程内,
/new和/reset会重置同一 ACP 会话。 - 临时线程绑定仍有效,且在激活时可覆盖目标解析。
表情反应通知
表情反应通知
按公会配置表情反应通知模式:
offown(默认)allallowlist(使用guilds.<id>.users)
确认反应
确认反应
ackReaction 在 OpenClaw 处理中入站消息时发送确认表情。解析顺序:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- 代理身份表情回退(
agents.list[].identity.emoji,否则为 ”👀”)
- Discord 支持 Unicode 或自定义表情名。
- 用
""禁用指定频道或账户的确认表情。
配置写入
配置写入
默认启用频道发起的配置写入。这影响启用命令功能时的
/config set|unset 流程。禁用示例:网关代理
网关代理
通过 HTTP(S) 代理代理 Discord 网关 WebSocket 流量和启动 REST 查询(应用 ID + 白名单)。可针对单账户覆盖:
PluralKit 支持
PluralKit 支持
启用 PluralKit 解析,将代理消息映射至系统成员身份:说明:
- 白名单中可使用
pk:<memberId> - 成员显示名仅名称/slug 匹配时需开启
channels.discord.dangerouslyAllowNameMatching: true - 通过原始消息 ID 进行查询,受时间窗限制
- 查询失败则将代理消息视为机器人消息丢弃,除非
allowBots=true
在线状态配置
在线状态配置
设置状态或活动字段启用在线状态更新,或者启用自动在线状态。仅状态示例:活动示例(自定义状态为默认类型):流媒体示例:活动类型映射:自动在线将运行时可用性映射至 Discord 状态:健康 => 在线,降级或未知 => 闲置,耗尽或不可用 => 请勿打扰。可用文本覆盖:
- 0:游戏中
- 1:直播中(需要
activityUrl) - 2:听着
- 3:观看
- 4:自定义(状态使用活动文本,表情可选)
- 5:竞赛中
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
channel 或 both,审批提示在频道可见。仅配置的审批者可用按钮,其他用户看到临时拒绝提示。审批提示包含命令文本,仅在受信频道启用频道投递。无法从会话键推导频道 ID 时,OpenClaw 退回为私信投递。Gateway auth for this handler uses the same shared credential resolution contract as other Gateway clients:- env-first local auth (
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORDthengateway.auth.*) - in local mode,
gateway.remote.*can be used as fallback whengateway.auth.*is unset - remote-mode support via
gateway.remote.*when applicable - URL overrides are override-safe: CLI overrides do not reuse implicit credentials, and env overrides use env credentials only
工具和操作门控
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 | 禁用 |
Components 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 控制会话。该命令使用账户默认代理,遵循相同白名单及公会策略。
自动加入示例:
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),可能是上游@discordjs/voice缺陷,详见 discord.js #11419。
语音消息
Discord 语音消息带波形预览,需 OGG/Opus 音频及元数据。OpenClaw 会自动生成波形,但需要网关宿主能访问ffmpeg 和 ffprobe 以检查和转换音频文件。
需求与限制:
- 提供本地文件路径(拒绝 URL)。
- 省略文本内容(Discord 不允许文本+语音消息同载荷)。
- 接受任意音频格式,必要时自动转换为 OGG/Opus。
故障排除
使用了不允许的 intents 或机器人看不到公会消息
使用了不允许的 intents 或机器人看不到公会消息
- 启用消息内容意图
- 依赖用户/成员解析时启用服务器成员意图
- 修改 intents 后重启网关
公会消息被意外阻止
公会消息被意外阻止
- 核查
groupPolicy - 核查
channels.discord.guilds的公会白名单 - 若存在公会
channels映射,仅允许列出频道 - 核查
requireMention行为与提及模式
`requireMention` 禁用但仍被阻止
`requireMention` 禁用但仍被阻止
常见原因:
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 控制监听器响应延迟,用 inboundWorker.runTimeoutMs 控制排队代理步长的超时保护。权限审核不匹配
权限审核不匹配
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 字段:- 启动/授权:
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,retry - 操作:
actions.* - 在线状态:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - 功能:
threadBindings,顶层绑定bindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
安全与运维
- 视机器人令牌为机密(受监督环境推荐使用
DISCORD_BOT_TOKEN)。 - 赋予最小权限的 Discord 权限。
- 如命令部署或状态信息过期,重启网关并用
openclaw channels status --probe重新检查。