fix: 修复实时消息报错内容

This commit is contained in:
丹尼尔
2026-03-15 18:11:31 +08:00
parent 31cac56fad
commit 9f0e2a2db2

View File

@@ -202,8 +202,8 @@ def _on_ws_message(key: str, data: Any) -> None:
for m in msg_list: for m in msg_list:
if _is_self_sent(m): if _is_self_sent(m):
continue continue
from_user = (m.get("FromUserName") or m.get("from") or "").strip() from_user = (m.get("FromUserName") or m.get("from") or _unwrap_wechat_field(m.get("from_user_name")) or "").strip()
content = (m.get("Content") or m.get("content") or "").strip() content = (m.get("Content") or m.get("content") or _unwrap_wechat_field(m.get("content")) or "").strip()
msg_type = m.get("MsgType") or m.get("msgType") msg_type = m.get("MsgType") or m.get("msgType")
if from_user and content and (msg_type in (1, None) or str(msg_type) == "1"): # 仅文本触发 AI if from_user and content and (msg_type in (1, None) or str(msg_type) == "1"): # 仅文本触发 AI
if not _allowed_ai_reply(key, from_user): if not _allowed_ai_reply(key, from_user):
@@ -220,8 +220,8 @@ def _on_ws_message(key: str, data: Any) -> None:
for m in data: for m in data:
if not isinstance(m, dict) or _is_self_sent(m): if not isinstance(m, dict) or _is_self_sent(m):
continue continue
from_user = (m.get("FromUserName") or m.get("from") or "").strip() from_user = (m.get("FromUserName") or m.get("from") or _unwrap_wechat_field(m.get("from_user_name")) or "").strip()
content = (m.get("Content") or m.get("content") or "").strip() content = (m.get("Content") or m.get("content") or _unwrap_wechat_field(m.get("content")) or "").strip()
msg_type = m.get("MsgType") or m.get("msgType") msg_type = m.get("MsgType") or m.get("msgType")
if from_user and content and (msg_type in (1, None) or str(msg_type) == "1"): if from_user and content and (msg_type in (1, None) or str(msg_type) == "1"):
if not _allowed_ai_reply(key, from_user): if not _allowed_ai_reply(key, from_user):
@@ -236,8 +236,8 @@ def _on_ws_message(key: str, data: Any) -> None:
store.append_sync_messages(key, [data]) store.append_sync_messages(key, [data])
m = data if isinstance(data, dict) else {} m = data if isinstance(data, dict) else {}
if not _is_self_sent(m): if not _is_self_sent(m):
from_user = (m.get("FromUserName") or m.get("from") or "").strip() from_user = (m.get("FromUserName") or m.get("from") or _unwrap_wechat_field(m.get("from_user_name")) or "").strip()
content = (m.get("Content") or m.get("content") or "").strip() content = (m.get("Content") or m.get("content") or _unwrap_wechat_field(m.get("content")) or "").strip()
msg_type = m.get("MsgType") or m.get("msgType") msg_type = m.get("MsgType") or m.get("msgType")
if from_user and content and (msg_type in (1, None) or str(msg_type) == "1"): if from_user and content and (msg_type in (1, None) or str(msg_type) == "1"):
if not _allowed_ai_reply(key, from_user): if not _allowed_ai_reply(key, from_user):
@@ -1372,15 +1372,31 @@ async def api_callback_wechat_message(request: Request, key: Optional[str] = Que
logger.warning("callback_log append failed: %s", le) logger.warning("callback_log append failed: %s", le)
try: try:
payload: Any = body payload: Any = body
# 7006 回调当前格式示例{"key": "...", "message": {...}, "type": "message"} # 7006 回调格式{"key": "...", "message": {...}|[...], "type": "message"} 或 {"key": "...", "Data": {...}}
# 优先按回调 message 结构归一化,再回退到 Data/data 解包。 if isinstance(body, dict) and body.get("message") is not None:
if isinstance(body, dict) and body.get("message"): msg = body.get("message")
normalized = _normalize_callback_message(body) if isinstance(msg, list):
if normalized: # message 为数组时逐条归一化
payload = [normalized] normalized_list = []
for m in msg:
if isinstance(m, dict):
n = _normalize_callback_message({"message": m})
if n:
normalized_list.append(n)
if normalized_list:
payload = normalized_list
else:
normalized = _normalize_callback_message(body)
if normalized:
payload = [normalized]
elif isinstance(body, dict): elif isinstance(body, dict):
inner = body.get("Data") or body.get("data") inner = body.get("Data") or body.get("data")
if isinstance(inner, (dict, list)): if isinstance(inner, dict) and (inner.get("from_user_name") is not None or inner.get("FromUserName") is not None):
# Data/data 为单条消息结构时也归一化,保证 FromUserName/Content 等字段统一
normalized = _normalize_callback_message({"message": inner})
if normalized:
payload = [normalized]
elif isinstance(inner, list):
payload = inner payload = inner
_on_ws_message(k, payload) _on_ws_message(k, payload)
logger.info("callback message saved to sync_messages, key=%s", k[:8] + "..." if len(k) > 8 else k) logger.info("callback message saved to sync_messages, key=%s", k[:8] + "..." if len(k) > 8 else k)