From eb544b2bd6d3c8ecb1c98c0dc9396b43a3d6a838 Mon Sep 17 00:00:00 2001 From: ylytdeng Date: Tue, 12 May 2026 21:11:19 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20monitor=5Fweb=20=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=20=5Fextract=5Ftransfer=5Finfo=20=E9=81=BF=E5=85=8D=E5=8F=8C?= =?UTF-8?q?=E4=BB=BD=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #85 把转账消息解析放在了 mcp_server._extract_transfer_info(处理 snake/camel 字段名漂移 + 未知 paysubtype 兜底),但 monitor_web.py 内联重新实现了一遍 paysubtype 标签表 + camelCase fallback。 后果:将来 WeChat 新增 paysubtype 时需要两处改,容易漂。 修复:monitor_web 改为调 mcp_server._extract_transfer_info,跟 chat_export_helpers._extract_transfer_extras 走同一条路径。 UI 行为零变化: - 已知 paysubtype 显示中文 label(同原行为) - 未知 paysubtype 显示空串(避免"未知(paysubtype=N)"在 UI 出现) - 字段抽取/截断逻辑不变 本地验证 OLD vs NEW 字节级一致。 Co-Authored-By: Claude Opus 4.7 (1M context) --- monitor_web.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/monitor_web.py b/monitor_web.py index 77feeb6..8132211 100644 --- a/monitor_web.py +++ b/monitor_web.py @@ -1318,26 +1318,23 @@ class SessionMonitor: 'items': items, } elif app_type == 2000: - # 微信转账 — paysubtype 含义为社区共识表,1/3/4 跨版本一致; - # 字段名在不同版本有 snake/camel 漂移,逐个尝试 - info = appmsg.find('wcpayinfo') - paysubtype = '' - fee_desc = '' - pay_memo = '' - if info is not None: - paysubtype = (info.findtext('paysubtype') or '').strip() - fee_desc = (info.findtext('feedesc') or info.findtext('feeDesc') or '').strip() - pay_memo = (info.findtext('pay_memo') or info.findtext('paymemo') or '').strip() - direction = { - '1': '发起转账', '3': '已收款', '4': '已退还', - '5': '过期已退还', '7': '待领取', '8': '已领取', - }.get(paysubtype, '') + # 微信转账 — 复用 mcp_server 已有的解析器,单一来源避免字段漂移 + # (snake/camel 大小写、未来新 paysubtype 兜底)。 + import mcp_server # 已被 chat_export_helpers 验证 import 安全 + info = mcp_server._extract_transfer_info(appmsg) or {} + pay_memo = info.get('pay_memo', '') + paysubtype = info.get('paysubtype', '') + # 已知 paysubtype 显示中文 label;未知用空串而非"未知(paysubtype=N)", + # 避免 UI 出现内部诊断字串。日志侧若需要可看 chat history。 + direction = (info.get('paysubtype_label', '') + if paysubtype in mcp_server._TRANSFER_PAYSUBTYPE_LABEL + else '') return { 'type': 'transfer', 'title': title or '微信转账', 'direction': direction, 'paysubtype': paysubtype, - 'fee_desc': fee_desc, + 'fee_desc': info.get('fee_desc', ''), 'pay_memo': pay_memo[:200] if pay_memo else '', } else: