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:
if _is_self_sent(m):
continue
from_user = (m.get("FromUserName") or m.get("from") or "").strip()
content = (m.get("Content") or m.get("content") 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 _unwrap_wechat_field(m.get("content")) or "").strip()
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 not _allowed_ai_reply(key, from_user):
@@ -220,8 +220,8 @@ def _on_ws_message(key: str, data: Any) -> None:
for m in data:
if not isinstance(m, dict) or _is_self_sent(m):
continue
from_user = (m.get("FromUserName") or m.get("from") or "").strip()
content = (m.get("Content") or m.get("content") 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 _unwrap_wechat_field(m.get("content")) or "").strip()
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 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])
m = data if isinstance(data, dict) else {}
if not _is_self_sent(m):
from_user = (m.get("FromUserName") or m.get("from") or "").strip()
content = (m.get("Content") or m.get("content") 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 _unwrap_wechat_field(m.get("content")) or "").strip()
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 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)
try:
payload: Any = body
# 7006 回调当前格式示例{"key": "...", "message": {...}, "type": "message"}
# 优先按回调 message 结构归一化,再回退到 Data/data 解包。
if isinstance(body, dict) and body.get("message"):
normalized = _normalize_callback_message(body)
if normalized:
payload = [normalized]
# 7006 回调格式{"key": "...", "message": {...}|[...], "type": "message"} 或 {"key": "...", "Data": {...}}
if isinstance(body, dict) and body.get("message") is not None:
msg = body.get("message")
if isinstance(msg, list):
# message 为数组时逐条归一化
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):
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
_on_ws_message(k, payload)
logger.info("callback message saved to sync_messages, key=%s", k[:8] + "..." if len(k) > 8 else k)