Skip to main content
QQ Bot 通过官方 QQ Bot API(WebSocket 网关)连接到 OpenClaw。 C2C 私聊和群聊中的 @ 提及是主要聊天类型,支持富媒体(图片、语音、视频、文件)。频道消息仅支持文本和远程 URL 图片;频道中不支持语音、视频、文件上传以及本地/Base64 图片。任何地方都不支持反应和线程。 状态:官方可下载插件。

安装

设置

  1. 前往 QQ 开放平台,并使用你的 手机 QQ 扫码注册/登录。
  2. 点击 创建机器人 创建一个新的 QQ bot。
  3. 在机器人设置页找到 AppIDAppSecret,并复制它们。
AppSecret 不会以明文存储。如果你在未保存的情况下离开页面,就必须重新生成一个新的。
  1. 添加频道:
  1. 重启 Gateway。

入站持久性

对于 QQ 网关转发事件,OpenClaw 会在推进已保存的网关恢复序列之前先持久化原始事件。待处理或可重试的转发在 Gateway 重启后仍会保留,且会按会话序列化,并在活跃或保留的完成记录存在时使用提供方事件 ID 来抑制重复的队列条目。 如果持久化接纳失败,OpenClaw 会在不推进序列的情况下终止当前的网关 socket。随后重新连接/恢复路径可以再次请求该未提交事件。在队列到代理边界之间,投递仍然是至少一次,因此在交接过程中发生崩溃时可能会重放一个转发。 交互式设置:
该向导还提供二维码绑定作为手动输入 AppID/AppSecret 的替代方案: 使用与目标 QQ Bot 绑定的手机应用扫描二维码即可完成绑定。OpenClaw 会将返回的凭据持久化到该账户的配置作用域下。

配置

最小配置:
默认账号环境变量(仅顶层账号):
  • QQBOT_APP_ID
  • QQBOT_CLIENT_SECRET
基于文件的 AppSecret:
注意:
  • openclaw channels add --channel qqbot --token-file ... 仅设置 AppSecret; appId 必须已在配置中或 QQBOT_APP_ID 中设置。
  • clientSecret 接受纯文本字符串或文件路径(clientSecretFile)。
  • 已知限制:外部 @tencent-connect/openclaw-qqbot 软件包不支持用于 clientSecret 的结构化 SecretRef 对象。如果你的配置使用了此类对象, 请在升级前将密钥移至 QQBOT_CLIENT_SECRET 环境变量 (或 clientSecretFile)。

流式传输

  • streaming.mode: "off" 会为该账号禁用块流式传输。
  • streaming.nativeTransport: true 会通过 QQ 官方的 stream_messages API 为 C2C(DM)回复提供流式传输;群聊/频道目标不受影响。
  • 旧版的 streaming: true|false 标量以及 streaming.c2cStreamApi 键 可通过 openclaw doctor --fix 迁移为此结构。
  • /bot-streaming on|off 会从 DM 中切换同样的配置。

访问策略

  • allowFromgroupAllowFrom 门控谁可以在 C2C / 群上下文中与机器人聊天。dmPolicygroupPolicyopenallowlistdisabled) 控制执行模式。当 allowFrom 有一个具体的(非通配符)条目时, dmPolicy 默认变为 allowlist,否则为 open。 当 groupAllowFromallowFrom 其中任一具有具体条目时, groupPolicy 默认变为 allowlist,否则为 open
  • contextVisibility 控制 QQ 作为补充上下文提供的引用消息文本。默认值 "all" 会保留收到的引用文本。 设为 "allowlist" 时,仅在被引用发送者通过配置的发送者策略时才包含引用正文, 或设为 "allowlist_quote" 以保留显式引用,同时过滤其他补充上下文。参见 群聊
  • "Auth: allowlist" 斜杠命令要求在 allowFrom 中存在明确的非通配符条目 (群调用则为 groupAllowFrom),不受 dmPolicygroupPolicy 影响 — 参见 斜杠命令

多账号设置

在单个 OpenClaw 实例下运行多个 QQ bot:
每个账号都拥有独立的 WebSocket 连接、API 客户端和 token 缓存,并按 appId 作为键区分。 日志行会标记所属账号 id,因此当你在同一个 Gateway 下运行多个 bot 时,诊断信息仍然可以分开查看。 通过 CLI 添加第二个 bot:

群聊

