File size: 1,596 Bytes
12617a9 c4753aa 12617a9 c4753aa 12617a9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | from urllib.parse import unquote
from backend.access_log import _log_request
from backend.visit_stats import record_activity_report
def _sparse_page_activity_log_cum(cum: int) -> bool:
"""无服务端状态:累计秒为 2、10、20(前 20s 内与前端档位一致)或 40、80、160…(40·2^k)时打访问日志。"""
if cum in (2, 10, 20):
return True
if cum < 40 or cum % 40:
return False
q = cum // 40
return q > 0 and (q & (q - 1)) == 0
def client_activity_report(activity_body=None):
d = activity_body if isinstance(activity_body, dict) else {}
p = str(d.get("page_path") or "")[:512].strip()
try:
cum = int(d.get("total_active_sec"))
dlt = int(d.get("delta_active_sec"))
if not p or cum < 1 or dlt < 0:
return {"ok": True}
except (TypeError, ValueError):
return {"ok": True}
path_only = p.split("?", 1)[0].split("#", 1)[0].strip()
page_key = path_only.rstrip("/").split("/")[-1] or path_only
if not page_key:
return {"ok": True}
if "?" in p:
qs = p.split("?", 1)[1].split("#", 1)[0]
log_path = f"{page_key}?{unquote(qs)}" if qs else page_key
else:
log_path = page_key
raw_os = d.get("client_os")
client_os = str(raw_os).strip() if raw_os is not None else None
record_activity_report(page_key, dlt, cum, client_os)
if _sparse_page_activity_log_cum(cum):
_log_request(
"📄 页面活跃",
f"path={log_path!r} total_sec={cum} delta_sec={dlt}",
)
return {"ok": True}
|