AI PLAY玩法更新持续收录
← 回到更新流

2026-09-15 · 原文发布日

收据照片自动记账进Notion

免费n8n模板,双入口收收据:Gmail里匹配条件的新邮件附件(PDF会先抽取文本),或Telegram里发给机器人的照片(取最高分辨率转base64),都交给gpt-4o-mini提取商家、日期、金额、币种、类别和摘要的JSON,规范化后在Notion费用数据库新建条目,并用Telegram回执确认;工作流出错时还会往Slack和Telegram发告警。需要在Notion建对应属性的数据库并配置各平台凭据。

原文要点

来源是n8n.io上Rahul Joshi发布的免费工作流模板(19619)。双入口:Gmail触发器匹配收据搜索条件的新邮件,取第一个附件,PDF先抽取文本;Telegram触发器收到带照片的消息才继续,下载最高分辨率照片转base64数据URL。两路都交给gpt-4o-mini返回JSON(vendor、date、amount、currency、category、summary),规范化后在Notion费用数据库新建条目(属性含Vendor、Amount、Currency、Date、Category、Source、Notes),Telegram发确认回执;工作流出错时向Slack和Telegram告警。需替换数据库ID和两个Telegram聊天ID占位符。

这次做成什么

搭一条双入口收据记账流水线:Gmail收据附件和Telegram收据照片都自动提取商家、日期、金额、币种、类别、摘要,写入Notion费用数据库并回执确认。本站不下载原工作流,按原文描述的节点顺序自建等价练习,提示词与字段映射为本站独立示例。

准备什么

  • n8n实例及Gmail OAuth2、Telegram Bot、OpenAI、Notion、Slack五套凭据
  • Notion中一个费用数据库,并已建好Vendor、Amount、Currency、Date、Category、Source、Notes属性
  • 用BotFather创建的Telegram机器人,且已先与它开启对话
  • 一张虚构收据图片或一段合成收据文本用于测试

具体怎么做

  1. 建Notion费用数据库

    在Notion新建数据库,属性依次为:Vendor(标题)、Amount(数字)、Currency(单选或文本)、Date(日期)、Category(单选)、Source(文本)、Notes(文本)。在集成设置中把数据库授权给n8n所用的Notion集成,复制数据库ID,替换工作流里的REPLACE_WITH_YOUR_NOTION_EXPENSES_DATABASE_ID占位符。

  2. 配置Gmail入口

    添加Gmail Trigger节点,设置收据搜索过滤(例如主题含发票/收据类关键词且带附件,具体过滤串以你的邮箱情况为准)。后接附件处理:取第一个附件,用IF节点判断是否PDF,是则用PDF文本抽取节点取出文本内容交给OpenAI;否则把图片附件直接交给OpenAI做视觉识别。

  3. 配置Telegram入口

    添加Telegram Trigger节点监听新消息,用IF节点过滤仅含照片的消息。Telegram节点下载最高分辨率的那张照片,用Code节点转成base64数据URL,连同下文提取提示词一起发给gpt-4o-mini,让模型从图片中读收据。

  4. 提取JSON并规范化

    两条支路汇合到同一OpenAI调用:提示词要求只返回vendor、date、amount、currency、category、summary六个字段的JSON。后接Code节点做规范化:日期转ISO格式(YYYY-MM-DD)、amount转数字、currency统一大写、category映射到Notion单选已有选项,解析失败时抛错进入错误分支。

  5. 写Notion、回执与告警

    Notion节点选Create Page,把规范化字段逐一映射到对应属性,Source字段写Gmail或Telegram标识来源。Telegram节点向REPLACE_WITH_YOUR_TELEGRAM_CHAT_ID发送确认,内容含商家、金额、日期。最后给整个工作流配置Error Trigger:出错时向指定Slack频道和YOUR_ADMIN_TELEGRAM_CHAT_ID各发一条含错误消息的告警。