群聊支持使用 QQ 群 OpenID,而不是显示名称。先将机器人添加到群里,然后 @ 它,或者将群配置为无需 @ 也能运行。
groups["*"] 为所有群设置默认值;具体的 groups.GROUP_OPENID 条目会覆盖某个群的这些默认值。群设置如下: commandLevel 接受: 旧版 QQBot 的 toolPolicy 条目已弃用。运行 openclaw doctor --fix 将其迁移到 tools 激活模式为 mentionalwaysrequireMention: true 映射到 mentionrequireMention: false 映射到 always。当存在会话级激活 覆盖时,其优先级高于配置。 入站队列按对端(peer)划分。群对端的队列上限更大(50,而私聊对端为 20),满时会优先驱逐机器人发送的消息而不是人类消息,并将普通群消息的短时间突发合并为一个带归属的轮次。斜杠命令逐个运行,不受任何合并批次影响。

语音(STT / TTS)

STT 和 TTS 支持两级配置,并按优先级回退:
将任一项设为 enabled: false 可禁用。账号级 TTS 覆盖的结构与 tts 相同,并会在频道/全局 TTS 配置之上进行深度合并。 STT 请求默认在 60 秒后超时。插件专用 STT 使用所选 models.providers.<id>.timeoutSeconds 覆盖值。框架音频 STT 使用所选支持音频的 tools.media.models[] 条目的 timeoutSeconds,然后再使用所选提供方覆盖值。 进入的 QQ 语音附件会作为音频媒体元数据暴露给代理, 同时不会将原始语音文件放入通用的 MediaPaths 中。[[audio_as_voice]] 出现在纯文本回复中时,会合成 TTS,并在配置了 TTS 时发送原生 QQ 语音消息。 出站音频上传/转码行为也可以通过 channels.qqbot.audioFormatPolicy 进行调整:
  • sttDirectFormats
  • uploadDirectFormats
  • transcodeEnabled

目标格式

每个机器人都有自己的一组用户 OpenID。由 Bot A 接收到的 OpenID 不能用于通过 Bot B 发送消息。

斜杠命令

在 AI 队列之前拦截的内置命令: 在任何命令后追加 ? 可查看用法帮助(例如 /bot-upgrade ?)。 “Auth: allowlist”命令还要求发送者的 openid 必须出现在一个 明确的非通配符 allowFrom 列表中(群消息命令优先使用 groupAllowFrom, 否则回退到 allowFrom)。allowFrom: ["*"] 这种通配符 允许聊天,但不允许这些命令。在私聊之外运行这些命令,或未获授权时, 会返回提示信息,而不是静默丢弃消息。 /bot-me/bot-version/bot-upgrade 仅限私聊,但不 需要 allowlist——任何 C2C 发送者都可以运行它们。 当 QQ Bot 执行审批使用默认的同聊回退时,原生审批 按钮点击遵循相同的明确非通配符命令 allowlist。若要在不授予更广泛命令权限的情况下 仅授予审批访问权限,请配置 channels.qqbot.execApprovals.approvers。原生执行审批默认已启用。

媒体与存储

  • 入站、出站和网关桥接媒体共享一个载荷根目录,位于 ~/.openclaw/media/qqbot(在设置了 OPENCLAW_HOME 时会遵循该配置),因此上传、下载和转码缓存都保留在一个受保护的目录下。
  • 面向 C2C 和群目标的富媒体发送都通过同一个 sendMedia 路径。大小为 5 MiB 或以上的本地文件和内存缓冲区使用 QQ 的分块上传端点;较小的载荷以及远程 URL/Base64 来源则使用一次性上传 API。
  • 如果热升级在 Gateway 完成写入 openclaw.json 之前中断,插件会在下次启动时从内部快照中恢复该账号上一次已知的 appId / clientSecret(绝不会覆盖有意的配置变更),因此无需重新扫描二维码。

故障排查

  • 网关未启动/没有入站消息: 验证 appIdclientSecret 是否正确,并且机器人已在 QQ 开放平台上启用。 缺少凭据时会显示为“QQBot 未配置(缺少 appId 或 clientSecret)”。
  • 使用 --token-file 设置后仍显示未配置:--token-file 仅 设置 AppSecret。appId 仍必须在配置或 QQBOT_APP_ID 中设置。
  • 突发的群组回复发生冲突: 当对端队列满时,入站队列会优先驱逐 机器人发送的消息而不是人类消息,并将突发的普通(非命令)群消息合并为一次带归属的轮次,因此大量机器人聊天不应饿死人类消息。
  • 主动消息未送达: 如果用户最近没有互动,QQ 可能会 阻止机器人发起的消息。
  • 语音未转录: 确保已配置 STT 且提供方可访问。

相关