Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

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

Aperta Adatta ai principianti
#10,420 4 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@he-yufeng ci sta già lavorando.

Dal 8/10/2026.

  • #10451 di @he-yufeng — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
82/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
api

Direzione di ricerca

Parti da _send_with_markdown_fallback() nel file sorgente della piattaforma QQ Official qqofficial_message_event.py; leggi il ramo except _QQOFFICIAL_SEND_API_ERRORS riga per riga per verificare che msg_id venga estratto (pop) prima che il markdown venga rimosso. La correzione si ramifica prima sull'errore 50056 'markdown not allowed' — elimina markdown, imposta content testuale semplice e adatta msg_type, mantenendo msg_id — e passa all'invio proattivo (senza msg_id) solo per gli altri errori. Il risultato atteso è che una risposta di canale abbia successo come messaggio passivo senza 304049, mentre il comportamento del markdown nella chat individuale resta invariato.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

🐛 问题描述

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 通过
Lingua principale
Python
Stelle
41.4k
Fork
3k
Merge medio
1g 5h
PR unite (30g)
145

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di AstrBotDevs/AstrBot

Tutte le issue di AstrBotDevs/AstrBot

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.