Discord 通道
状态:通过官方 Discord Bot 网关为 DM 和频道文本提供支持。
快速设置(入门)
- 创建 Discord Bot 并复制 Bot token。
- 在 Discord 应用设置中,启用 Message Content Intent(如果您计划使用允许列表或名称查找,还需要 Server Members Intent)。
- 为 OpenClaw 设置 token:
- 环境变量:
DISCORD_BOT_TOKEN=... - 或配置:
channels.discord.token: "..."。 - 如果两者都设置,配置优先(环境变量回退仅适用于默认账户)。
- 环境变量:
- 将 Bot 邀请到您的服务器,并授予它读取/发送消息的权限(在您想要使用它的频道创建私人服务器如果您只想用于 DM)。
- 启动网关。
- DM 访问默认使用配对;首次联系时批准配对代码。
最小配置:
{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN"
}
}
}设计目标
- 通过 Discord DMs 或服务器频道与 OpenClaw 对话。
- 直接聊天折叠到智能体的主会话(默认
agent:main:main);服务器频道保持隔离为agent:<agentId>:discord:channel:<channelId>(显示名称使用discord:<guildSlug>#<channelSlug>)。 - 群组 DMs 默认忽略;通过
channels.discord.dm.groupEnabled启用,可选通过channels.discord.dm.groupChannels限制。 - 保持路由确定性:回复总是返回到它们到达的通道。
工作原理
- 创建 Discord 应用 → Bot,启用您需要的意图(DM + 服务器消息 + 消息内容),并获取 Bot token。
- 将 Bot 邀请到您的服务器,授予它读取/发送消息的权限(在您想要使用它的地方)。
- 使用
channels.discord.token配置 OpenClaw(或DISCORD_BOT_TOKEN作为回退)。 - 运行网关;当 token 可用时(配置优先,环境变量回退)且
channels.discord.enabled不为false时,它会自动启动 Discord 通道。- 如果您偏好环境变量,设置
DISCORD_BOT_TOKEN(配置块是可选的)。
- 如果您偏好环境变量,设置
- 直接聊天:使用
user:<id>(或<@id>提及)传递;所有回合落在共享的main会话中。裸数字 ID 是模糊的并被拒绝。 - 服务器频道:使用
channel:<channelId>传递。提及默认需要,并且可以按服务器或按频道设置。 - 直接聊天:默认通过
channels.discord.dm.policy(默认:"pairing")安全。未知发送者收到配对代码(1 小时后过期);通过openclaw pairing approve discord <code>批准。- 要保持旧的"向任何人开放"行为:设置
channels.discord.dm.policy="open"和channels.discord.dm.allowFrom=["*"]。 - 要硬编码允许列表:设置
channels.discord.dm.policy="allowlist"并在channels.discord.dm.allowFrom中列出发送者。 - 要忽略所有 DM:设置
channels.discord.dm.enabled=false或channels.discord.dm.policy="disabled"。
- 要保持旧的"向任何人开放"行为:设置
- 群组 DMs 默认忽略;通过
channels.discord.dm.groupEnabled启用,可选通过channels.discord.dm.groupChannels限制。 - 可选服务器规则:设置
channels.discord.guilds以服务器 ID(首选)或 slug 为键,每频道规则。 - 可选原生命令:
commands.native默认为"auto"(Discord/Telegram 开启,Slack 关闭)。用channels.discord.commands.native: true|false|"auto"覆盖;false清除之前注册的命令。文本命令由commands.text控制,必须作为独立的/...消息发送。使用commands.useAccessGroups: false绕过命令的访问组检查。- 完整命令列表 + 配置:斜杠命令
- 可选服务器上下文历史:设置
channels.discord.historyLimit(默认 20,回退到messages.groupChat.historyLimit)以在回复提及时包含最后 N 条服务器消息作为上下文。设置为0禁用。 - 反应:智能体可以通过
discord工具触发反应(由channels.discord.actions.*门控)。- 反应移除语义:见/tools/reactions。
discord工具仅在当前通道是 Discord 时暴露。
- 原生命令使用隔离的会话密钥(
agent:<agentId>:discord:slash:<userId>)而不是共享的main会话。
注意:名称 → ID 解析使用服务器成员搜索并需要 Server Members Intent;如果 Bot 无法搜索成员,使用 ID 或 <@id> 提及。 注意:Slug 是小写,空格替换为 -。频道名称 slug 化时不带前导 #。 注意:服务器上下文 [from:] 行包含 author.tag + id 使提及就绪回复容易。
配置写入
默认情况下,Discord 允许通过 /config set|unset 触发的配置更新(需要 commands.config: true)。
禁用:
{
channels: { discord: { configWrites: false } }
}如何创建您自己的 Bot
这是用于在服务器(公会)频道(如 #help)中运行 OpenClaw 的"Discord Developer Portal"设置。
1) 创建 Discord 应用 + Bot 用户
- Discord Developer Portal → Applications → New Application
- 在您的应用中:
- Bot → Add Bot
- 复制 Bot Token(这是您放入
DISCORD_BOT_TOKEN的内容)
2) 启用 OpenClaw 需要的网关意图
Discord 阻止"特权意图",除非您明确启用。
在 Bot → Privileged Gateway Intents 中,启用:
- Message Content Intent(在大多数服务器中读取消息文本所需;没有它您会看到"Used disallowed intents"或 Bot 将连接但不回复消息)
- Server Members Intent(推荐;某些成员/用户查找和允许列表匹配在服务器中需要)
您通常不需要 Presence Intent。
3) 生成邀请 URL(OAuth2 URL Generator)
在您的应用中:OAuth2 → URL Generator
Scopes
- ✅
bot - ✅
applications.commands(原生命令所需)
Bot Permissions(最小基线)
- ✅ View Channels
- ✅ Send Messages
- ✅ Read Message History
- ✅ Embed Links
- ✅ Attach Files
- ✅ Add Reactions(推荐但可选)
- ✅ Use External Emojis / Stickers(仅如果您想要它们)
避免 Administrator,除非您正在调试并且完全信任 Bot。
复制生成的 URL,打开它,选择您的服务器,并安装 Bot。
4) 获取 ID(服务器/用户/频道)
Discord 到处使用数字 ID;OpenClaw 配置偏好 ID。
- Discord(桌面/网页)→ User Settings → Advanced → 启用 Developer Mode
- 右键点击:
- 服务器名称 → Copy Server ID(服务器 ID)
- 频道(如
#help)→ Copy Channel ID - 您的用户 → Copy User ID
5) 配置 OpenClaw
Token
通过环境变量设置 Bot token(服务器上推荐):
DISCORD_BOT_TOKEN=...
或通过配置:
{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN"
}
}
}多账户支持:使用 channels.discord.accounts 配合每账户 token 和可选 name。见网关配置 了解共享模式。
允许列表 + 频道路由
示例"单个服务器,只允许我,只允许 #help":
{
channels: {
discord: {
enabled: true,
dm: { enabled: false },
guilds: {
"YOUR_GUILD_ID": {
users: ["YOUR_USER_ID"],
requireMention: true,
channels: {
help: { allow: true, requireMention: true }
}
}
},
retry: {
attempts: 3,
minDelayMs: 500,
maxDelayMs: 30000,
jitter: 0.1
}
}
}
}注意:
requireMention: true意味着 Bot 只在被提及时回复(推荐用于共享频道)。agents.list[].groupChat.mentionPatterns(或messages.groupChat.mentionPatterns)也算作服务器消息的提及。- 多智能体覆盖:在
agents.list[].groupChat.mentionPatterns上设置每智能体模式。 - 如果
channels存在,任何未列出的频道默认被拒绝。 - 使用
"*"频道条目应用所有频道的默认设置;显式频道条目覆盖通配符。 - 线程继承父频道配置(allowFrom、
requireMention、skills、prompts 等),除非您显式添加线程频道 ID。 - 默认忽略 Bot 作者的消息;设置
channels.discord.allowBots=true以允许它们(自己的消息仍被过滤)。 - 警告:如果您允许回复其他 Bot(
channels.discord.allowBots=true),通过requireMention、channels.discord.guilds.*.channels.<id>.users允许列表和/或AGENTS.md和SOUL.md中的清晰护栏防止 Bot 到 Bot 回复循环。
6) 验证它是否工作
- 启动网关。
- 在您的服务器频道中,发送:
@YourBot hello(或您的 Bot 名称是什么)。 - 如果没有反应:检查下面的故障排除。
故障排除
- 首先:运行
openclaw doctor和openclaw channels status --probe(可操作警告 + 快速审核)。 - "Used disallowed intents":启用 Message Content Intent(很可能还需要 Server Members Intent)在 Developer Portal 中,然后重启网关。
- Bot 连接但从不回复服务器频道:
- 缺少 Message Content Intent,或
- Bot 缺少频道权限(查看/发送/读取历史),或
- 您的配置需要提及而您没有提及它,或
- 您的服务器/频道允许列表拒绝该频道/用户。
requireMention: false但仍不回复:channels.discord.groupPolicy默认为 allowlist;设置它为"open"或添加channels.discord.guilds下的服务器条目(可选在channels.discord.guilds.<id>.channels下列出频道以限制)。- 如果您只设置
DISCORD_BOT_TOKEN并且从不创建channels.discord部分,运行时groupPolicy默认为open。添加channels.discord.groupPolicy、channels.defaults.groupPolicy或服务器/频道允许列表来锁定它。
- 如果您只设置
requireMention必须位于channels.discord.guilds下(或特定频道)。顶层的channels.discord.requireMention被忽略。- 权限审核(
channels status --probe)只检查数字频道 ID。如果您使用 slug/名称作为channels.discord.guilds.*.channels键,审核无法验证权限。 - DM 不工作:
channels.discord.dm.enabled=false、channels.discord.dm.policy="disabled",或者您尚未被批准(channels.discord.dm.policy="pairing")。
功能与限制
- DMs 和服务器文本频道(线程被视为单独频道;不支持语音)。
- 输入指示器尽力发送;消息分块使用
channels.discord.textChunkLimit(默认 2000)并按行数(channels.discord.maxLinesPerMessage,默认 17)分割高回复。 - 可选换行分块:设置
channels.discord.chunkMode="newline"在长度分块之前按空行(段落边界)拆分。 - 文件上传支持到配置的
channels.discord.mediaMaxMb(默认 8 MB)。 - 默认提及门控服务器回复以避免嘈杂的 Bot。
- 回复上下文在消息引用另一条消息时注入(引用内容 + ID)。
- 原生回复线程默认关闭;通过
channels.discord.replyToMode和回复标签启用。
重试策略
出站 Discord API 调用在速率限制(429)上重试,使用 Discord retry_after(当可用时),指数退避和抖动。通过 channels.discord.retry 配置。见重试策略。
配置
{
channels: {
discord: {
enabled: true,
token: "abc.123",
groupPolicy: "allowlist",
guilds: {
"*": {
channels: {
general: { allow: true }
}
}
},
mediaMaxMb: 8,
actions: {
reactions: true,
stickers: true,
emojiUploads: true,
stickerUploads: true,
polls: true,
permissions: true,
messages: true,
threads: true,
pins: true,
search: true,
memberInfo: true,
roleInfo: true,
roles: false,
channelInfo: true,
channels: true,
voiceStatus: true,
events: true,
moderation: false
},
replyToMode: "off",
dm: {
enabled: true,
policy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["123456789012345678", "steipete"],
groupEnabled: false,
groupChannels: ["clawd-dm"]
},
guilds: {
"*": { requireMention: true },
"123456789012345678": {
slug: "friends-of-clawd",
requireMention: false,
reactionNotifications: "own",
users: ["987654321098765432", "steipete"],
channels: {
general: { allow: true },
help: {
allow: true,
requireMention: true,
users: ["987654321098765432"],
skills: ["search", "docs"],
systemPrompt: "保持答案简短。"
}
}
}
}
}
}
}确认反应通过全局 messages.ackReaction + messages.ackReactionScope 控制。使用 messages.removeAckAfterReply 清除确认反应后 Bot 回复。
dm.enabled:设置false忽略所有 DM(默认true)。dm.policy:DM 访问控制(pairing推荐)。"open"需要dm.allowFrom=["*"]。dm.allowFrom:DM 允许列表(用户 ID 或名称)。由dm.policy="allowlist"使用,并用于dm.policy="open"验证。向导接受用户名并在 Bot 可以搜索成员时将其解析为 ID。dm.groupEnabled:启用群组 DM(默认false)。dm.groupChannels:群组 DM 频道 ID 或 slug 的可选允许列表。groupPolicy:控制服务器频道处理(open|disabled|allowlist);allowlist需要频道允许列表。guilds:以服务器 ID(首选)或 slug 为键的每服务器规则。guilds."*":当没有显式条目时应用的默认每服务器设置。guilds.<id>.slug:用于显示名称的可选友好 slug。guilds.<id>.users:可选的每服务器用户允许列表(ID 或名称)。guilds.<id>.tools:可选的每服务器工具策略覆盖(allow/deny/alsoAllow),当频道覆盖缺失时使用。guilds.<id>.toolsBySender:可选的服务器级别的每发送者工具策略覆盖(频道覆盖缺失时应用;支持"*"通配符)。guilds.<id>.channels.<channel>.allow:当groupPolicy="allowlist"时允许/拒绝频道。guilds.<id>.channels.<channel>.requireMention:频道的提及门控。guilds.<id>.channels.<channel>.tools:可选的每频道工具策略覆盖(allow/deny/alsoAllow)。guilds.<id>.channels.<channel>.toolsBySender:频道内的可选每发送者工具策略覆盖("*"通配符支持)。guilds.<id>.channels.<channel>.users:可选的每频道用户允许列表。guilds.<id>.channels.<channel>.skills:技能过滤器(省略 = 所有技能,空 = 无)。guilds.<id>.channels.<channel>.systemPrompt:频道的额外系统提示(与频道主题结合)。guilds.<id>.channels.<channel>.enabled:设置false禁用频道。guilds.<id>.channels:频道规则(键是频道 slug 或 ID)。guilds.<id>.requireMention:每服务器提及要求(可按频道覆盖)。guilds.<id>.reactionNotifications:反应系统事件模式(off、own、all、allowlist)。textChunkLimit:出站文本分块大小(字符)。默认:2000。chunkMode:length仅在超过textChunkLimit时拆分;newline在长度分块之前按空行(段落边界)拆分。maxLinesPerMessage:每条消息的软最大行数。默认:17。mediaMaxMb:限制入站媒体保存到磁盘。historyLimit:回复提及时作为上下文包含的最近服务器消息数量(默认 20;回退到messages.groupChat.historyLimit;0禁用)。dmHistoryLimit:DM 历史限制,以用户轮为单位。每用户覆盖:dms["<user_id>"].historyLimit。retry:出站 Discord API 调用的重试策略(attempts、minDelayMs、maxDelayMs、jitter)。actions:每操作工具门控;省略以允许所有(设置false禁用)。reactions(覆盖反应 + 读取反应 + emojiList)stickers、emojiUploads、stickerUploads、polls、permissions、messages、threads、pins、searchmemberInfo、roleInfo、channelInfo、voiceStatus、eventschannels(频道/类别管理 + 权限)roles(角色添加/移除,默认false)moderation(超时/踢/ban,默认false)
反应通知使用 guilds.<id>.reactionNotifications:
off:无反应事件。own:对 Bot 自己的消息的反应(默认)。all:所有消息的所有反应。allowlist:guilds.<id>.users中来自所有消息的发送者的反应(空列表禁用)。
工具操作默认
| 操作组 | 默认 | 备注 |
|---|---|---|
| reactions | 启用 | 反应 + 列出反应 + emojiList |
| stickers | 启用 | 发送贴纸 |
| emojiUploads | 启用 | 上传 emoji |
| stickerUploads | 启用 | 上传贴纸 |
| polls | 启用 | 创建投票 |
| permissions | 启用 | 频道权限快照 |
| messages | 启用 | 读取/发送/编辑/删除 |
| threads | 启用 | 创建/列表/回复 |
| pins | 启用 | 置顶/取消置顶/列表 |
| search | 启用 | 消息搜索(预览功能) |
| memberInfo | 启用 | 成员信息 |
| roleInfo | 启用 | 角色列表 |
| channelInfo | 启用 | 频道信息 + 列表 |
| channels | 启用 | 频道/类别管理 |
| voiceStatus | 启用 | 语音状态查找 |
| events | 启用 | 列出/创建计划事件 |
| roles | 禁用 | 角色添加/移除 |
| moderation | 禁用 | 超时/踢/ban |
replyToMode:off(默认)、first或all。仅当模型包含回复标签时适用。
回复标签
要请求线程回复,模型可以在其输出中包含一个标签:
[[reply_to_current]]— 回复触发的 Discord 消息。[[reply_to:<id>]]— 回复上下文/历史中的特定消息 ID。 当前消息 ID 附加到提示为[message_id: …];历史条目已经包含 ID。
行为由 channels.discord.replyToMode 控制:
off:忽略标签。first:只有第一个出站块/附件是回复。all:每个出站块/附件都是回复。
允许列表匹配注意:
allowFrom/users/groupChannels接受 ID、名称、标签或<@id>等提及。- 支持
discord:/user:(用户)和channel:(群组 DM)前缀。 - 使用
*允许任何发送者/频道。 - 当
guilds.<id>.channels存在时,未列出的频道默认被拒绝。 - 当
guilds.<id>.channels省略时,允许列表中的服务器中的所有频道都被允许。 - 要允许无频道,设置
channels.discord.groupPolicy: "disabled"(或保持空允许列表)。 - 配置向导接受
Guild/Channel名称(公共 + 私有)并在可能时将它们解析为 ID。 - 启动时,OpenClaw 将允许列表中的频道/用户名称解析为 ID(当 Bot 可以搜索成员时)并记录映射;未解析的条目保持为键入。
原生命令注意:
- 注册的命令镜像 OpenClaw 的聊天命令。
- 原生命令尊重与 DM/服务器消息相同的允许列表(
channels.discord.dm.allowFrom、channels.discord.guilds,每频道规则)。 - 斜杠命令可能仍然对未允许列表的用户在 Discord UI 中可见;OpenClaw 在执行时强制执行允许列表并回复"未授权"。
工具操作
智能体可以调用 discord 与操作如:
react/reactions(添加或列出反应)sticker、poll、permissionsreadMessages、sendMessage、editMessage、deleteMessage- 读取/搜索/置顶工具有效载荷包含规范的
timestampMs(UTC 纪元毫秒)和timestampUtc以及原始 Discordtimestamp。 threadCreate、threadList、threadReplypinMessage、unpinMessage、listPinssearchMessages、memberInfo、roleInfo、roleAdd、roleRemove、emojiListchannelInfo、channelList、voiceStatus、eventList、eventCreatetimeout、kick、ban
Discord 消息 ID 在注入的上下文中暴露([discord message id: …] 和历史行),因此智能体可以定位它们。 Emoji 可以是 Unicode(如 ✅)或自定义 emoji 语法如 <:party_blob:1234567890>。
安全与运维
- 将 Bot token 视为密码;在监督的主机上优先使用
DISCORD_BOT_TOKEN环境变量或锁定配置文件权限。 - 只授予 Bot 所需的权限(通常读取/发送消息)。
- 如果 Bot 卡住或受到速率限制,重启网关(
openclaw gateway --force)确认没有其他进程拥有 Discord 会话后。
相关命令
openclaw channels- 通道管理openclaw pairing- 配对管理- 斜杠命令 - 命令使用说明