Auto Refresh

它是怎么工作的

本文对应 Chrome 应用商店上当前的版本。

权限:为什么我们要得这么少

按定时器重载一个标签页,不需要该站点的任何访问权限。扩展只是请浏览器去重载,它从来看不到页面内容。这也是安装它时不会弹出那句常见的「读取和更改您在所有网站上的所有数据」警告的原因。

只有两个功能确实需要读页面:画在页面上的倒计时,以及关键词监控。它们会在你第一次于某个站点使用时,逐站申请访问权限。授权过的站点全部列在选项页上,可以逐站撤回。

扩展包里没有声明式内容脚本。页面代码只会用 chrome.scripting 注入到你授权过的标签页 —— 所以在你没授权的站点上,我们的代码一行都不会跑。

间隔、排期与精确时刻

固定间隔每 N 秒重复一次。随机间隔在每个周期都从一个区间里重新取值,当你不希望请求节奏完全一致时很有用。自定义间隔按时、分、秒填。

排期把规则限制在选定的星期几和一个起止时间窗内。结束时间早于开始时间的窗口按跨零点处理,所以 22:00 → 02:00 的行为和你想的一样。

精确时刻会完全取代间隔:填上 09:30 和 14:00,页面就在这些时刻重载,过了当天的时刻自动顺延到明天。

画在页面上的倒计时

扩展可以在页面上画一个小小的倒计时,这样不打开工具栏弹窗也能看到还剩多久。可以拖到任意位置;位置按视口百分比逐规则记住,所以改变窗口大小后它还在原处。

这是唯一一个需要站点读取权限的便利功能。把它关掉,定时重载照样跑,且完全不需要任何权限 —— 这正是它做成逐规则选项、而不是一个全局开关的原因。

紧凑模式去掉文字只留数字,适合你在房间另一头盯着墙上大屏看的场景。

表达式语法

纯文本在可见文本的任意位置做不区分大小写的匹配。

正则写在两个斜杠之间,可带标志位:/\$\d+(\.\d{2})?/i。从别处粘规则过来时,以 $ 开头的裸模式也能识别。

CSS 选择器和 XPath 匹配的是元素而不是词。XPath 以 // 或一个点开头。

布尔表达式把上面这些组合起来:(In Stock OR Available) AND NOT Sold Out。只有当短语里含有这些关键字时才需要加引号。

同一个监控上的多条表达式之间是 OR 关系。需要 AND 时,写成一条布尔表达式,别指望某条隐含规则。

现成的规则模板

现成模板覆盖了这东西真正被拿来做的事:商品补货、价格变动、新岗位发布、构建跑完、内部仪表盘开始报 500。

选中一个模板会同时填好表达式和一个合理的间隔 —— 补货 30 秒,招聘页十分钟 —— 因为间隔选得对不对,和写什么词一样是配方的一部分。之后所有内容都还能改。

模板打包在扩展里,不是联网拉取的。按需下载意味着我们能看到谁在什么时候盯着什么,而这恰恰是我们承诺不去知道的事。

直接点选元素,而不是手写选择器

取色器会在你划过页面时高亮元素,点一下就替你写好选择器。凡是要填 CSS 选择器的地方都能用它 —— 监控区域、点击目标,或者要抽取的数值。

它优先取 id、data-testid 这类稳定锚点,而不是 div:nth-child(3) > span 这种位置路径。位置路径在站点加一条横幅时就废了;属性锚点通常能扛过一次改版。

万一选择器真的失效了,AI 修复会拿旧选择器加上新页面的一个片段,提出一个替代方案,并给出置信度让你自己判断要不要采用。

出现、消失、只要有变化

「出现」在匹配到内容时触发。「消失」在所有表达式都不再匹配时触发 —— 用来等「售罄」或维护提示消失很合适。

「只要有变化」不需要关键词。它对可见文本做指纹,指纹一变就告警。首次扫描只用来建立基线,所以新规则不会立刻触发。

