Discord

Discord(机器人 API)

状态:已通过官方 Discord 网关准备好私聊和服务器频道支持。

快速设置

你需要创建一个带有机器人的新应用,将机器人添加到服务器,并将其与 OpenClaw 配对。我们建议将机器人添加到你的私人服务器。如果你还没有服务器,请先创建一个(选择创建我自己的 > 用于我和我的朋友)。

1

创建 Discord 应用和机器人

前往 Discord 开发者门户 并点击新建应用。将其命名为"OpenClaw"之类的名称。

点击侧边栏上的机器人。将用户名设置为你称呼 OpenClaw 代理的名称。

2

启用特权意图

仍在机器人页面,向下滚动到特权网关意图并启用:

  • 消息内容意图(必需)
  • 服务器成员意图(推荐;角色白名单和名称到 ID 匹配所需)
  • 在线状态意图(可选;仅在线状态更新需要)
3

复制机器人令牌

机器人页面向上滚动,点击重置令牌

尽管名称如此,这会生成你的第一个令牌——没有任何内容被"重置"。

复制令牌并保存到某处。这是你的机器人令牌,你马上会用到它。

4

生成邀请 URL 并将机器人添加到服务器

点击侧边栏上的OAuth2。你将生成一个带有正确权限的邀请 URL,以便将机器人添加到服务器。

向下滚动到OAuth2 URL 生成器并启用:

  • bot
  • applications.commands

下方会出现机器人权限部分。启用:

  • 查看频道
  • 发送消息
  • 读取消息历史
  • 嵌入链接
  • 附加文件
  • 添加反应(可选)

复制底部生成的 URL,粘贴到浏览器中,选择你的服务器,然后点击继续进行连接。你现在应该能在 Discord 服务器中看到你的机器人。

5

启用开发者模式并收集你的 ID

回到 Discord 应用中,你需要启用开发者模式以便复制内部 ID。

  1. 点击用户设置(头像旁边的齿轮图标)→ 高级 → 开启开发者模式
  2. 右键点击侧边栏中的服务器图标复制服务器 ID
  3. 右键点击你自己的头像复制用户 ID

服务器 ID用户 ID与机器人令牌一起保存——你将在下一步中将这三者发送给 OpenClaw。

6

允许来自服务器成员的私聊

为使配对生效,Discord 需要允许机器人向你发送私聊。右键点击服务器图标隐私设置 → 开启私聊

这允许服务器成员(包括机器人)向你发送私聊。如果你想在 OpenClaw 中使用 Discord 私聊,请保持此设置开启。如果你只打算使用服务器频道,可以在配对后禁用私聊。

7

步骤 0:安全地设置机器人令牌(不要在聊天中发送)

你的 Discord 机器人令牌是机密信息(类似于密码)。在联系代理之前,先在运行 OpenClaw 的机器上设置它。

openclaw config set channels.discord.token '"YOUR_BOT_TOKEN"' --json
openclaw config set channels.discord.enabled true --json
openclaw gateway

如果 OpenClaw 已作为后台服务运行,请改用 openclaw gateway restart

8

配置 OpenClaw 并配对

在任何现有频道(例如 Telegram)上与你的 OpenClaw 代理聊天并告诉它。如果 Discord 是你的第一个频道,请改用 CLI/配置选项卡。

"我已经在配置中设置了 Discord 机器人令牌。请完成 Discord 设置,使用用户 ID <user_id> 和服务器 ID <server_id>。"

9

批准首次私聊配对

等待网关运行后,在 Discord 中向机器人发送私聊。它将回复一个配对码。

在现有频道上将配对码发送给代理:

"批准此 Discord 配对码:<CODE>"

配对码在 1 小时后过期。

你现在应该能够在 Discord 中通过私聊与代理聊天了。

令牌解析是账户感知的。配置令牌值优先于环境变量回退。DISCORD_BOT_TOKEN 仅用于默认账户。

推荐:设置服务器工作区

私聊正常工作后,你可以将 Discord 服务器设置为完整的工作区,每个频道获得自己的代理会话和上下文。建议在只有你和机器人的私人服务器上使用此设置。

1

将服务器添加到服务器白名单

这使代理能够响应服务器上任何频道的消息,而不仅仅是私聊。

"将我的 Discord 服务器 ID <server_id> 添加到服务器白名单"

2

允许无需 @提及 的响应

