[Bug] QQ频道消息无法回复:markdown 回退顺序有误,误用主动消息导致 304049 限频
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 82/100
Hướng nghiên cứu
Bắt đầu tại _send_with_markdown_fallback() trong tệp nguồn nền tảng QQ Official qqofficial_message_event.py; đọc nhánh except _QQOFFICIAL_SEND_API_ERRORS từng dòng để thấy rằng msg_id được pop ra trước khi markdown bị loại bỏ. Sửa lỗi phân nhánh trước tiên trên lỗi 50056 'markdown not allowed' — loại bỏ markdown, đặt content ở dạng văn bản thường và điều chỉnh msg_type, giữ nguyên msg_id — và chỉ chuyển sang gửi chủ động (không có msg_id) với các lỗi khác. Kết quả mong muốn là một trả lời kênh thành công dưới dạng tin nhắn bị động không có 304049, trong khi hành vi markdown trong chat một-một không thay đổi.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
🐛 问题描述
QQ 频道场景下机器人无法回复消息,报错「主动消息限频」—— 但这只是普通被动回复。
🌍 环境
- AstrBot
4.28.2(4.29.0-beta.1/master/dev同样存在) - 平台:QQ 官方机器人(
qq_official) - 配置:
use_markdown = true
🔁 复现
use_markdown = true- 用户在 QQ 频道给机器人发消息
- 机器人回复失败
📜 日志
[QQOfficial] 回复消息失败: 不允许发送原生 markdown, 尝试使用主动发送接口。
botpy.errors.NotFoundError: 私信主动消息数限频
https://api.sgroup.qq.com/dms/{guild_id}/messages → 404
🔑 错误码
| 错误码 | 含义 |
|---|---|
50056 |
不允许发送 markdown content(触发点) |
304049 |
私信主动消息数限频(最终失败) |
🔍 根因
qqofficial_message_event.py 的 _send_with_markdown_fallback():
except _QQOFFICIAL_SEND_API_ERRORS as err:
if payload.get("msg_id"):
fallback_payload = payload.copy()
fallback_payload.pop("msg_id", None) # ❌ 先去 msg_id → 变主动消息
return await send_func(fallback_payload) # → 撞 304049
...
# 去掉 markdown、保留 msg_id(正确做法,但轮不到执行)
回退没按错误类型分流:markdown 被拒(50056)时应保留 msg_id、只去掉 markdown。
而官方规定「私信每个用户每天仅 2 条主动消息」,额度一空频道就彻底无法回复。
🛠 建议修复
在去掉 msg_id 之前先处理 markdown:
if (QQOfficialMessageEvent.MARKDOWN_NOT_ALLOWED_ERROR in str(err)
and payload.get("markdown") and plain_text):
md_payload = payload.copy()
md_payload.pop("markdown", None)
md_payload["content"] = plain_text
if md_payload.get("msg_type") == 2:
md_payload["msg_type"] = 0
try:
return await send_func(md_payload) # 保留 msg_id,走被动通道
except _QQOFFICIAL_SEND_API_ERRORS as e2:
err, payload = e2, md_payload
✔️ 验证情况(已实测通过 ✅)
实测方式:临时禁用所有插件层规避手段(即让 markdown 真正被发送),
完整触发 50056 → 回退 链路,观察补丁行为。
实测日志(20:01):
[20:01:34] 频道用户发送消息
[20:01:38] [QQOfficial] 回复消息失败: 不允许发送原生 markdown, 尝试使用主动发送接口。
[20:01:39] [QQOfficial] markdown 不被支持,已改用纯文本(保留被动回复)。 ← 补丁生效
[20:01:39] → 消息发送成功(无 Failed to send)
结果:
- ✅ 频道私信回复恢复正常
- ✅ 回退逻辑按预期执行:保留
msg_id、仅去掉markdown(走被动通道) - ✅ 不再出现
304049 私信主动消息数限频 - ✅ 单聊 markdown 不受影响(`)频道才降级)**
其他已验证项:
- ✅ 根因判断:逐行核对
_send_with_markdown_fallback控制流 - ✅ 补丁可应用性:
patch -p1成功,结果与修复后文件逐字节一致 - ✅ 补丁语法:
py_compile通过
- Ngôn ngữ chính
- Python
- Star
- 41.4k
- Fork
- 3k
- Merge trung bình
- 1 ngày 5 giờ
- Pull request đã merge (30 ngày)
- 140
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của AstrBotDevs/AstrBot
-
Text-to-image rendering suppresses asyncio task cancellationCó thể đã có người làm @kilisamemarisaaa đã nhận 2 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 80/100
AstrBotDevs/AstrBot#10389 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
AstrBotDevs/AstrBot#10388 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Boxlite boot treats any HTTP response as a healthy sandboxCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
AstrBotDevs/AstrBot#10385 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Feature] 修改「模型提供商」入口名称Đang mởenhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
AstrBotDevs/AstrBot#10378 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Feature] 移除「切换到旧版知识库」入口Có thể đã có người làm @silvaling đã nhận 4 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
AstrBotDevs/AstrBot#10340 · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của AstrBotDevs/AstrBot
Issue tương tự
-
changelog investigate
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
ramnes/notion-sdk-py#409 ·
-
good first issue help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
lindicaphxag-tech/kaggle#28 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
BSData/horus-heresy-3rd-edition#3211 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug needs-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
Maintainer thường phản hồi trong vòng 1 ngày
-
bug tests
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 1 ngày