指纹刻意忽略原始 HTML。nonce、时间戳和内联脚本几乎每次加载都在变,对标记做哈希会让它一直告警。

扫描选项

「扫描前等待」给动态页面留出渲染时间。如果某个站点明明匹配,监控却从不触发,原因几乎总是这个。

用 CSS 选择器把监控限制在某个区域,等于把整页的边边角角排除在外,是压低误报最有效的一招。

扫描 HTML 源码而不是可见文本,会连隐藏标记一起匹配。这是给开发者的选项;它会匹配到谁都看不见的东西。

页面交互

交互目标是一个 CSS 选择器,可选配一个 XPath 兜底,用来关闭弹窗或 Cookie 横幅、展开折叠区块、切到需要的标签页。触发时机可以是每次重载之后,也可以只在监控命中时;多个目标按顺序执行。

用取色器,别手写选择器 —— 它优先取 id 和 data-testid 而不是位置路径,扛站点改版的能力要强得多。

检测到验证码会暂停规则并通知你。扩展不会尝试破解、绕过或以任何方式击败验证码。

看板轮播

给规则一串 URL(每行一个),标签页就会按定时器在它们之间轮换,而不是反复重载同一个页面。做墙上大屏,或者用一台闲置显示器轮播几个仪表盘时,你要的就是这个模式。

轮播游标存在规则的运行时状态里,所以浏览器重启或 service worker 被挂起之后,会从正确的 URL 继续,而不是从头再来一遍。

轮播时监控照常生效,也就是说一条规则可以轮着看四个仪表盘,其中任何一个开始报错都会通知你。

把一个数值抽取成时间序列

指向一个价格、库存数或排名,每次检查都会记下它当时的值。数字会从周边文字里解析出来 —— 货币符号和千位分隔符会被剥掉 —— 所以 1 299,00 € 会变成一个可以画图、可以比较的数。

设一个阈值就把这个序列变成告警:低于某个数、高于某个数,或者相对上一个采样的百分比变动。不设阈值,序列就安静地记着,等你去看的时候才出现。

所有数据都能导出成 CSV。面板里的图刻意只画一条线、不画坐标轴 —— 面板只有 320px 宽,要精确读数就该用导出。

变更历史

每次监控命中,时间、页面和匹配到的文本都会被记下来。这正是「放着不管的守望」值得一直开着的原因:几小时后你能看清到底发生了什么、什么时候发生的,而不是只发现自己错过了一条通知。

快照会保留命中那一刻周围的文本,于是你能比较前后,而不是只知道有东西动了。

本地历史是一个环形缓冲区,大小在选项里设;新记录进来时最旧的会掉出去。更长的保留期在账号里,而且只有你打开云同步才有。

AI 是用来做什么的

规则生成接受一句话 —— 「有货并且低于 200 美元时告诉我」 —— 返回一条表达式、一个触发模式和一个建议间隔。对于那些永远不会去学正则、也不该被要求去学的人来说,这是绕过语法最快的路。

变更摘要拿命中前后的文本,用一句话说清到底变了什么。在有用的差异被埋在时间戳和轮播广告里的页面上,这一点很关键。

变更分类判断一个差异是有意义的还是噪声,选择器修复则在站点改版把选择器弄坏时提出替代方案。这四件事都跑在我们的服务器上:扩展包里任何地方都没有模型密钥,请求里带的是被分析的那个片段,而不是一份浏览记录。

告警

浏览器内:一条通知、一段声音、在页面上高亮匹配处,或者把标签页调到最前。

浏览器外:邮件、Webhook、Telegram、Discord 或 Slack。在控制台里配置;它们需要账号和 Pro 套餐。

告警不重试。晚十分钟到的补货通知比没有还糟,所以投递失败会如实报出来,而不是排队等着重发。

下面每个渠道在控制台里都有自己的配置入口,控制台也会直接链回这些段落。

邮件

在控制台里填上邮箱,我们会向它发一封确认信。在信里的链接被打开之前,这个渠道保持沉默;链接只能用一次,24 小时后过期。

