diff --git a/backend/main.py b/backend/main.py index 718b551..2a52078 100644 --- a/backend/main.py +++ b/backend/main.py @@ -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)