Boloop 阅读示意图(AI 生成):只计入被上报的可见片段,隐藏后的时间不累加。
给 Boloop 做统计时,我想知道读者是否在某个页面停留了一会儿。浏览量只能告诉我页面被打开过,不能分清一眼关掉、认真查看,还是把标签页留在后台。
我们最终做的是一项较小的测量:访客同意可选分析后,记录符合条件的公开页面在前台可见了多久。本站记录不保存 IP,也不建立跨页面的访客身份。这里的“有效”仅指符合计时和上报规则,不能解释成读懂了内容。
先决定不需要知道什么
要比较不同页面有没有被停留,不必先给每个人建立长期档案。Boloop 给每次计时事件生成一个独立的随机 UUID,和页面路径、可见毫秒数一起上报。这个编号用于短期去重,不用于识别下一页的同一个人。
记录的数据因此很窄:哪一个公开路径、这一段可见时间、这次事件的编号。没有账号身份,没有搜索原文,也没有用于跨页面串联的长期编号。
“本站记录不保存 IP”描述的是这份分析数据的字段和用途。浏览器与服务器之间的网络连接仍需要地址信息;这句话不能扩张成互联网上没有处理 IP,或所有基础设施都没有任何日志。
把同意当作持续条件
计时复用了 Boloop 已有的可选分析同意。它需要可持久保存的有效同意,而且只在正式域名和允许的公开页面上运行。本地预览、后台与不适用的路径不参与这项测量。
在这次已经部署的三语版本里,入口覆盖英文、简体中文和繁体中文的公开路径。新增语言不能只靠扩展一个正则表达式就宣称完成了统计验收,还需要与页面可用性和新的语言流程一起检查。
撤回同意以后,当前尚未上报的计时会被丢弃。过去已经发出的请求无法被浏览器召回,界面与隐私说明也要准确表达这个边界。
我不希望一次统计异常影响读者打开文章。存储不可用、缺少安全随机数或者请求失败时,这项测量可以不记,页面本身继续使用。
页面看不见的时候停止计时
实现依赖页面可见性事件,累加可见时间,并在隐藏、离开页面或切换站内路由时结束当前记录。隐藏后的后台时间不继续加到这段事件里。当前实现中,恢复可见不会自动创建新记录,需要页面逻辑重新进入计时入口。因此,一条记录只代表一次上报的可见片段,不能把它当成整次访问完整、连续的阅读时长。重新进入计时流程时使用新的事件,也不能据此拼出一个完整的个人阅读轨迹。
这解决了一种常见夸大:打开文章后去做别的事情,十分钟后回来关闭,不能把十分钟全部算成文章停留。
但可见性并不等于注意力。一个可见的窗口可能没人看,也可能由自动化浏览器保持打开。反过来,读者可能截图、复制或离线继续阅读,这些也不在测量范围内。因此后台使用“可见停留”这样的名称,比把它叫成“真实阅读时长”更准确。
客户端克制上报,服务端仍然校验
Boloop 丢弃不足一秒的记录,把超过三十分钟的客户端累计值截到上限。服务端独立校验路径、UUID、字段集合和整数时长范围,不能相信所有请求都由我们的页面生成。
重复事件编号只接受一次;去重行短期保留,随后清理,日聚合按 UTC 保存。管理员会话和能够识别出的机器人请求不进入这项计数,还设有分钟与每日预算。
这些限制让数据更可控,但不会把浏览器提交的数据变成无法伪造的证据。预算可能丢弃事件,网络关闭前上报也可能失败。这里的选择是接受有边界的缺测,而不是不断重试到影响访问体验。
如果复用类似实现,客户端的过滤和服务端的校验要一起保留。仅在前端隐藏字段,无法防止外部请求向接口提交额外内容。
验证计时机制,再谨慎解释平均值
Boloop 的回归检查覆盖了几个很具体的场景:可见四秒后切到后台,后台一分钟不应被算进去;路由改变后,前一页的时间应结算到前一条路径;五百毫秒的记录不发出;超长记录不能突破上限;拒绝同意或来自预览域名时不产生上报。
这些检查证明的是对应机制。它们不证明所有浏览器、关闭窗口时的网络或真实人的注意力都被准确测到了。
运营时我们也遇到过一个提醒:少量样本里,一次较长的自动化页面访问占了总时间的大部分。此时平均值变高,不能据此宣布推荐内容让读者看得更久。应先看样本数、总时长、单页分布和可能的运营访问,再决定有没有可解释的变化。
对个人网站来说,这项测量足以帮助提出问题:某个页面是否值得进一步检查,改动后有没有连续的同口径观察。它不需要承担识别人、判断理解程度或证明增长的任务。把数据收窄,解释也跟着收窄,统计才更容易维护。