2026-09-24 · 原文发布日
n8n 模板:每天把幼儿园菜单、日程和天气发到 WhatsApp
这个免费 n8n 工作流每天早 7 点运行:抓取幼儿园菜单网页,让 Gemini 提取当天餐食并要求引用原文日期、由流程核对引用真实存在,避免编造;同时从 Google Sheets 读取当天日程,从 Open-Meteo 拉取当地小时级预报并生成穿衣建议,最后合并成一条晨报通过 CallMeBot 发到你的 WhatsApp。同一天只发一次,发送失败会在下次重试,周末自动跳过菜单部分。
原文要点
原工作流每天 07:00 触发:工作日下载幼儿园菜单网页,截取当天日期附近文本交给 Google Gemini 返回严格 JSON 餐食,并强制 Gemini 引用其在页面上看到的日期原文、由流程核对该引用真实存在于页面中,核对失败则报告菜单不可用而非猜测;同时从 Google Sheets 的 schedule 标签页读取当天日程(支持按日期和按星期 recurring 两种),从 Open-Meteo 拉小时级预报生成穿衣建议,合并成一条晨报经 CallMeBot 发到 WhatsApp。用 workflow static data 做同日去重,发送失败下次重试,周末跳过菜单。模板免费,需在模板页获取。
这次做成什么
在自己的 n8n 上跑通这条每日晨报流程:配置菜单网址、日程表、天气坐标和 WhatsApp 接收号,并用本站设计的虚构菜单页文本与日程表验证“引用核对防编造”机制确实生效。
准备什么
- n8n 实例(自托管或 Cloud),已从 n8n.io/workflows/19904 导入原工作流
- Google Gemini API 密钥(原文称免费档可用,以 Google 实际政策为准)
- Google 账号(Sheets OAuth2)及一个含 schedule 标签页的测试表格
- 已在 CallMeBot 注册并拿到 API key 的 WhatsApp 号码(个人用途免费,以其官方条款为准)
- 一个无需登录即可查看、且菜单文字直接出现在网页源代码中的菜单页面
具体怎么做
准备日程表与测试菜单
新建 Google Sheet,建名为 schedule 的标签页,表头依次为 date | weekday | title | details,用下方合成 CSV 导入:具体日期行用 YYYY-MM-DD 纯文本填 date,每周 recurring 行留空 date、填 weekday(如 Monday)。菜单页先用幼儿园真实公开页面,或把下方菜单片段存成静态 HTML 自测。
导入模板并填设置节点
导入工作流后打开 Configure your settings 节点,逐项填 menu_url、timezone(如 Asia/Shanghai)、latitude/longitude(用城市坐标)、whatsapp_phone(国际格式,如 8613800000000)、schedule_sheet_url、output_language(如 zh)。
绑定三类凭据
Gemini 节点绑 API 密钥;Sheets 节点绑 Google OAuth2 并授权访问日程表;CallMeBot 的 HTTP 节点配置 Query Auth 凭据,填入注册 WhatsApp 时获得的 API key。
理解防编造机制并做一次破坏性测试
流程会要求 Gemini 输出它看到的日期原文引用,并核对引用确实存在于抓取的页面文本中。练习:把设置里的日期逻辑临时指向页面中不存在的日期(或换一个没有当天菜单的页面),运行后晨报应明确写“今日菜单不可用”,而不是编造菜品——这验证核对逻辑生效。
激活并确认定时与去重
激活工作流,确认 Schedule Trigger 为每天 07:00(服务器时区,注意与你 timezone 的区别)。同一天成功发送后 static data 会记录该日期,重跑不再发;手动测试运行不受去重限制,每次都会发。
可直接复制的材料
schedule 标签页测试数据 CSV
本站独立编写的合成日程;date 列必须存为纯文本格式的 YYYY-MM-DD,避免 Sheets 自动转日期类型导致匹配失败。
date,weekday,title,details
,Monday,游泳课,带泳衣和毛巾,17:00 接
,Wednesday,绘本分享,带一本喜欢的绘本
2026-09-25,,秋游,穿运动鞋,8:30 前到园,带水壶
2026-09-30,,园所闭园,教师培训日,全天不到园菜单提取提示词(本站练习版)
本站按原模板“引用原文日期+流程核对”思路独立编写,原节点实际措辞以导入模板为准。
你是幼儿园菜单提取器。下面是从菜单网页抓取的文本。任务:
1. 找到日期为 {{ $json.today }} 的菜单段落;
2. 只输出严格 JSON,格式为:{"date_text_seen":"你在原文中看到的日期表述原文","breakfast":"早餐内容","lunch":"午餐内容","snack":"午点内容"}
3. date_text_seen 必须是原文中逐字连续存在的片段,不得改写;
4. 如果文本中没有该日期的菜单,输出 {"date_text_seen":"","unavailable":true};
5. 不要编造任何菜品,不要输出 JSON 以外的内容。
网页文本:
{{ $json.page_text }}虚构菜单页片段(自测用 HTML 文本)
本站虚构的菜单文本,可保存为静态 HTML 作为 menu_url 自测,与真实幼儿园无关。
本周菜单(9月21日-9月25日)
9月23日 星期二 早餐:小米南瓜粥、煮鸡蛋;午餐:软米饭、番茄牛腩、蒜蓉西兰花;午点:苹果、酸奶
9月24日 星期三 早餐:豆浆、小花卷;午餐:杂粮饭、清蒸鲈鱼、炒三丝;午点:香蕉、小饼干
9月25日 星期四 秋游日,提供便携餐包:三明治、牛奶、橘子输入与输出示例
本站虚构演示,未实际调用 Gemini、Open-Meteo 或 CallMeBot;穿衣建议文案由流程中确定性代码生成,措辞以模板为准。
输入
抓取页面含“9月24日 星期三 早餐:豆浆、小花卷;午餐:杂粮饭、清蒸鲈鱼、炒三丝;午点:香蕉、小饼干”,当天为周三,日程表有 recurring 行“绘本分享”,当地预报白天 14-19℃ 有风对应输出
Gemini 输出 {"date_text_seen":"9月24日 星期三","breakfast":"豆浆、小花卷","lunch":"杂粮饭、清蒸鲈鱼、炒三丝","snack":"香蕉、小饼干"},引用核对通过。晨报示意:“早安!今天(周三)幼儿园菜单——早餐:豆浆、小花卷;午餐:杂粮饭、清蒸鲈鱼、炒三丝;午点:香蕉、小饼干。今日日程:绘本分享(带一本喜欢的绘本)。天气:白天 14-19℃,有风,建议穿长袖加薄外套,备一件马甲。”做完检查这些
- settings 节点七项值全部填写且 whatsapp_phone 为国际格式(含国家码、无加号也可按其文档)
- Gemini 返回的 date_text_seen 能在抓取页面文本中被逐字找到,核对不通过时晨报写菜单不可用而非猜菜
- 日程匹配同时覆盖“当天具体日期”和“按星期 recurring”两类行
- CallMeBot 返回表示已排队/已发送的响应后,当天日期才写入 static data 去重记录
- 周末运行时晨报不包含菜单段落,仅含日程与天气
容易卡住的地方
- 菜单若由 JavaScript 在页面打开后动态加载,HTTP 节点抓不到文字——先在浏览器“查看源代码”里确认菜单文本存在
- 同日去重依赖 workflow static data,只对激活后的生产运行生效,手动测试每次都会真发消息,测试期建议先把接收号改成自己的备用号
- Schedule Trigger 的 07:00 是 n8n 服务器时区,自托管默认可能是 UTC,需在环境变量或设置里对齐
- CallMeBot 需要先用目标 WhatsApp 号向其官方号码发消息完成注册才能拿到 API key
- 免费档 Gemini 有调用配额,频繁手动测试可能触发限流
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Send daily daycare menu, schedule, and weather briefings with Gemini and WhatsApp
- 原作者
- Lal Krishna
- 原始发布日期
- 2026-09-24T11:50:18.109Z
- 来源
- https://n8n.io/workflows/19904