Boloop 阅读示意图(AI 生成):只计入已上报的可见片段,隐藏后的时间不会累加。
在為 Boloop 進行統計時,我想知道讀者是否在某個頁面上停留了一段時間。瀏覽量只能告訴我頁面被打開過,但無法區分是一眼關掉、認真查看,還是把標籤頁留在後台。
我們最終進行的是一項較小的測量:當訪客同意選用分析後,記錄符合條件的公開頁面在前台可見的時間。本站記錄不保存 IP,也不建立跨頁面的訪客身份。這裡的「有效」僅指符合計時和上报規則,不能解釋為讀懂了內容。
先決定不需要知道什麼
要比較不同頁面是否有被停留的時間,無需先為每個人建立長期檔案。Boloop 為每次計時事件生成一個獨立的隨機 UUID,與頁面路徑、可用毫秒數一起上報。這個編號用於短期去重,不用於識別下一頁的同一人。
因此記錄的數據非常狹隘:哪一個公開路徑、這一段可見時間、這次事件的編號。沒有帳號身份,沒有搜索原文,也沒有用於跨頁面串聯的長期編號。
「本站記錄不保存 IP」描述的是這份分析數據的字段和用途。瀏覽器與服務器之間的網絡連接仍然需要地址信息;這句話不能擴展為互聯網上沒有處理 IP,或所有基礎設施都沒有任何日誌。
把同意當作持續條件
計時重用了 Boloop 已有的選用分析同意。它需要可持久保存的有效同意,而且只在正式域名和允許的公開頁面上運行。本地預覽、後台與不適用的路徑不參與這項測量。
在這次已經部署的三語版本中,入口覆蓋英文、簡體中文和繁體中文的公開路徑。新增語言不能只靠擴展一個正則表達式就宣稱完成了統計驗收,還需要與頁面可用性和新的語言流程一起檢查。
撤回同意後,當前尚未上報的計時會被丟棄。過去已經發出的請求無法被瀏覽器召回,界面與隱私說明也要準確表達這個邊界。
我不希望一次統計異常影響讀者打開文章。存儲不可用、缺少安全隨機數或者請求失敗時,這項測量可以不記,頁面本身繼續使用。
頁面看不見的時候停止計時
實現依賴頁面可見性事件,累加可見時間,在隱藏、離開頁面或切換站內路由時結束當前記錄。隱藏後的後台時間不會繼續加到這段事件裡。當前的實現中,恢復可見不會自動創建新記錄,需要頁面邏輯重新進入計時入口。因此,一條記錄只代表一次上報的可見片段,不能把它當成整次訪問完整、連續的閱讀時長。重新進入計時流程時使用新的事件,也不能據此拼出一個完整的個人閱讀軌跡。
這解決了一種常見的誇大:打開文章後去做別的事情,十分鐘後回來關閉,不能把十分鐘全部算成文章停留。
但可見性並不等於注意力。一個可見的窗口可能沒人看,也可能由自動化瀏覽器保持打開。反過來,讀者可能截圖、複製或離線繼續閱讀,這些也不在測量範圍內。因此後台使用「可見停留」這樣的名稱,比把它叫成「真實閱讀時長」更準確。
客戶端克制上報,服務端仍然校驗
Boloop 丟棄不足一秒的記錄,把超過三十分鐘的客戶端累積值截到上限。服務端獨立校驗路徑、UUID、字段集合和整數時長範圍,不能相信所有請求都由我們的頁面生成。
重複事件編號只接受一次;去重行短期保留,隨後清理,日聚合按 UTC 保存。管理員會話和能夠識別出的機器人請求不進入這項計數,還設有分鐘與每日預算。
這些限制讓數據更可控,但不會把瀏覽器提交的數據變成無法偽造的證據。預算可能丟棄事件,網絡關閉前上報也可能失敗。這裡的選擇是接受有邊界的缺測,而不是不斷重試到影響訪問體驗。
如果複用類似實現,客戶端的過濾和服務端的校驗要一起保留。僅在前端隱藏字段,無法防止外部請求向接口提交額外內容。
驗證計時機制,再謹慎解釋平均值
Boloop 的回歸檢查覆蓋了幾個很具體的場景:可見四秒後切到後台,後台一分鐘不應被算進去;路由改變後,前一頁的時間應結算到前一條路徑;五百毫秒的記錄不發送;超長記錄不能突破上限;拒絕同意或來自預覽域名時不產生上報。
這些檢查證明的是對應機制。它们不證明所有瀏覽器、關閉窗口時的網絡或真實人的注意力都被準確測到了。
運營時我們也遇到過一個提醒:少量樣本裡,一次較長的自動化頁面訪問佔了總時間的大部分。此時平均值變高,不能據此宣佈推薦內容讓讀者看得更久。應先看樣本數、總時長、單頁分佈和可能的運營訪問,再決定有無可解釋的變化。
對個人網站來說,這項測量足以幫助提出問題:某個頁面是否值得進一步檢查,改變後有無連續的同口徑觀察。它不需要承擔識别人、判斷理解程度或證明增長的任務。把數據收窄,解釋也跟著收窄,統計才更容易維護。