2026-10-15 · 原文发布日
Telegram拍小票,Gemini识别后记账到Google表格
一个n8n免费模板:给Telegram机器人发收据照片或文件,工作流下载后交给Google Gemini提取商家、金额、日期、类别、支付方式等JSON字段。置信度高于0.65时直接追加到Google Sheets;低于阈值则暂存到n8n数据表,在Telegram里用按钮请你确认或改选类别,确认后再写入表格并回复成功。
原文要点
原模板发布在n8n模板库(编号21003),免费导入。流程为:Telegram触发器接收照片/文档或按钮回调,下载文件交给Google Gemini提取商家、金额、日期、类别、支付方式及置信度JSON;解析时把无效日期归一为null;置信度高于0.65直接追加到Google Sheets并回复已保存;不高于0.65则连同工作流恢复URL写入n8n Data Table,在Telegram用内联按钮请用户确认或重选类别,确认后写入表格、删除暂存记录并回复成功。需配置Telegram机器人、Gemini (PaLM)、Google Sheets OAuth2三类凭据和一个待审数据表。
这次做成什么
在本站指导下用该免费模板搭一个'拍小票→自动记账'的练习环境:Telegram发图,Gemini识别,高置信度直接入账,低置信度在Telegram按钮确认后入账。本站不提供模板文件本身,需在原页面一键导入。
准备什么
- 一个n8n实例(云版或自托管1.x均可),能访问n8n.io模板库
- 用@BotFather创建的Telegram机器人token,并知道目标聊天ID
- Google AI Studio的Gemini API密钥,能调用多模态Gemini模型
- Google账号及OAuth2凭据,已建好一张含Date、Vendor、Amount、Payment type、Expense Category列的表格
- n8n中可用的Data Table功能,用于暂存低置信度记录
具体怎么做
导入模板并建数据表
在n8n.io/workflows/21003点Use workflow导入到自己实例。随后在n8n左侧Data tables新建名为pending_expenses的表,逐列添加request_id(文本)、resume_url(文本)、vendor(文本)、amount(数字)、date(文本)、category(文本)、payment_method(文本)。在所有Data Table节点里选中这张表。
配置三类凭据
Telegram Trigger和所有Telegram发送节点选择BotFather给的Access Token凭据;两个Gemini分析节点选择Google Gemini (PaLM)凭据并选定一个支持图片输入的Gemini模型;两个Google Sheets追加节点选择OAuth2凭据,并分别指定目标Spreadsheet与Sheet,字段映射按表格列名对应date、vendor、amount、payment_method、category。
设定Telegram触发器为激活状态
模板使用Telegram Trigger监听message(photo/document)和callback_query(内联按钮)。将工作流切换为Active,使Trigger节点真正注册监听;测试期也可点Execute workflow手动监听一次。
发送一张小票测试高置信度路径
用手机拍一张清晰的小票发给机器人。期望链路:下载文件→Gemini返回JSON→置信度>0.65→直接追加到Sheets→Telegram收到'已保存'回复。到表格里核对这一行各列是否填对。
发送模糊小票测试确认路径
故意发一张模糊或遮挡的小票。置信度≤0.65时应收到带按钮的确认消息:先确认类别是否正确,若选'修改'则弹出类别按钮列表,点选后工作流通过resume URL恢复执行,写入Sheets、删除pending_expenses中对应行并回复成功。到数据表确认暂存行已被清理。
核对异常日期处理
模板会把Gemini返回的非法日期归一为null。可发一张日期被裁掉的小票验证:表格中Date列应为空而不是乱码或报错中断。
可直接复制的材料
Gemini收据提取提示词(本站独立编写)
本站按模板字段独立撰写的中文版提示词,可替换原模板Gemini节点中的英文提示词;category枚举值可按你的记账习惯调整。
你是一名收据信息提取器。请识别图片中的购物收据,只输出一个JSON对象,不要输出任何其他文字或代码块标记。字段如下:
- vendor:商家名称(字符串,识别不出填null)
- amount:总金额(数字,只含数值不含货币符号,识别不出填null)
- date:交易日期,格式YYYY-MM-DD(无法确定填null)
- category:消费类别,只能从以下值中选一个:餐饮、交通、超市、日用品、医疗、娱乐、住房、其他
- payment_method:支付方式,只能从以下值中选一个:现金、信用卡、借记卡、移动支付、其他
- confidence:你对整体识别结果的置信度,0到1之间的小数
若图片不是收据或完全无法辨认,所有字段填null,confidence填0。练习用记账目标表头与示例行
本站虚构的Google Sheets目标表内容,用于练习映射核对;请在测试表中自行粘贴,列名需与模板字段映射一致。
Date,Vendor,Amount,Payment type,Expense Category
2026-10-12,便利店TestMart,36.50,移动支付,超市
2026-10-13,城市地铁,4.00,移动支付,交通
2026-10-14,阳光药房,88.20,信用卡,医疗输入与输出示例
本站虚构演示输入与预期输出,未实际运行该工作流,数值为本站设定。
输入
向测试机器人发送一张虚构小票照片,票面为'TestMart便利店,2026-10-12,矿泉水3.50+面包12.00+纸巾21.00,合计36.50元,微信支付',图像清晰无遮挡对应输出
Gemini返回JSON:{"vendor":"TestMart便利店","amount":36.50,"date":"2026-10-12","category":"超市","payment_method":"移动支付","confidence":0.93};因0.93>0.65,工作流直接追加一行到Sheets(Date=2026-10-12、Vendor=TestMart便利店、Amount=36.50、Payment type=移动支付、Expense Category=超市),Telegram收到'支出已保存'回复。做完检查这些
- 发送清晰小票后30秒内Telegram收到保存成功回复,且Google Sheets新增一行且五列均与票面一致
- 置信度字段缺失或≤0.65时,pending_expenses表出现一条含resume_url的暂存记录,且Telegram弹出类别确认按钮
- 点击按钮确认类别后,暂存行被删除、Sheets出现该行、Telegram收到成功回复
- 发一张完全非收据的图片时流程不崩溃,金额与日期列为空或走确认分支
容易卡住的地方
- Telegram Trigger只有工作流处于Active时才持续监听,手动执行模式只适合单发调试
- Google Sheets列名必须与追加节点中的字段映射一致,错一个字母就会出现空列或报错
- Gemini偶发返回带代码块标记的文字,模板解析节点假设是纯JSON,建议保留原模板的解析/清洗节点不要删
- Data Table列类型若把amount建成文本,数字与字符串混排会导致后续筛选异常
- 按钮回调依赖resume URL,自托管实例需保证外部可访问的webhook地址配置正确
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Track expenses from receipts with Telegram, Gemini, and Google Sheets
- 原作者
- Konstantin Rymar
- 原始发布日期
- 2026-10-15T11:25:05.568Z
- 来源
- https://n8n.io/workflows/21003