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}