这道二次确认不是走形式。没有它,任何有账号的人都能填一个陌生人的邮箱,让我们的域名替他把想发的内容送过去 —— 那就是开放邮件中继的形状,也是丢掉发信声誉最快的方式。因此「测试」按钮不能用来确认地址,只有已确认的地址才能被测试。

邮件是唯一计入每日额度的渠道,因为它是唯一要我们花钱的。确认信不计入额度,但重发有频率限制。

Webhook

填一个你自己控制的 https:// 端点。我们会 POST application/json,形状是 { source, title, body, url, at }:命中的标题与正文、发生这件事的页面,以及一个 ISO 时间戳。

只尝试一次,八秒超时,不重试。需要在你那边带鉴权 token 时,可以把自定义请求头和渠道存在一起。

URL 必须是 https,解析到私有地址段或链路本地地址段的主机会在添加渠道时被拒绝 —— 包括云元数据地址。这道检查的存在,是为了让这个表单不能被用来指使我们的服务器替谁去探测内网。

Telegram

Telegram 需要两个值,控制台两个都会问:一个 bot token 和一个 chat id。给 @BotFather 发消息,发送 /newbot,复制它返回的 token。然后随便给你的新 bot 发一条消息 —— bot 没法主动开启对话 —— 再从 https://api.telegram.org/bot<token>/getUpdates 里读出 chat.id。

我们拿你的 token 调用 Telegram Bot API 的 sendMessage。token 存在你的账号里,不做别的用途,也绝不会交给扩展;在 BotFather 里吊销它,投递立刻中断。

Discord

服务器设置 → 整合 → Webhook → 新建 Webhook,选好频道,然后复制 Webhook URL 粘到控制台里。

我们 POST 一个 Discord embed,里面带标题、匹配到的文本和一个指向页面的链接。这个 URL 本身就是凭据 —— 拿到它的人都能往那个频道发消息 —— 所以要当成密钥对待。在 Discord 里删掉这个 webhook 就立刻吊销,我们这边什么都不用改。

Slack

在你的 Slack 应用的 Incoming Webhooks 里启用它,往工作区加一个,选好频道,复制那个 hooks.slack.com 的 URL。

我们 POST { text },内容是标题、匹配到的文本和页面 URL。这个 webhook 绑定在你选的那一个频道上,本身就是凭据;在 Slack 里吊销它即可停止投递。

当 Chrome 冻结了后台标签页

Chrome 的内存节省会丢弃它认为闲置的标签页,重载循环也就停了。扩展会发现被丢弃的标签页并把它重载回来。

让窗口保持可见就完全不会遇到这个问题。选项里的「保持电脑唤醒」可以避免系统休眠在夜里造成同样的效果。

同步、设备,以及什么会离开你的机器

不注册账号,就没有任何东西离开你的浏览器。

打开云同步后,我们存的是你写的规则和它们产生的命中。我们不存、也没有兴趣存你访问过哪些站点。

合并在设备上按规则、按最后修改时间进行 —— 在笔记本上编辑绝不会覆盖台式机配好的东西。绑定到标签页的规则从不同步,因为一个 tab id 在另一台机器上毫无意义。

试用期,以及免费档保留了什么

试用是七天全功能解锁,在本地计时。不需要账号、不需要信用卡,也没有什么要取消的 —— 到期时 Pro 功能变成只读而不是消失,所以你配置过的东西一样都不会丢。

免费档的目标是真正可用,而不是一个演示:无限刷新规则、刷新层的每一个选项,以及三条纯文本监控。随机间隔、声音和通知都不计量,因为按告警条数收费正是竞品用起来让人难受的地方。

Pro 加的是规模和云:无限监控、高级表达式、排期、页面交互、数据抽取、历史、AI,以及走出浏览器的告警。买断档功能集与 Pro 相同,只是 AI 额度按年重置而不是按月 —— 推理成本会一直发生,哪怕付款只有一次。