2026-09-04 · 原文发布日
拍餐盘照片给孩子集章:LINE+Gemini亲子激励
把“把饭吃完”变成打卡游戏的家庭向n8n流程:家长通过LINE机器人发一张餐后餐盘照片,Gemini判断是否拍到餐盘、给吃完程度打分并生成一句鼓励语;流程读取Google Sheets里的历史记录,算出今天的印章、累计印章数和连续天数,拼成集章卡消息回给孩子,同时把结果追加到表格。只拍餐盘不拍人脸,判定严格度和集章目标都可调。
原文要点
原作者ayumi的免费n8n模板:LINE机器人收到POST webhook后判断消息是否为图片,非图片则回复操作指引;通过LINE Messaging API下载图片,交给Google Gemini判断是否拍到餐盘、对吃完程度打分并生成一句鼓励语;再读取Google Sheets名为Log的工作表历史记录,计算今日印章、累计印章数与连续天数,拼成集章卡消息回复给孩子,并把日期时间、分数、剩饭、印章数、评语追加到表格。配置项包括Channel access token、Gemini密钥、Sheets的OAuth2、文档ID、孩子姓名、CLEAN_PLATE_THRESHOLD与STAMPS_PER_REWARD。照片只需拍到餐盘,不拍人脸。
这次做成什么
在本站照做的目标:搭一条“拍照→AI判定→集章卡回复→记账到表格”的家庭激励流程。由于原模板无工作流文件下载,本站提供一套可自行在n8n画布上重建的独立练习方案,并用模拟数据先在本地验证印章计算逻辑,再接真实LINE。
准备什么
- 一个LINE Messaging API频道并已启用webhook,持有Channel access token
- 一个Google Gemini(PaLM)API密钥,以及用于Google Sheets的Google账号
- 一个已建好Log标签页的Google表格,列含Date、Time、Child Name、Clean Plate、Score、Leftovers、Stamps Earned、Comment
- n8n实例(自托管或云端),能创建Webhook节点与HTTP请求节点
具体怎么做
建表并准备配置值
在Google Sheets新建表格,第一个标签页命名Log,首行依次填Date、Time、Child Name、Clean Plate、Score、Leftovers、Stamps Earned、Comment八列。复制浏览器地址栏中的文档ID备用。在n8n新建工作流,用一个Set节点放配置:LINE_TOKEN、GEMINI_KEY、SHEET_ID、CHILD_NAME、CLEAN_PLATE_THRESHOLD(本站练习设80)、STAMPS_PER_REWARD(本站练习设7)。
接LINE webhook并过滤非图片
添加Webhook节点,方法选POST,路径自定,激活后把生成的URL粘贴到LINE Developers控制台的Webhook settings。后面接IF节点:判断LINE事件里message.type是否等于image;不等于时用HTTP请求节点调LINE reply接口,回复“请发一张餐后餐盘的照片哦”。
下载图片并送Gemini判定
图片分支用HTTP请求节点,带Authorization: Bearer 令牌,向LINE Messaging API取消息内容得到二进制图片。再发HTTP请求到Gemini,正文里内嵌下方“餐盘判定提示词”,要求模型只返回JSON:是否拍到餐盘、0至100的吃完分数、剩饭描述、一句给孩子的鼓励语。
读历史、算印章、拼集章卡
用Google Sheets节点读取Log全部行,接一个Code节点执行本站练习算法:分数≥阈值则今日得1枚印章;统计该孩子累计印章数;检查上一行日期是否为昨天来判定连续天数,中断则重置为1。把结果套入集章卡模板拼成多行文本,例如“⭐×3 / 目标7枚,连续2天”。
回复并追加一行记录
HTTP请求节点调LINE reply接口,把集章卡消息发回;Google Sheets节点选Append,向Log写入Date、Time、Child Name、Clean Plate、Score、Leftovers、Stamps Earned、Comment一行。先用LINE官方模拟的测试事件JSON手动触发一遍,确认全流程后再发真照片。
可直接复制的材料
餐盘判定提示词(发给Gemini)
本站独立编写的练习提示词,可直接粘贴进HTTP请求节点的请求体;语言与语气可按原文Customization建议自行改。
你是一位温和的儿童用餐鼓励助手。请观察这张餐后餐盘照片(照片中只应出现餐盘,不会出现人脸),完成三件事:
1. 判断照片里是否拍到了餐盘;
2. 估计食物被吃完的程度,给出0到100的整数分数(100代表完全吃完);
3. 用中文给孩子写一句不超过30字的鼓励语,语气温暖、具体提到餐盘里的情况,不批评。
只返回JSON,不要输出其他任何文字,格式:{"has_plate":true或false,"score":整数,"leftovers":"剩饭情况简述","praise":"鼓励语"}工作流配置值示例
本站独立示例,不是原工作流文件;三个密钥/ID必须替换为你自己的,两个阈值可自行调整,请勿把真实令牌提交到任何公开仓库。
{
"LINE_TOKEN": "替换为你的LINE频道Channel access token",
"GEMINI_KEY": "替换为你的Google Gemini API密钥",
"SHEET_ID": "替换为Google表格地址栏中的文档ID",
"CHILD_NAME": "小柚",
"CLEAN_PLATE_THRESHOLD": 80,
"STAMPS_PER_REWARD": 7
}印章计算练习算法(Code节点用JavaScript)
本站设计的简化练习算法:连续天数演示用固定值2表示“昨天有记录”的情况,正式使用时应从最近记录逐日回溯计算真实连击;未在原模板核对过,仅供理解逻辑。
const cfg = $('Set Config').first().json;
const judge = $('Parse Gemini').first().json;
const rows = $('Read Log').all().map(i => i.json);
const mine = rows.filter(r => r['Child Name'] === cfg.CHILD_NAME);
const today = new Date();
const pad = n => String(n).padStart(2, '0');
const todayStr = `${today.getFullYear()}-${pad(today.getMonth()+1)}-${pad(today.getDate())}`;
const y = new Date(today); y.setDate(y.getDate()-1);
const yStr = `${y.getFullYear()}-${pad(y.getMonth()+1)}-${pad(y.getDate())}`;
const earned = judge.score >= cfg.CLEAN_PLATE_THRESHOLD ? 1 : 0;
const total = mine.reduce((s,r) => s + Number(r['Stamps Earned']||0), 0) + earned;
const last = mine.length ? mine[mine.length-1]['Date'] : '';
const streak = earned ? (last === yStr ? 2 : 1) : 0;
const card = `${cfg.CHILD_NAME}的光盘集章卡\n今日得分:${judge.score}分\n获得印章:${earned}枚\n累计:${'⭐'.repeat(Math.min(total,20))}(${total}/${cfg.STAMPS_PER_REWARD})\n连续天数:${streak}天\n${judge.praise}`;
return [{json:{date:todayStr, earned, total, streak, card}}];输入与输出示例
本站虚构演示,未调用真实LINE/Gemini,日期仅为示例值,非原作者运行结果。
输入
模拟LINE事件:孩子“小柚”的家长发了一张晚餐餐盘照片,Gemini判定返回{"has_plate":true,"score":92,"leftovers":"剩两口西兰花","praise":"西兰花只剩一点点,小柚太棒了!"};Log表已有2行小柚记录,共2枚印章,最近一行日期是昨天。对应输出
小柚的光盘集章卡
今日得分:92分
获得印章:1枚
累计:⭐⭐⭐(3/7)
连续天数:2天
西兰花只剩一点点,小柚太棒了!
——同时向Log表追加一行:2026-09-04 | 19:12 | 小柚 | Yes | 92 | 剩两口西兰花 | 1 | 西兰花只剩一点点,小柚太棒了!做完检查这些
- 向webhook发送一条文字消息时,LINE里收到“请发照片”类指引而不是报错
- 发送餐盘测试图片后,Log表末尾新增一行且八列均有值,Clean Plate与阈值判定一致
- 分数低于CLEAN_PLATE_THRESHOLD时Stamps Earned为0,回复消息中累计印章数不增加
- 回复消息里同时出现今日得分、累计印章进度(x/STAMPS_PER_REWARD)和连续天数三个数字
容易卡住的地方
- LINE的Channel access token有过期与重新签发机制,流程突然401时先去控制台重新确认令牌
- Gemini返回若带多余文字会导致JSON解析失败,提示词里必须强调只返回JSON,并在流程里加容错
- webhook URL必须在工作流激活状态下复制,测试模式URL与正式URL不同
- 连续天数的计算依赖Date列格式统一,手动改表导致格式混乱会让连击统计出错
- 阈值设得过高孩子长期拿不到印章会失去动力,这是规则设计问题不是流程故障
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Reward kids’ clean plates with LINE, Google Gemini and Google Sheets
- 原作者
- ayumi
- 原始发布日期
- 2026-09-03T20:32:43.795Z
- 来源
- https://n8n.io/workflows/19152