这破对账我是一天都不想干了。上个月光核对支付宝、微信、银行卡三边的流水就花了整整两个下午,眼都快看瞎了,最后还差三百块钱死活对不上,气得我差点把电脑砸了。不行,必须得让机器来干这个。
我拆了一下,核心就三件事:数据抓取、规则匹配、结果输出。听起来简单,但魔鬼全在细节里。先说抓取,支付宝和微信的账单页面都是动态渲染的,直接用 requests 拿不到数据。早几年我肯定上 Selenium 或者 Puppeteer 了,但现在这年头,再开个浏览器实例太笨重。我试了试直接调他们手机端的接口,发现需要 token 和一堆加密参数,逆向工程成本太高,不划算。最后用了 Playwright,写个脚本模拟登录,然后等页面加载完直接抽取 DOM 树里的表格数据,存成结构化的 JSON。这里有个坑,微信账单的“业务类型”那个下拉框会触发重新渲染,必须先用 `page.select_option` 选好“全部”再抓。
数据拿到了,清洗更恶心。三方平台的命名规则完全不一样。比如我在“老王包子铺”买早餐,支付宝记录是“老王包子铺(朝阳路店)”,微信是“老王包子铺-商户”,银行卡账单可能直接显示一个第三方支付公司的名字“XX付”。以前我靠人工肉眼模糊匹配,现在得写规则。我先用关键词字典做第一轮匹配,“包子铺”映射到“餐饮”类目下的“早餐”。但很多交易记录根本没明显特征,比如一些对公转账。这部分我上了大模型,用 GPT-4 的 API,把交易对方和备注拼接成一句话,让它判断最可能的业务类型和项目名称。Prompt 我调了很久:“请将以下交易记录归类到[餐饮、交通、办公、采购、薪酬、其他]中,并提取核心项目名称。只返回‘类别:项目名称’的格式。记录:XXX”。准确率能到95%以上,但得注意控制 API 调用频率和成本,我把所有记录攒一批一次性发过去问。
匹配逻辑是重头戏。核心是基于时间、金额和备注的模糊匹配。我写了个匹配引擎:首先,时间窗口设为±2分钟,金额必须完全相等(浮点数比较用 decimal)。在这基础上,优先匹配备注里含有相同关键字的(比如都提到了同一个合同编号)。如果还匹配不上,就动用“疑似匹配”队列,人工最后复核的条目会进入一个学习池,下次遇到类似的,系统会提示“是否与历史记录‘XX’为同一笔?”逐渐减少人工干预。这个引擎我用 Python 写的,核心是 pandas 的 merge 和自定义 apply 函数,跑起来很快。
最后是输出和归档。匹配好的数据,自动生成一个带颜色标记的 Excel:完全匹配的绿色,疑似匹配的黄色,完全没匹配上的红色。同时,用 n8n 搭了个工作流:每周五晚上自动触发抓取脚本,跑完匹配引擎,把结果 Excel 发到我邮箱,同时把原始数据和匹配日志自动上传到 Google Drive 指定文件夹,按“年月”归档。整个流程走完,我现在每周只需要花5分钟打开邮件,看一眼黄色和红色的部分,确认一下就行。
搞完这个,我坐在那儿,感觉不是轻松,而是有点悲哀。我花了十几个小时,去解决一个我“本该”花两小时忍受的琐事。这值吗?但转头一想,这两小时是每周都被剥夺的两小时,是带着烦躁和疲惫的两小时。而我这十几个小时,是一次性的投资。更重要的是,我把“核对账目”这个充满不确定性的心理负担,从我的生活里彻底删除了。现在它变成了一个安静的、后台自动运行的进程,连个提醒都不会弹。技术所谓的“赋能”,到头来最好的用处,可能就是把这些细碎的、磨人的“债务”给清偿掉,把被琐事切碎的时间,重新缝合成整块。缝好了,才能拿去干点像样的人该干的事。














