openclaw.connect('discord')
/** 将您的 Discord 服务器变成 AI 驱动的社区中心 */
## 步骤 1:创建 Discord 机器人
## 步骤 2:配置 OpenClaw
💬 实时示例
机器人不吭声时该查什么
几乎所有 Discord 的反馈都是同一句话:机器人在服务器里、显示在线、但什么都不理。没有错误可看,因为这几种失败根本不产生错误。照着表往下走——顺序反映的是各项在实际排查中命中的频率。
| 症状 | 最可能的原因 | 在哪里修 |
|---|---|---|
| 私信有回应,服务器里不理人 | Message Content Intent 没开 | Developer Portal → Bot → Privileged Gateway Intents |
| 本来好用,后来除了一个频道全哑了 | 指定了一个频道,其余全部变成拒绝 | 在 channels.discord.guilds 下补一条 "*" 通配 |
| requireMention 设成 false 了还是没反应 | groupPolicy 是 "allowlist" 但没有匹配条目 | channels.discord.guilds 以及发送者 users 规则 |
| 私信石沉大海 | 配对码从来没有被批准 | openclaw pairing approve discord <CODE> |
| 允许列表里的角色永远匹配不上 | Server Members Intent 没开 | Developer Portal,同一个面板 |
允许列表这个行为反复坑人,值得直白说一遍:在你一个频道都没配置的时候,所有频道都是放行的;一旦你加了第一条条目,所有没列出来的频道立刻变成拒绝。对一个涉及安全的 Agent 来说这个默认是合理的,但它会让一次很小的配置改动,变成整个服务器其余部分的静默故障。
注册机器人并把 token 交给它
token 放环境变量,配置文件里只存一个引用。这很重要,因为 openclaw.json 经常被人贴进 issue 里。
# Developer Portal → your app → Bot → Privileged Gateway Intents # # Message Content Intent REQUIRED for normal guild messages # Server Members Intent needed for role allowlists and name→ID matching # Presence Intent optional; only for presence updates
关键是 Message Content。不开的话 Discord 照样推事件,但 content 字段是空的——Agent 看到消息进来、里面什么都没有,于是保持沉默。事后再开需要重启网关才生效。
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
绝对不要写进配置里。否则任何能读到 openclaw.json 的人都能接管这个机器人,而这个文件出现在截图里的频率比你以为的高得多。
{
channels: {
discord: {
enabled: true,
token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },
},
},
}`source: "env"` 这种写法是 SecretRef:OpenClaw 在加载时解析它,字面值既不进配置文件,也不会出现在你分享出去的 diff 里。
openclaw config patch --file ./discord.patch.json5 openclaw gateway restart
`config patch` 是往现有文件里合并而不是覆盖,所以对一个你已经改过的配置执行它是安全的。
配对,以及别把服务器其余部分锁死
私信默认要经过显式的配对批准。这是有意为之:一个拥有 shell 权限的 Agent,它的私信通道不该对任何找到这个机器人的人敞开。
openclaw pairing list discord
有人给机器人发私信就会在这里生成一个码。在你批准之前,他的消息是被丢弃而不是排队的,所以事后没有任何积压可以补看。
openclaw pairing approve discord <CODE>
按人批准,不要一把全放。如果这里出现了你解释不了的码,说明有人找到了你的机器人——去查谁有权把它加进服务器。
# Keep other channels reachable after you name even one:
{
channels: {
discord: {
guilds: {
"123456789012345678": {
channels: { "*": {} },
},
},
},
},
}这条通配就是用来抵消上面说的「默认拒绝」行为的。它应该和你第一条具体频道配置同时加上,而不是在你排查了一晚上之后才补。
接进真实服务器之前值得先知道的几件事
- ✗共享服务器里的 Agent 能读到它可见的每个频道里的每一条消息。请在邀请它之前判断这是否可接受,而不是之后。
- ✗Discord 的限流很激进。一个在热闹服务器里对什么都回应的 Agent 一定会被限流,而限流表现出来就是「机器人又不吭声了」。
- ✗服务器和频道的键是 ID 不是名字。名字会变,ID 不会——用名字做键的允许列表会在频道改名后静默失效。
- ✗如果你希望它只在被点名时才行动,请显式配置。「它只在被叫到时才回应」是一项配置,不是可以默认假设的行为。