可直接复制的材料

收据字段提取提示词

本站独立编写,{收据文本或图片}处接上游节点输出;原模板内部提示词未公开。

你是收据记账助手。下面是收据内容(可能是PDF提取的文本,也可能是收据照片)。\n请提取以下信息并只输出一个JSON对象,不要输出其他文字:\n{\"vendor\":\"商家名称\",\"date\":\"消费日期,YYYY-MM-DD\",\"amount\":数字金额,\"currency\":\"三字母币种代码如CNY、USD\",\"category\":\"从[餐饮,交通,办公,住宿,软件订阅,其他]中选一个\",\"summary\":\"不超过30字的消费摘要\"}\n若某字段无法识别,用null表示,不要编造。\n收据内容:\n{收据文本或图片}

字段规范化Code节点示例

本站示例,Amount/Date缺失时主动报错走告警分支,避免脏数据进Notion。

const raw = JSON.parse($json.output);\nconst cats = ["餐饮","交通","办公","住宿","软件订阅","其他"];\nconst item = {\n  Vendor: raw.vendor || "未知商家",\n  Amount: Number(raw.amount),\n  Currency: (raw.currency||"CNY").toUpperCase(),\n  Date: raw.date,\n  Category: cats.includes(raw.category) ? raw.category : "其他",\n  Source: $json.source || "Telegram",\n  Notes: raw.summary || ""\n};\nif (!raw.amount || !raw.date) throw new Error("收据金额或日期缺失,需人工核对");\nreturn [{ json: item }];

合成测试收据数据

本站合成的虚构测试输入,代替真实收据,避免上传真实票据信息。

{\"receipt_text\":\"云启咖啡(虚构)\\n2026-03-14 14:22\\n拿铁 x2 32.00\\n三明治 x1 18.00\\n合计 CNY 50.00\\n谢谢惠顾\"}

输入与输出示例

本站虚构演示,非原作者运行结果;gpt-4o-mini对真实小票照片的识别效果需自行验证。

输入

向Telegram机器人发送一张收据照片,内容为上面合成数据:云启咖啡(虚构),2026-03-14,拿铁两杯32元、三明治一份18元,合计50元人民币。

对应输出

提取JSON:{"vendor":"云启咖啡","date":"2026-03-14","amount":50,"currency":"CNY","category":"餐饮","summary":"咖啡与三明治工作餐"}。Notion新增条目:Vendor=云启咖啡、Amount=50、Currency=CNY、Date=2026-03-14、Category=餐饮、Source=Telegram、Notes=咖啡与三明治工作餐。Telegram回执:已记账 云启咖啡 50 CNY(2026-03-14)。

做完检查这些

  • Notion数据库七个属性名称与原模板占位符要求的拼写完全一致,写入不报错
  • 合成收据测试后,Notion新条目的Amount为数字50、Date为2026-03-14且Source标注正确入口
  • Telegram收到含商家、金额、日期的确认回执
  • 人为让金额缺失触发错误时,Slack频道和管理员Telegram都收到告警

容易卡住的地方

  • Telegram触发器必须先在BotFather建机器人并主动开启对话,否则收不到照片也无法回执
  • REPLACE_WITH_YOUR_NOTION_EXPENSES_DATABASE_ID等占位符必须全部替换,漏一处就运行失败
  • Notion集成未授权数据库时Create Page会报权限错误
  • Gmail过滤条件过宽会把普通邮件附件送进流程产生额外OpenAI调用费用
  • gpt-4o-mini为付费模型,提取失败返回非JSON时规范化节点会抛错,需要错误分支兜底
  • 照片模糊或币种符号歧义时模型可能读错金额,关键账目仍需人工抽查

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Log receipt expenses in Notion with Gmail, Telegram, and OpenAI
原作者
Rahul Joshi
原始发布日期
2026-09-15T08:24:11.519Z
来源
https://n8n.io/workflows/19619