OpenClawSkills
GitHub
通道 • 5 分钟阅读

Discord

Discord Bot 支持状态、能力与配置

状态:已可用于私信与服务器(guild)文本频道,基于官方 Discord bot gateway。

Tutorial.step

新手快速配置

1. 创建 Discord bot,复制 bot token。

2. 在 Discord Developer Portal 里启用 <strong>Message Content Intent</strong>(如果你要做 allowlist 或昵称解析,建议同时启用 <strong>Server Members Intent</strong>)。

3. 给 OpenClaw 配置 token:

- 环境变量:<code>DISCORD_BOT_TOKEN=...</code>

- 或配置:<code>channels.discord.token: "..."</code>。

- 两者同时设置时,以 config 为准(env 仅 default account 兜底)。

4. 邀请 bot 加入服务器,并授予读写消息权限(如果你只想用私信,也可以建个私有服务器测试)。

5. 启动 Gateway。

6. 私信默认 pairing:首次联系会给配对码,批准后才处理消息。

最小配置:

Json5
{
  channels: {
    discord: {
      enabled: true,
      token: "YOUR_BOT_TOKEN",
    },
  },
}
Tutorial.step

目标

- 通过 Discord 私信或服务器频道与 OpenClaw 对话。

- 私信默认折叠到 agent 的主会话(默认 '<code>'agent:main:main'</code>');服务器频道会隔离为 '<code>'agent:'<agentId>':discord:channel:'<channelId>''</code>'(显示名使用 '<code>'discord:'<guildSlug>'#'<channelSlug>''</code>')。

- 默认忽略群私信(Group DMs);可通过 <code>channels.discord.dm.groupEnabled</code> 启用,并可用 <code>channels.discord.dm.groupChannels</code> 进一步限制。

- 保持确定性路由:回复始终回到消息来源频道。

Tutorial.step

工作方式

1. 创建 Discord Application → Bot,启用所需 intents(私信/服务器消息/消息内容),获取 bot token。

2. 邀请 bot 加入你的服务器,并赋予它在目标频道读/发消息权限。

3. 在 OpenClaw 中配置 <code>channels.discord.token</code>(或使用 <code>DISCORD_BOT_TOKEN</code> 兜底)。

4. 启动 Gateway:当 token 可用且 <code>channels.discord.enabled</code> 不为 <code>false</code> 时,会自动启动 Discord 通道。

- 只用 env 也可以:设置 <code>DISCORD_BOT_TOKEN</code>(可不写 config block)。

5. 私信投递 target 使用 '<code>'user:'<id>''</code>'(或 '<code>''<@id>''</code>' mention)。裸数字 ID 容易歧义,会被拒绝。

6. 服务器频道投递使用 '<code>'channel:'<channelId>''</code>'。默认需要 mention,可按 guild 或 channel 设置。

7. 私信默认安全门禁:'<code>'channels.discord.dm.policy'</code>'(默认 '<code>'"pairing"'</code>')。未知发送者会得到配对码(1 小时过期),批准:'<code>'openclaw pairing approve discord '<code>''</code>'。

- 若想"任何人都能私信":<code>channels.discord.dm.policy="open"</code> 且 <code>channels.discord.dm.allowFrom=["*"]</code>。

- 若想硬性 allowlist:<code>channels.discord.dm.policy="allowlist"</code> 并在 <code>channels.discord.dm.allowFrom</code> 列出允许的发送者。

- 若想完全忽略私信:<code>channels.discord.dm.enabled=false</code> 或 <code>channels.discord.dm.policy="disabled"</code>。

8. 群私信默认忽略;用 <code>channels.discord.dm.groupEnabled</code> 启用。

9. 可选:用 <code>channels.discord.guilds</code>(按 guild id 优先)配置服务器规则与频道规则。

10. 可选:原生命令。<code>commands.native</code> 默认 <code>"auto"</code>(Discord/Telegram 默认开,Slack 默认关)。可用 <code>channels.discord.commands.native: true|false|"auto"</code> 覆盖;<code>false</code> 会清理已注册命令。文本命令由 <code>commands.text</code> 控制,且必须作为单独 <code>/...</code> 消息发送。<code>commands.useAccessGroups: false</code> 可绕过命令的 access-group 检查。

- 命令列表与配置:'<a href="/tools/slash-commands">'/tools/slash-commands'</a>'

11. 可选:服务器频道上下文。<code>channels.discord.historyLimit</code>(默认 20,兜底 <code>messages.groupChat.historyLimit</code>)用于在 bot 被 mention 时把最近 N 条消息作为上下文注入;设为 <code>0</code> 禁用。

12. Reactions:agent 可通过 '<code>'discord'</code>' 工具触发(受 '<code>'channels.discord.actions.*'</code>' 开关控制)。取消反应语义见 '<a href="/tools/reactions">'/tools/reactions'</a>'。

13. 原生命令使用隔离 session key:'<code>'agent:'<agentId>':discord:slash:'<userId>''</code>'(不会写进共享 '<code>'main'</code>' 会话)。

补充说明:

- 昵称/用户名 → id 的解析依赖 guild member search,需要启用 <strong>Server Members Intent</strong>;如果无法搜索成员,请直接使用 id 或 <code><@id></code> mention。

- slug:全小写,空格替换为 <code>-</code>;频道名的 slug 不包含 <code>#</code>。

- 群消息的 <code>[from:]</code> 行会包含 <code>author.tag</code> + <code>id</code>,便于直接 ping。

Tutorial.step

配置写回(Config writes)

默认允许 Discord 把由 <code>/config set|unset</code> 触发的更新写回配置文件(需要 <code>commands.config: true</code>)。

禁用:

Json5
{
  channels: { discord: { configWrites: false } },
}
Tutorial.step

如何创建你自己的 bot(Developer Portal)

这是一套在服务器频道(如 <code>#help</code>)使用 OpenClaw 的典型配置流程。

#

Tutorial.step

1)创建 App + Bot 用户

1. Discord Developer Portal → <strong>Applications</strong> → <strong>New Application</strong>

2. 在你的应用里:

- <strong>Bot</strong> → <strong>Add Bot</strong>

- 复制 <strong>Bot Token</strong>(用于 <code>DISCORD_BOT_TOKEN</code>)

#

Tutorial.step

2)启用 OpenClaw 需要的 intents

