“账单不难管,难的是每次都要手动点开压缩包,然后去找密码……”

作为一个软件开发者,我除了本职工作,也经常接些副业项目。加上日常各种零碎的支出,其实每天的消费记录都不少。

因为家里有一台自己的服务器,我一直尝试把一些个人信息收集起来,比如智能设备的健康数据、电脑使用记录等等,再集中在一个小网站上做可视化统计。消费记录,自然是其中的重要一环。

但在这整条“账单自动化”链路中,有一步始终特别烦人:

每月下载账单 → 找密码解压 → 打开 CSV → 清洗数据 → 导入系统

更麻烦的是,压缩包的密码通过公众号/服务号发来,而账单本身发到邮箱,你得手动去翻邮件下载,再手动复制密码、解压、处理数据。

虽然信息提取和入库我早已脚本化,但“下载 + 解压 + 找密码”这块,始终让我觉得冗余又机械。

直到某天上厕所时突然想到:

账单都发到邮箱了,我干嘛不让服务器自己监听,收到就自动处理?

一旦这一步打通,剩下唯一的问题就是——

怎么让程序自己解开带密码的压缩包?


我的目标很简单

我那个展示统计信息的网站是 PHP 写的,那干脆就用 PHP 解决这整个账单处理流程。

目标就四个字:全自动化

具体来说就是:

  • 自动解析支付宝、微信账单的 zip 压缩包;
  • 无需手动输入密码,自动暴力破解;
  • 解压出内部 CSV 后自动提取数据;
  • 拆成 Composer 包,按需引入。

暴力但有效的解决方案

微信和支付宝的账单压缩包有个共同特点:密码是 6 位纯数字(比如支付密码的后六位)。

也就是说,总共只有 100 万种组合,从 000000​ 到 999999​。

对电脑来说,这点穷举量根本不叫事。但如果用 PHP 来暴力破解……就有点像拿自行车拉货了。

PHP 作为解释型语言,每行代码都得“边跑边翻译”,又要频繁创建变量、垃圾回收,性能开销很大。真让它跑完一轮,全核 CPU 干到 100%,可能也得跑个几分钟,体验非常拉跨。

所以我干脆请出 C 语言,用多线程 pthread​ 调用 libzip​ 的底层 API 来解压:

  • 秒级完成密码破解;
  • 多线程并发不拖后腿;
  • 性能消耗低,不影响主机运行。

项目地址(已开源)

代码我已经开源,逻辑非常直白,欢迎参考:

之所以拆成两个包,是因为它们的解压逻辑、编码格式、字段结构等略有差异。也考虑到有些人可能只需要其中一个平台,所以没必要整合成一个大包。


最后

在写这个工具之前,我每个月都得花十几分钟:下载账单、找密码、解压、清洗、导入……虽然听起来不长,但真的是每次都烦,而且完全是重复劳动。

现在整个流程已经完全自动化:

  • 服务器监听到账单邮件通知
  • 自动下载 zip 压缩包
  • 自动解压 + 数据解析
  • 存入数据库
  • 网页前端实时展示图表

我唯一需要做的,就是每月把账单导出发送到邮箱。其它的,服务器自动搞定。


仓库地址就在上面,感兴趣的朋友欢迎 Star、一起来交流。如果你也曾为这些小事烦恼过,希望这个工具对你有帮助。也欢迎分享给身边有同样需求的人。