2026-09-06 · 原文发布日
用大白话条件盯网页,条件达成才邮件提醒
在Google Sheets里每行写一个网址和一句大白话条件(比如有房可订、报名开放),流程按你设定的频率抓取页面:先走HTTP,遇到拦截或JS渲染页自动切到Airtop浏览器会话,必要时还能按描述先点页面上的某个按钮。Gemini读页面后给出YES/NO判断并附原文引文,代码会校验引文是否真在页面里;只有状态从NO变YES才发一封Gmail提醒,连续抓取失败则改发监控异常通知。
原文要点
原模板用Google Sheets的Watchlist/Log两页保存监控行,定时只取到期行;先HTTP抓取,被拦、内容过短或JS渲染时切Airtop浏览器,可按open_step描述先点元素。Gemini返回YES/NO/UNCLEAR、置信度和引文,代码校验引文必须出现在页面文本;仅NO转YES发Gmail,连续失败转监控异常。作者称在日本露营JSON接口与酒店JS页测过403回退和点击日历。
这次做成什么
照着做出一个“条件达成才提醒”的网页盯梢:每行一个网址加一句大白话条件,先建立基线,之后只在状态从NO翻到YES时给指定邮箱发一封邮件;练习用自建测试页,不碰真实订票。
准备什么
- n8n可用实例、Google Sheets/Gmail OAuth、Gemini API凭据
- 一个含Watchlist与Log两个工作表的Google Sheet及文档ID
- 可选Airtop免费层凭据,仅JS渲染或403时启用
- 一个你可控制的测试网页或JSON端点用于演练
具体怎么做
建表与列
新建Sheet:Watchlist列用watch_id,url,condition,check_every_hours,notify_to,fetch_mode,open_step,open_url,next_due_at,last_state,last_evidence,last_error,yes_streak,no_streak,error_streak;Log列用ts,watch_id,verdict,confidence,quote,http_status,lane,error。列名以导入模板设置说明核对,不一致就改模板引用。
配置凭据与常量
在n8n添加Google Sheets、Gmail、Gemini凭据;Config节点填spreadsheet_id、default_email、per_run_limit、yesConfirmationsToNotify=1、noConfirmationsToRearm=2、maxErrorStreak=3、requestTimeoutSec。先导入/复刻原模板;若无下载文件,不要伪造可导入JSON,按下面链路重建。
重建处理链路
节点顺序:Schedule Trigger→Sheets Read Watchlist→Filter到期且未超per_run_limit→HTTP Request抓url→IF状态403/正文过短→Airtop会话(fetch_mode=browser或auto回退;open_step非空先点击等待)→提取正文→Gemini判断→Code校验引文in page_text→状态机→Sheets Update/Append Log→仅transition_to_yes或error_streak>=3走Gmail。
字段映射
Gemini输入映射page_text、condition、current_time;输出存last_state/last_evidence。邮件正文映射watch_id、open_url(空则用url)、condition、quote、checked_at。next_due_at=now+check_every_hours小时;失败只增error_streak不改last_state。
演练基线与翻转
先用测试页返回“名额已满:0”,手动跑一次得到NO且不发信。再把测试页改为“可订名额:2”,把next_due_at改到过去,再跑一次应收到一封YES邮件;连续三次把URL改成失效域名,应收到一封monitoring problem邮件。
可直接复制的材料
Gemini判定提示词
本站独立编写,需把双花括号变量映射到n8n字段;引文校验在Code节点完成。
你是网页条件判定器。只根据给定PAGE_TEXT回答,不使用外部知识。
CONDITION:{{condition}}
PAGE_TEXT:{{page_text}}
规则:1) 明确满足输出YES,明确不满足输出NO,证据不足或页面异常输出UNCLEAR;2) quote必须是PAGE_TEXT中逐字连续片段,最多80字符;3) 置信度0到1;4) 只输出JSON。
{"verdict":"YES|NO|UNCLEAR","confidence":0.0,"quote":"","reason":"20字内"}Watchlist练习CSV
example.test为虚构域,练习时换成自建测试端点;notify_to用隔离测试邮箱。
watch_id,url,condition,check_every_hours,notify_to,fetch_mode,open_step,open_url,next_due_at,last_state
camp-demo,https://example.test/api/camp,有任意可订营位,1,ops@example.test,auto,,https://example.test/camp,2026-09-06T09:00:00Z,NO
hotel-demo,https://example.test/hotel,出现明晚可订且价格低于1200元,24,ops@example.test,browser,选择日期按钮,https://example.test/hotel/search,2026-09-06T09:00:00Z,NOConfig示例
本站示例配置;yes/no阈值可按原文Customization调,不要当作作者实测性能承诺。
{"spreadsheet_id":"替换为Sheet文档ID","default_email":"ops@example.test","per_run_limit":20,"yesConfirmationsToNotify":1,"noConfirmationsToRearm":2,"maxErrorStreak":3,"requestTimeoutSec":30,"airtopEnabled":false,"httpFirstMinChars":200,"gmailSubjectPrefix":"[条件达成] "}输入与输出示例
本站虚构演示,未调用Gemini或Airtop;数字与字段只为说明映射。
输入
测试页PAGE_TEXT含“营地A 9月12日 可订名额:2;剩余付款时间10分钟”,CONDITION为“有任意可订营位”,上一次last_state=NO,error_streak=0。对应输出
Gemini示意JSON:{"verdict":"YES","confidence":0.93,"quote":"可订名额:2","reason":"出现可订数量"};状态机判定NO→YES,写Log一行,Gmail主题“[条件达成] camp-demo”,正文含quote与open_url。做完检查这些
- 首次运行只写基线,last_state变为NO或YES且未发邮件
- 测试页从0名额改2名额后,仅收到一封条件达成邮件
- Gemini返回的quote逐字包含在page_text中,否则按UNCLEAR处理
- 失效URL连续三次后error_streak=3并收到监控异常通知
容易卡住的地方
- 需要登录、验证码或频繁403的页面可能超出免费浏览器额度
- 大白话条件太宽会把广告或历史日期误判为YES
- Sheet列名与模板不一致会导致读取为空而不是报错
- 首次YES基线不代表从NO翻转,别据此判断提醒失效
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Watch web pages for plain-language conditions with Gemini, Sheets and Gmail
- 原作者
- ayumi
- 原始发布日期
- 2026-09-05T18:40:23.168Z
- 来源
- https://n8n.io/workflows/19262