From ff73c056e94d3d5b9e9c6b88e9cd3b8a35af2745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Thu, 20 Aug 2026 15:26:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E8=81=8A=E5=A4=A9=E6=8E=92?= =?UTF-8?q?=E7=89=88=E5=8D=87=E7=BA=A7=E5=BE=AE=E4=BF=A1=E6=A0=87=E5=87=86?= =?UTF-8?q?(=E5=B7=A6=E5=8F=B3=E5=88=86=E4=BE=A7+=E5=A4=B4=E5=83=8F+?= =?UTF-8?q?=E7=BB=BF=E6=B0=94=E6=B3=A1)+is=5Fsend=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - is_send 根因:云客消息方向在 mine 字段(isSend 全 null),归一化加 fallback +存量回填 60.7 万行(51万收/16万发)——分侧数据首次完整 - MessageBubble:头像(对方=raw headUrl 在左/自己=默认在右)、自己侧隐藏昵称、 接收白底描边/发送微信绿 #95ec69、气泡列 max-width 78% - 实测混合对话:13发(绿+头像右)/7收(白+头像左)全部正确 Co-Authored-By: Claude --- yunke-server/scripts/scrape_via_page.py | 10 ++++-- yunkes/src/components/MessageBubble.vue | 21 +++++++++-- yunkes/src/style.css | 48 +++++++++++++++++++++---- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/yunke-server/scripts/scrape_via_page.py b/yunke-server/scripts/scrape_via_page.py index 10cd8a4..0d9bfad 100644 --- a/yunke-server/scripts/scrape_via_page.py +++ b/yunke-server/scripts/scrape_via_page.py @@ -655,7 +655,10 @@ async def scrape_messages(cookie_str: str, max_conversations: int = 100): # 用发送的 friend_id(与客户表一致)优先,API 返回的 talker 可能脱敏 "talker_id": friend_id or row.get("talker") or row.get("oriTalker"), "room_id": None, - "is_send": bool(row.get("isSend", 0)) if row.get("isSend") is not None else None, + "is_send": ( + bool(row["isSend"]) if row.get("isSend") is not None + else (bool(row["mine"]) if row.get("mine") is not None else None) + ), "type": _normalize_msg_type(row.get("type")), "type_raw": row.get("type"), "text": row.get("content") or row.get("text") or "", @@ -744,7 +747,10 @@ def _normalize_group_message(row: dict, owner_id: str, room_id: str) -> dict | N "owner_account_id": owner_id, "talker_id": talker or None, "room_id": row.get("roomid") or room_id, - "is_send": bool(row.get("isSend", 0)) if row.get("isSend") is not None else None, + "is_send": ( + bool(row["isSend"]) if row.get("isSend") is not None + else (bool(row["mine"]) if row.get("mine") is not None else None) + ), "type": _normalize_msg_type(row.get("type")), "type_raw": row.get("type"), "text": row.get("content") or row.get("text") or "", diff --git a/yunkes/src/components/MessageBubble.vue b/yunkes/src/components/MessageBubble.vue index 91f0190..db7e017 100644 --- a/yunkes/src/components/MessageBubble.vue +++ b/yunkes/src/components/MessageBubble.vue @@ -1,6 +1,6 @@