Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

[Bug] QQ频道消息无法回复:markdown 回退顺序有误,误用主动消息导致 304049 限频

Đang mở Phù hợp với người mới
#10,420 2 bình luận 0 reaction 0 người được giao Xem trên GitHub

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
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python
Lĩnh vực
api

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

🔁 复现

  1. use_markdown = true
  2. 用户在 QQ 频道给机器人发消息
  3. 机器人回复失败

📜 日志

[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

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. 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.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của AstrBotDevs/AstrBot

Tất cả issue của AstrBotDevs/AstrBot

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.