项目进展2026-09-20

志睿源官网|来访统计「真实心跳甄别」上线报告

旧架构里,心跳(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_beathas_heartbeatbeat_count判定
真实访客t=1 + 3×t=3t=1×1 + t=3×313真实心跳 ✓
bot仅 t=1t=1×1(无 t=3)00零心跳可疑 ✓

→ 甄别逻辑端到端成立:有 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 降脏数据,进一步提升统计纯度。

← 返回文章列表