Discord 的"特权 intents"必须显式开启:

在 <strong>Bot</strong> → <strong>Privileged Gateway Intents</strong> 中启用:

- <strong>Message Content Intent</strong>(必须;否则会出现 "Used disallowed intents",或 bot 能连接但不会处理消息)

- <strong>Server Members Intent</strong>(推荐;用于成员/用户查找与 allowlist 匹配)

一般不需要 <strong>Presence Intent</strong>。

#

Tutorial.step

3)生成邀请链接(OAuth2 URL Generator)

在应用中:<strong>OAuth2</strong> → <strong>URL Generator</strong>

<strong>Scopes</strong>

- ✅ <code>bot</code>

- ✅ <code>applications.commands</code>(原生命令需要)

<strong>Bot Permissions(最小建议)</strong>

- ✅ View Channels

- ✅ Send Messages

- ✅ Read Message History

- ✅ Embed Links

- ✅ Attach Files

- ✅ Add Reactions(可选但推荐)

- ✅ Use External Emojis / Stickers(可选)

除非你在调试且完全信任 bot,否则不要选 <strong>Administrator</strong>。

复制生成的 URL,打开并选择服务器完成安装。

#

Tutorial.step

4)获取 IDs(guild/user/channel)

Discord 大量使用数值 id;OpenClaw 配置也更推荐使用 id:

1. Discord(桌面端/Web)→ <strong>User Settings</strong> → <strong>Advanced</strong> → 启用 <strong>Developer Mode</strong>

2. 右键复制:

- 服务器名 → <strong>Copy Server ID</strong>

- 频道 → <strong>Copy Channel ID</strong>

- 用户 → <strong>Copy User ID</strong>

#

Tutorial.step

5)配置 OpenClaw

##

Tutorial.step

Token

建议在服务器上用环境变量:

- <code>DISCORD_BOT_TOKEN=...</code>

或配置文件:

Json5
{
  channels: {
    discord: {
      enabled: true,
      token: "YOUR_BOT_TOKEN",
    },
  },
}

多账号:使用 '<code>'channels.discord.accounts'</code>' 配置每个账号 token(可选 '<code>'name'</code>')。共享结构见 '<a href="/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts">'/gateway/configuration'</a>'。

##

Tutorial.step

Allowlist + 路由

示例:"只在一个服务器里、只允许我、只允许 #help":

Json5
{
  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,
      },
    },
  },
}

说明:

- <code>requireMention: true</code> 表示只在被 mention 时回复(推荐,用于共享频道,避免噪声)。

- <code>agents.list[].groupChat.mentionPatterns</code>(或 <code>messages.groupChat.mentionPatterns</code>)也会被当作 mention。

- 如果 <code>channels</code> 存在,则未列出的频道默认拒绝。

- 线程会继承父频道配置(allowlist、requireMention、skills、prompts 等),除非你显式把 thread 的 channel id 加入配置。

- 默认会忽略 bot 发送的消息;设 <code>channels.discord.allowBots=true</code> 可允许(但仍会过滤自己的消息)。

- 如果允许回复其他 bot(<code>allowBots=true</code>),务必用 <code>requireMention</code>、用户 allowlist、以及清晰的提示词防止 bot-to-bot 回环。

#

Tutorial.step

6)验证

1. 启动 gateway。

2. 在服务器频道里发送:<code>@YourBot hello</code>。

3. 没反应时先看下面排障。

#

Tutorial.step

排障

- 优先运行 <code>openclaw doctor</code> 与 <code>openclaw channels status --probe</code>。

- <strong>"Used disallowed intents"</strong>:在 Developer Portal 中启用 <strong>Message Content Intent</strong>(通常还需要 <strong>Server Members Intent</strong>),然后重启 gateway。

- <strong>能连接但在服务器频道不回复</strong>:

- 缺少 Message Content Intent,或

- bot 没有频道权限(View/Send/Read History),或

- 配置要求 mention 但你没 @,或

- allowlist 拒绝了该频道/用户。

- <strong><code>requireMention: false</code> 仍不回复</strong>:

- <code>channels.discord.groupPolicy</code> 默认是 <strong>allowlist</strong>;把它设为 <code>"open"</code>,或在 <code>channels.discord.guilds</code> 下配置允许的 guild/channel。

- 如果你只设置了 <code>DISCORD_BOT_TOKEN</code> 而未创建 <code>channels.discord</code> 配置段,运行时默认 <code>groupPolicy</code> 为 <code>open</code>。一旦你显式配置 <code>channels.discord.groupPolicy</code>/<code>channels.defaults.groupPolicy</code> 或 guild/channel allowlist,就会被收紧。

- <code>requireMention</code> 必须放在 <code>channels.discord.guilds</code>(或具体 channel)下;顶层 <code>channels.discord.requireMention</code> 会被忽略。