[Bug] 群聊回复/进退服通知未携带 msg_id,被QQ判定为主动消息导致发送失败(40034105)
环境
- 插件版本:HuHoBot-Penguin_Spigot v1.2.2(build b221326,2026-08-18)
- 服务端:Purpur 26.2-2614(Paper 系)
- 接入方式:QQ 开放平台官方 WebSocket(qqpd-bot-java v1.5.3-L4)
- Java:17+(Purpur 26.2 自带运行时)
问题描述
QQ 官方自 2025 年 4 月起关闭了群聊场景机器人的主动消息能力。当前所有不携带 msg_id/event_id 的发送请求都会被网关以 40034105 主动消息失败, 无权限 拒绝。
实测发现插件中以下发送路径未携带被动回复字段,全部失败:
| 功能 |
结果 |
错误码 |
| 基础文本命令(查在线 / 帮助等) |
✅ 正常 |
— |
| 进服/退服通知(player-events) |
❌ 失败 |
40034105 |
| AI Agent 结果回复(Markdown) |
❌ 失败 |
40034105 |
| Agent 错误通知(Markdown) |
❌ 失败 |
40034105 |
关键证据:Agent 触发消息收到后 4 秒内的错误通知发送即失败,此时 msg_id 显然仍在 5 分钟有效期内 —— 说明请求根本没有附带 msg_id(若附带了过期 id 会报 40034005/40034128 而非 40034105)。
日志时间线
[21:39:53 INFO] Bot(服务器娘) post([type(GROUP) <group_openid>].<user_openid>: /agent 查看在线玩家) from GroupMessageEvent
[21:39:56 ERROR] Agent AI 调用失败: AI 接口返回 HTTP 404 ← 此为另一问题(NVIDIA账户权限门控,已通过换模型解决)
[21:39:57 ERROR] HTTP error fetching URL. Status=400, URL=[https://api.sgroup.qq.com/v2/groups/<group_openid>/messages]
[21:39:57 ERROR] 向QQ群 ... 发送 Markdown 失败: code is [40034105] ({"message":"主动消息失败, 无权限",...})
[21:31:01 INFO] a123213379 joined the game
[21:31:01 ERROR] 向QQ群 ... 发送玩家进服通知失败: code is [40034105]
[21:32:13 ERROR] 向QQ群 ... 发送玩家退服通知失败: code is [40034105]
另有一个相关小问题:配置 bot.groups 若填写数字群号会报 11255 请求的资源不存在(用户/群已注销),必须填 Group OpenID —— 建议在 README/WebUI 中明确标注。
根因分析
QQ 官方被动回复规则(发送群聊消息文档):
- 被动回复必须携带触发消息的
msg_id(来自 GROUP_AT_MESSAGE_CREATE 事件的 d.id),5 分钟内有效
- 同一
msg_id 最多回复 5 次,需用递增的 msg_seq 区分
- 不带
msg_id 的请求 = 主动消息 = 当前策略下一律拒绝
插件的文本命令回复路径正常工作,说明 SDK 层具备被动回复能力;但 player-events 推送与 agent 的 Markdown 发送路径没有把最近事件的 id 传递下去。
同类项目的相同 Bug 与修复方案(参考)
| 项目 |
问题单/PR |
修复方式 |
| zeroclaw |
issue #1549 → PR #1589 |
"QQ replies now carry passive-reply fields (msg_id + incremental msg_seq) when responding to inbound events" |
| openhanako |
issue #656 |
桥接层遗漏 _msgId 传参,补上后恢复 |
| nanobot |
PR #1307 |
"pass msg_id in QQ reply to avoid proactive message permission error" |
建议修复方案
- 在事件入口缓存每个群最近一次
GROUP_AT_MESSAGE_CREATE 的 id 与时间戳
- 所有群聊发送默认附加该
msg_id 并维护递增 msg_seq
- 对超过 5 分钟窗口或已达 5 次上限的场景(如深夜进服推送):
- 可选择静默丢弃并仅记录 debug 日志;或
- 引用
GROUP_MSG_RECEIVE 类事件的 event_id(如平台支持)作为替代
- 文档注明
bot.groups 需填写 Group OpenID 而非数字群号
复现步骤
- 配置好 app-id/secret/groups(Group OpenID),机器人正常连接
- 玩家进出服务器 → 控制台报 40034105
- 在群里 @机器人 执行
/agent 任意任务 → AI 返回后 Markdown 发送报 40034105
- 对比发送
查在线 → 正常回复
感谢维护这个项目!如果需要更多日志细节或配合测试修复版,随时联系。
[Bug] 群聊回复/进退服通知未携带 msg_id,被QQ判定为主动消息导致发送失败(40034105)
环境
问题描述
QQ 官方自 2025 年 4 月起关闭了群聊场景机器人的主动消息能力。当前所有不携带
msg_id/event_id的发送请求都会被网关以40034105 主动消息失败, 无权限拒绝。实测发现插件中以下发送路径未携带被动回复字段,全部失败:
关键证据:Agent 触发消息收到后 4 秒内的错误通知发送即失败,此时
msg_id显然仍在 5 分钟有效期内 —— 说明请求根本没有附带msg_id(若附带了过期 id 会报40034005/40034128而非40034105)。日志时间线
另有一个相关小问题:配置
bot.groups若填写数字群号会报11255 请求的资源不存在(用户/群已注销),必须填 Group OpenID —— 建议在 README/WebUI 中明确标注。根因分析
QQ 官方被动回复规则(发送群聊消息文档):
msg_id(来自GROUP_AT_MESSAGE_CREATE事件的d.id),5 分钟内有效msg_id最多回复 5 次,需用递增的msg_seq区分msg_id的请求 = 主动消息 = 当前策略下一律拒绝插件的文本命令回复路径正常工作,说明 SDK 层具备被动回复能力;但 player-events 推送与 agent 的 Markdown 发送路径没有把最近事件的
id传递下去。同类项目的相同 Bug 与修复方案(参考)
msg_id+ incrementalmsg_seq) when responding to inbound events"_msgId传参,补上后恢复建议修复方案
GROUP_AT_MESSAGE_CREATE的id与时间戳msg_id并维护递增msg_seqGROUP_MSG_RECEIVE类事件的event_id(如平台支持)作为替代bot.groups需填写 Group OpenID 而非数字群号复现步骤
/agent 任意任务→ AI 返回后 Markdown 发送报 40034105查在线→ 正常回复感谢维护这个项目!如果需要更多日志细节或配合测试修复版,随时联系。