它是怎麼運作的
本文對應 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 額度按年重置而不是按月 —— 推論成本會一直發生,哪怕付款只有一次。