志睿源官网|来访统计「真实心跳甄别」上线报告
旧架构里,心跳(t=3,每 5 秒)只更新 zryvisitonline 的 30 秒实时快照,不落历史。导致:
背景:老板要求用「前端心跳」把真人有真实浏览行为的访问,从只进入不心跳的可疑访问(bot / 无头浏览器 / 打开即走)里甄别出来,并在后台统计里直接可见。
一、此前盲区(已修复)
旧架构里,心跳(t=3,每 5 秒)只更新 zry_visit_online 的 30 秒实时快照,不落历史。导致:
- 能 100% 确定"谁从没心跳"(占访问 99.3%),但无法回放某次访问是否真的每 5 秒心跳。
- 后台看不到"真实心跳访客"这一关键指标。
二、本次改动(按推荐设计落地)
1. 新增心跳归档表 zry_visit_beat
进入(t=1)/离开(t=2)/心跳(t=3) 全部留痕,含 vid / page / t / beat_at / ip / ua / is_bot。
→ 历史可审计:任意访客是否发过 t=3,一查便知。
2. 在线表加两列 zry_visit_online.beat_count / has_heartbeat
has_heartbeat=1:本轮/历史发过真实心跳(真人 / 真实浏览器铁证)has_heartbeat=0:仅进入未心跳(可疑)beat_count:累计心跳次数(每轮采集增量累加)
3. 后端 applyBeats(node/zry/visit.js)
采集器每 15 秒跑一轮时:写入 zry_visit_beat 归档 + 维护在线表 has_heartbeat/beat_count。
归档表纳入 30 天保留期清理(purgeOnce),不会无限增长。
4. 后台接口 GET /api/zry/admin/heartbeat(新增)
返回:
summary:今日进入访客数、真实心跳访客数、零心跳可疑数、占比、当前在线真实/可疑数recentHb:最近 10 分钟真实心跳会话(vid 脱敏 / 页面 / 最后心跳 / 心跳次数 / 类型)suspects:当前在线·零心跳可疑会话(vid 脱敏 / 页面 / IP 脱敏 / 首次出现 / 类型 / UA)
5. 后台 UI(新增"真实心跳"面板)
- 菜单新增「真实心跳 ♥」模块,每 15 秒刷新汇总。
- 概览页新增「今日真实心跳访客」卡片(点击进详情),同时显示零心跳可疑数。
- 详情面板含两张表:真实心跳会话 / 零心跳可疑会话。
三、合成测试(ECS 实测,已清理测试数据)
| 模拟对象 | 发送 | zry_visit_beat | has_heartbeat | beat_count | 判定 |
|---|---|---|---|---|---|
| 真实访客 | t=1 + 3×t=3 | t=1×1 + t=3×3 | 1 | 3 | 真实心跳 ✓ |
| bot | 仅 t=1 | t=1×1(无 t=3) | 0 | 0 | 零心跳可疑 ✓ |
→ 甄别逻辑端到端成立:有 t=3 的标记 has_heartbeat=1,只有 t=1 的落入"零心跳可疑"。
四、上线验证
- SQL 迁移已执行,
zry_visit_beat表 + 两列就位。 newzry+zrycollect已重启(PID 625948 / 625960,online,无启动报错)。- 新路由
admin/heartbeat已注册(无 token 返回 401,非 404)。 - 线上下发
admin.js?v=1688eb0a含renderHeartbeat(已含新 UI)。 - 接口所用 SQL 已在 ECS 用真实测试数据验证返回正确形态。
- 鉴权态端到端未跑(本地 token 因 S1 改密已失效,需老板登录后可见);数据层与路由均已验证。
五、部署文件清单
node/zry/sql/zry_upgrade_20260920_heartbeat.sql(迁移)node/zry/visit.js(归档 + 心跳列)node/zry/admin.js(heartbeat 接口 + overview 汇总)node/zry/http.js(路由注册)zry/admin/admin.js(真实心跳面板)+zry/admin/index.html(缓存版本化)
六、结论
现在后台「真实心跳」面板可直接看到:今天哪些访客是真人在看(发了每 5 秒心跳)、哪些是只进入不心跳的可疑访问。后续可把"零心跳可疑 + 疑似 UA"的 Top IP 批量喂进 L2/fail2ban 降脏数据,进一步提升统计纯度。