2026-10-06 · 原文发布日
银行短信自动记账并用Telegram问账
这个n8n模板把安卓手机转发的银行短信通过带鉴权的webhook接收,解析出金额、收支方向、商户、卡号后四位等字段,OTP和陌生发件人会被拒收。完整交易写入Google Sheets账本,信息不全的进复核标签页;另配一个由Claude驱动的Telegram机器人,可读账本和复核队列回答花销问题。模板免费。
原文要点
这个免费n8n模板分两条线:一是安卓短信转发器把银行短信POST到带HTTP Header Auth的webhook,解析代码提取金额、借贷方向、日期、商户、支付方式、参考号、卡号后四位,OTP和不在白名单的发件人直接拒收(返回422);完整交易upsert进Google Sheets的Expenses表,信息不全的进Review_Queue表(都返回200 JSON)。二是Telegram触发器接一个用Anthropic Claude的LangChain agent,带短期记忆,可读Expenses和Review_Queue并用计算器工具做精确计算,纯文本回复到原聊天。
这次做成什么
用合成银行短信在本站练习中跑通‘鉴权接收→解析→分流记账’主线,并搭一个能回答花销问题的Telegram查询机器人。练习用隔离的测试Sheet和虚构短信,不碰真实银行账户。解析正则需按你自己银行短信格式调整,原模板的具体解析代码需在模板页核对。
准备什么
- 一个n8n实例,webhook地址能被手机访问到
- Google账号及新建Sheet(含Expenses和Review_Queue两个标签页)
- Telegram账号,能通过BotFather建bot
- Anthropic API key(Claude调用计费);练习主线不用真安卓手机,用curl发合成短信即可
具体怎么做
建账本Sheet并接凭据
新建Google Sheet,建Expenses标签页,列:date, amount, direction, merchant, method, refId, accountLast4, rawText, eventId;建Review_Queue标签页用同样列加reason。n8n里配置Google Sheets OAuth2凭据,后续所有Sheets节点选这个文档。
配鉴权webhook并造白名单
Webhook节点设POST路径如/bank-sms,认证方式选Header Auth,新建凭据如X-Relay-Key: 一串随机长字符串。解析Code节点里维护allowedSenders数组,练习期填['TEST-BANK','BANK-SIM']这类虚构发件人ID;真实使用时换成你银行的短信端口号。解析逻辑:先拒收含OTP/验证码关键词的,再按正则抽金额和借贷关键词,抽不齐关键字段(金额、方向)的进Review_Queue,抽齐的upsert进Expenses(以refId或eventId去重)。
用curl发合成短信测试三分支
用下面材料的三条curl命令分别测:完整交易应返回200且Expenses新增一行;缺商户名的应返回200且进Review_Queue;含OTP的应返回422且两张表都不动。逐条核对结果后再往下做。
搭Telegram查询机器人
BotFather处/newbot拿token,n8n加Telegram凭据。Telegram Trigger节点收消息→AI Agent节点(Chat Model选Anthropic Claude,加Window Buffer Memory短期记忆)→挂两个Google Sheets工具(读Expenses、读Review_Queue)和一个Calculator工具→Telegram节点把agent的纯文本回复发回原chat_id。System提示词用下面材料,强调算总数必须走计算器、不要心算。
可直接复制的材料
三条合成测试短信与curl命令
全部为虚构测试数据;webhook地址和X-Relay-Key要换成你的;真实使用时sender换成银行真实发件ID。
# 完整交易(应进Expenses,返回200)
curl -X POST https://你的n8n地址/webhook/bank-sms -H 'X-Relay-Key: 你的随机密钥' -H 'Content-Type: application/json' -d '{"sender":"TEST-BANK","message":"Your card ending 4521 was debited EUR 23.50 at CAFE LUMIERE on 06/10/2026. Ref: TXN884201.","event_id":"test-001","sent_at":"2026-10-06T09:15:00Z"}'
# 缺商户(应进Review_Queue,返回200)
curl -X POST https://你的n8n地址/webhook/bank-sms -H 'X-Relay-Key: 你的随机密钥' -H 'Content-Type: application/json' -d '{"sender":"TEST-BANK","message":"EUR 12.00 credited to your account ending 4521 on 06/10/2026.","event_id":"test-002","sent_at":"2026-10-06T10:02:00Z"}'
# OTP(应返回422,两表均不动)
curl -X POST https://你的n8n地址/webhook/bank-sms -H 'X-Relay-Key: 你的随机密钥' -H 'Content-Type: application/json' -d '{"sender":"TEST-BANK","message":"Your OTP is 482913. Do not share it with anyone.","event_id":"test-003","sent_at":"2026-10-06T10:05:00Z"}'Telegram记账agent的system提示词(可粘贴)
本站独立编写;工具名按你在Agent节点里实际挂载的名称调整。
你是个人记账助手。用户用中文问花销问题时,先用Google Sheets工具读取Expenses账本(必要时也看Review_Queue复核队列),任何加总、平均、差额计算必须调用Calculator工具,不要心算。回答用纯文本,不超过四行:先给结论数字,再列构成,最后提示复核队列里是否还有未确认条目影响准确性。如果没有相关数据,直接说账本里没有,不要编造。输入与输出示例
本站虚构演示,非真实运行结果;实际回复取决于模型和工具配置。
输入
Expenses表里已有三条练习记录:CAFE LUMIERE 23.50 EUR(借)、METRO TICKETS 4.90 EUR(借)、SALARY OCT 2100.00 EUR(贷);Review_Queue有一条12.00 EUR贷方缺商户。用户在Telegram问:‘这个月到目前为止花了多少?’对应输出
agent读取Expenses,调Calculator算23.50+4.90=28.40,回复(示意):‘本月借记支出合计28.40 EUR:CAFE LUMIERE 23.50,METRO TICKETS 4.90。另有收入2100.00 EUR。注意:复核队列还有1条12.00 EUR入账未确认商户,不计入支出。’做完检查这些
- OTP测试短信返回422,且Expenses和Review_Queue两张表都没有新增行
- 重复发送同一event_id的完整短信,Expenses里仍然只有一行(upsert去重生效)
- 缺商户短信进入Review_Queue且reason字段写明了缺哪个字段
- Telegram问‘花了多少’时,回复中的总额与手工核算完全一致,说明agent用了计算器而非心算
容易卡住的地方
- X-Relay-Key泄露等于任何人都能往你账本写假交易,密钥要够长且绝不提交进git
- allowedSenders不改成你银行的真实发件ID,所有真短信都会被422拒收
- 不同银行短信格式差异极大,解析正则必须拿自己的真实短信样本逐条调试,别指望模板正则直接匹配中文银行短信
- 短期记忆只在同一Telegram chat内有效,换群或私聊上下文不会延续
- Claude API按token计费,账本行数多时每次问答都全量读表会推高成本,后续可加日期过滤
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Track bank SMS expenses with Google Sheets, Telegram and Claude
- 原作者
- Prudhvi_N8N_official
- 原始发布日期
- 2026-10-05T18:21:30.320Z
- 来源
- https://n8n.io/workflows/20482