expense-tracker
目标
面向个人用户:手机里塞满了银行短信、微信/支付宝支付通知、外卖订单、打车凭证、各类缴费成功提醒。本 skill 把这些"涉及钱"的通知抽出来,按类目和时间两个维度汇总,并给出总支出。
用户通过安装弹窗的「关注什么事」字段设置汇总偏好,如:每周汇总、重点看餐饮和出行、只关注大额消费等。
不假设特定的支付习惯、银行卡或商家——全部从通知数据中识别。
数据加载策略
- 先通过
openclaw ntf storage-path获取通知存储目录(用 Bash 工具运行该命令,stdout 即是目录的绝对路径)。后续所有通知文件直接在这个目录下,命名为YYYY-MM-DD.json。 - 文件命名:
YYYY-MM-DD.json,一天一文件,包含当日全部 App 通知 - 加载优先级:① 用户在 prompt 里明确给的路径 > ②
<storage-path>/<YYYY-MM-DD>.json - 时间窗口(按用户问法动态决定):
- "今天花了多少" → 仅当天日期对应的文件
- "昨天花了多少" → 仅昨天日期对应的文件
- "这周/本周" → 本周一 00:00 至今
- "上周" → 上周一至上周日
- "这个月/本月" → 当月 1 日至今
- "上个月" → 上月 1 日至上月末
- "最近" / "最近几天" → 默认近 7 天
- "最近 N 天" → 近 N 天
- 用户给定具体日期段(如 "5/1-5/7")→ 严格按用户指定
- 定时任务中根据「关注什么事」中的汇总周期决定:如"每周汇总"→ 近 7 天,"每月汇总"→ 当月至今
- 跳过不存在的文件,不报错
- 若
openclaw ntf storage-path不可用,提示用户给出数据路径 - 若用户在问句里指定了类目(如"这周外卖花了多少"),在加载完后做类目过滤再展示
输入数据 schema
JSON 数组,每条:
{"appName":"com.tencent.xin","title":"群名或联系人名","content":"消息内容","timestamp":"2026-04-22T10:30:00.000+08:00","appDisplayName":"微信"}
appDisplayName区分来源:微信 / 短信 / 支付宝 / 云闪付 / 美团 / 饿了么 / 滴滴出行 / 邮件 等title为发送方("工商银行"、"招商银行信用卡"、"美团外卖"、商家名、联系人名)content中通常含金额字段(¥X.XX / X.XX 元 / RMB X.XX)
核心逻辑
1. 金额信号识别
扫一遍全部通知,识别"已发生支付"的事件。重点信号:
- 银行 / 信用卡短信:含「消费 / 支付 / 扣款 / 取现 / 还款 / POS / 网银 / 快捷支付 ¥X.XX」
- 支付平台通知(支付宝、微信支付、云闪付):付款成功 / 转账已到账 / 收款 / 退款
- 外卖订单(美团、饿了么等):订单已支付 / 已送达 + 实付金额
- 打车 / 出行:行程结束 + 实付
- 加油:加油站电子发票 / 油卡扣款短信
- 生活缴费:水 / 电 / 燃气 / 物业 / 宽带 / 话费充值的"缴费成功"通知
- 快递代收费:菜鸟驿站 / 丰巢取件费、超时保管费
- 网购确认订单(淘宝 / 京东 / 拼多多 / 唯品会 等):付款成功通知
- 商超 / 线下刷卡:银行短信里的 POS 消费
- 转账:微信转账、支付宝转账给个人的(单独标记,不混入消费)
- 退款 / 返现 / 红包退回:作为负值纳入对应类目,影响该类目和总额
每条事件抽取:{时间, 来源 App, 商家/标题, 金额, 类目, 备注}。
2. 类目自动归类
| Emoji | 类目 | 典型来源 | |---|---|---| | 🍱 | 餐饮外卖 | 美团 / 饿了么 / 餐饮店刷卡 / 咖啡奶茶 | | 📦 | 快递物流 | 菜鸟 / 丰巢 / 顺丰寄件 / 取件费 | | 🏠 | 生活缴费 | 水电燃气 / 物业 / 宽带 / 话费 | | 🚗 | 出行交通 | 滴滴 / 高德打车 / 地铁 / 高铁 / 加油 | | 🛒 | 购物 | 淘宝 / 京东 / 拼多多 / 商超刷卡 | | 💳 | 信用卡还款 | 信用卡还款短信、贷款扣款 | | 🔁 | 转账 | 给个人的微信/支付宝转账(与消费分开统计) | | 🎓 | 教育 | 培训机构 / 课外班缴费 | | 💊 | 医疗 | 医院 / 药店 / 体检 | | 🎁 | 其他 | 不能明确归入以上的 |
不能确定类目时一律归 🎁 其他,不要硬塞。
如果用户在「关注什么事」中指定了重点类目(如"重点看餐饮和出行"),在输出中将这些类目置顶并高亮。
3. 去重
同一笔交易常被多个通知重复推送(银行短信 + 支付平台 App + 商家小程序)。去重规则:
- 金额完全一致 + 商家关键词重叠 → 视为同一笔,保留信息最完整的一条(优先银行短信 > 支付平台 > 商家通知)
- 不要把"待支付提醒"和"支付成功"算两次
4. 输出视图(按用户问法切换)
A. 总览模式("最近花了多少 / 今天花了多少 / 这周花了多少") 按类目 + 按日期两段都给出。
B. 单类目模式("这周外卖花了多少 / 这个月打车花了多少") 仅展示该类目,按日期列明细。
详见下文输出模板。
过滤规则
- 营销 / 优惠券 / 满减推送("立减 X 元"、"满 X 减 Y"、"X 元红包待领取"、"返现 X 元活动")→ 丢弃。只看真实发生的支付。
- 账单生成提醒("您的信用卡账单已生成 ¥X,还款日 ...")→ 不计入"花了多少";如果用户问的是"还要还多少"才单独列;本 skill 主流程不计入总额。
- 额度 / 余额变动通知里没有金额或不含商家的 → 列入"待确认"小节,不计入总额。
- 股票 / 基金 / 理财收益变动 → 不算消费,丢弃。
- 小红书 / 拼多多 / 抖音的纯运营推送、新品推荐、直播预告 → 丢弃。
- 退款单独标记:在条目末尾用
(退款 -¥X.XX)形式呈现并冲减总额。 - 个人转账单独成块:转给家人朋友的微信/支付宝转账放在「🔁 转账」块,不计入"消费总支出",但单独给出"转账合计"。
输出模板
A. 总览模式
💰 消费汇总(YYYY-MM-DD ~ YYYY-MM-DD)
总支出:¥X,XXX.XX(共 N 笔)
转账合计(不计入支出):¥X,XXX.XX(M 笔)
━━ 按类目 ━━
🍱 餐饮外卖 ¥XXX.XX(N 笔)
🛒 购物 ¥XXX.XX(N 笔)
🚗 出行交通 ¥XXX.XX(N 笔)
🏠 生活缴费 ¥XXX.XX(N 笔)
📦 快递物流 ¥XX.XX(N 笔)
💳 信用卡还款 ¥XXX.XX(N 笔)
...
━━ 按日期 ━━
M/D(周X)¥XXX.XX
🍱 美团外卖 ¥XX.XX <店名>
🚗 滴滴打车 ¥XX.XX <路线/起终点>
🛒 淘宝 ¥XX.XX <商品名>
M/D(周X)¥XXX.XX
...
━━ 待确认 ━━(如有)
☐ <来源>:<原文摘要>,金额未识别
B. 单类目模式
🍱 餐饮外卖(YYYY-MM-DD ~ YYYY-MM-DD)
合计:¥XXX.XX(N 笔)
M/D(周X)
美团外卖 ¥XX.XX <店名>
瑞幸 ¥XX.XX
M/D(周X)
饿了么 ¥XX.XX <店名>
...
质量约束
- 含金额关键字(¥ / 元 / RMB /
\d+\.\d{2})的支付/扣款/订单通知应100% 被抽取并归类 - 去重:同一笔不能被算两次(典型反例:银行短信 + 支付宝 App 同时通知 ¥38.50 美团付款)
- 总额自洽:按类目合计 = 按日期合计 = 顶部「总支出」
- 退款用负数冲减,并在备注里注明 "(退款)"
- 不编造:通知里没有金额或商家就不要硬填,归入"待确认"
- 转账与消费严格分块,避免把转给亲友的钱算成"花掉了"
Scan to join WeChat group