默认情况下,代理仅在服务器频道中被 @提及时才会响应。对于私人服务器,你可能希望它响应每条消息。

"允许代理在此服务器上响应,无需被 @提及"

3

规划服务器频道中的记忆

默认情况下,长期记忆(MEMORY.md)仅在私聊会话中加载。服务器频道不会自动加载 MEMORY.md。

"当我在 Discord 频道中提问时,如果需要来自 MEMORY.md 的长期上下文,请使用 memory_search 或 memory_get。"

现在在你的 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

示例:向论坛父级发送以创建主题

openclaw message send --channel discord --target channel:<forumId> \
  --message "主题标题\n正文内容"

示例:显式创建论坛主题

openclaw message thread create --channel discord --target channel:<forumId> \
  --thread-name "主题标题" --message "正文内容"

论坛父级不接受 Discord 组件。如果你需要组件,请发送到主题本身(channel:<threadId>)。

交互式组件

OpenClaw 支持用于代理消息的 Discord 组件 v2 容器。使用带有 components 负载的消息工具。交互结果作为普通入站消息路由回代理,并遵循现有的 Discord replyToMode 设置。

支持的块:

  • textsectionseparatoractionsmedia-galleryfile
  • 操作行最多允许 5 个按钮或单个选择菜单
  • 选择类型:stringuserrolementionablechannel

默认情况下,组件是单次使用的。设置 components.reusable=true 以允许按钮、选择和表单多次使用,直到过期。

要限制谁可以点击按钮,请在该按钮上设置 allowedUsers(Discord 用户 ID、标签或 *)。配置后,不匹配的用户将收到临时拒绝。

/model/models 斜杠命令打开一个交互式模型选择器,带有提供者和模型下拉菜单以及提交步骤。选择器回复是临时的,只有调用用户可以使用它。

文件附件:

  • file 块必须指向附件引用(attachment://<filename>
  • 通过 media/path/filePath 提供附件(单个文件);使用 media-gallery 处理多个文件
  • 使用 filename 在上传名称应与附件引用匹配时覆盖

模态表单:

  • 添加带有最多 5 个字段的 components.modal
  • 字段类型:textcheckboxradioselectrole-selectuser-select
  • OpenClaw 自动添加触发按钮

示例:

{
  channel: "discord",
  action: "send",
  to: "channel:123456789012345678",
  message: "可选回退文本",
  components: {
    reusable: true,
    text: "选择路径",
    blocks: [
      {
        type: "actions",
        buttons: [
          {
            label: "批准",
            style: "success",
            allowedUsers: ["123456789012345678"],
          },
          { label: "拒绝", style: "danger" },
        ],
      },
      {
        type: "actions",
        select: {
          type: "string",
          placeholder: "选择一个选项",
          options: [
            { label: "选项 A", value: "a" },
            { label: "选项 B", value: "b" },
          ],
        },
      },
    ],
    modal: {
      title: "详情",
      triggerLabel: "打开表单",
      fields: [
        { type: "text", label: "请求者" },
        {
          type: "select",
          label: "优先级",
          options: [
            { label: "低", value: "low" },
            { label: "高", value: "high" },
          ],
        },
      ],
    },
  },
}

访问控制和路由

channels.discord.dmPolicy 控制私聊访问(旧版:channels.discord.dm.policy):

  • pairing(默认)
  • allowlist
  • open(需要 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> 提及

纯数字 ID 是模糊的,除非提供显式的用户/频道目标类型,否则会被拒绝。

基于角色的代理路由

使用 bindings[].match.roles 根据角色 ID 将 Discord 服务器成员路由到不同的代理。基于角色的绑定仅接受角色 ID,并在对等或父对等绑定之后、仅服务器绑定之前进行评估。如果绑定还设置了其他匹配字段(例如 peer + guildId + roles),则所有配置的字段都必须匹配。

{
  bindings: [
    {
      agentId: "opus",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
        roles: ["111111111111111111"],
      },
    },
    {
      agentId: "sonnet",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
      },
    },
  ],
}

开发者门户设置

原生命令和命令认证

  • commands.native 默认为 "auto" 并为 Discord 启用。
  • 按频道覆盖:channels.discord.commands.native
  • commands.native=false 显式清除先前注册的 Discord 原生命令。
  • 原生命令认证使用与普通消息处理相同的 Discord 白名单/策略。
  • 命令可能仍对未授权用户在 Discord UI 中可见;执行仍强制执行 OpenClaw 认证并返回"未授权"。

请参阅 斜杠命令 获取命令目录和行为。

默认斜杠命令设置:

  • ephemeral: true

功能详情

工具和动作门

Discord 消息动作包括消息传递、频道管理、审核、在线状态和元数据动作。

核心示例:

  • 消息传递:sendMessagereadMessageseditMessagedeleteMessagethreadReply
  • 反应:reactreactionsemojiList
  • 审核:timeoutkickban
  • 在线状态: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 组件 v2 执行批准和跨上下文标记。Discord 消息动作也可以接受 components 用于自定义 UI(高级;需要 Carbon 组件实例),而旧版 embeds 仍然可用但不推荐。

  • channels.discord.ui.components.accentColor 设置 Discord 组件容器使用的强调色(十六进制)。
  • 使用 channels.discord.accounts.<id>.ui.components.accentColor 按账户设置。
  • 当存在组件 v2 时,embeds 被忽略。

示例:

{
  channels: {
    discord: {
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
    },
  },
}

语音频道

OpenClaw 可以加入 Discord 语音频道进行实时连续对话。这与语音消息附件分开。

要求:

  • 启用原生命令(commands.nativechannels.discord.commands.native)。
  • 配置 channels.discord.voice
  • 机器人需要在目标语音频道中具有连接 + 说话权限。

使用 Discord 专用原生命令 /vc join|leave|status 控制会话。该命令使用账户默认代理并遵循与其他 Discord 命令相同的白名单和组策略规则。

自动加入示例:

{
  channels: {
    discord: {
      voice: {
        enabled: true,
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        tts: {
          provider: "openai",
          openai: { voice: "alloy" },
        },
      },
    },
  },
}

注意:

  • voice.tts 仅覆盖语音播放的 messages.tts
  • 语音转录回合从 Discord allowFrom(或 dm.allowFrom)派生所有者状态;非所有者发言者无法访问仅限所有者的工具(例如 gatewaycron)。
  • 语音默认启用;设置 channels.discord.voice.enabled=false 禁用它。
  • voice.daveEncryptionvoice.decryptionFailureTolerance 传递给 @discordjs/voice 加入选项。
  • 如果未设置,@discordjs/voice 默认值为 daveEncryption=truedecryptionFailureTolerance=24
  • OpenClaw 还监视接收解密失败并在短时间内重复失败后通过离开/重新加入语音频道自动恢复。
  • 如果接收日志重复显示 DecryptionFailed(UnencryptedWhenPassthroughDisabled),这可能是上游 @discordjs/voice 接收 bug,在 discord.js #11419 中跟踪。

语音消息

Discord 语音消息显示波形预览并需要 OGG/Opus 音频和元数据。OpenClaw 自动生成波形,但需要网关主机上可用 ffmpegffprobe 来检查和转换音频文件。

要求和约束:

  • 提供本地文件路径(URL 被拒绝)。
  • 省略文本内容(Discord 不允许在同一负载中使用文本 + 语音消息)。
  • 接受任何音频格式;OpenClaw 在需要时转换为 OGG/Opus。

示例:

message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)

故障排除

配置参考指针

主要参考:

高信号 Discord 字段:

  • 启动/认证:enabledtokenaccounts.*allowBots
  • 策略:groupPolicydm.*guilds.*guilds.*.channels.*
  • 命令:commands.nativecommands.useAccessGroupsconfigWritesslashCommand.*
  • 事件队列:eventQueue.listenerTimeout(规范)、eventQueue.maxQueueSizeeventQueue.maxConcurrency
  • 回复/历史:replyToModehistoryLimitdmHistoryLimitdms.*.historyLimit
  • 传递:textChunkLimitchunkModemaxLinesPerMessage
  • 流式传输:streaming(旧版别名:streamMode)、draftChunkblockStreamingblockStreamingCoalesce
  • 媒体/重试:mediaMaxMbretry
  • 动作:actions.*
  • 在线状态:activitystatusactivityTypeactivityUrl
  • UI:ui.components.accentColor
  • 功能:pluralkitexecApprovalsintentsagentComponentsheartbeatresponsePrefix

安全和操作

  • 将机器人令牌视为机密(在监督环境中首选 DISCORD_BOT_TOKEN)。
  • 授予最低特权的 Discord 权限。
  • 如果命令部署/状态过时,重启网关并使用 openclaw channels status --probe 重新检查。

相关