浅念
|
dc13ae6e0e
|
feat(sdk): 页面浏览/有效停留/事件入口,打包≤15KB
- events.ts:page_view/page_stay(有效停留=可见+30s 内有活动),
close 双触发(hidden+pagehide)靠 activeMs 清零不重发
- index.ts:IIFE 入口,队列重放前先替换 g.ctk=dispatch;
首触归因——__ctk_ctx 除设备环境外带 referrer_domain/utm/path
- transport.ts:stringify 抛错(track 宿主可控对象)按已换出
批次事件数计 dropped(Task 14 审查加固)
- demo 双页互跳;gzip 2209B ≤ 15360B;测试 35→44
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 16:28:14 +08:00 |
|
浅念
|
188e6f39ea
|
fix(sdk): transport 测试注释修正(sendBeacon 真实网络警示/退避区间)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 16:13:37 +08:00 |
|
浅念
|
6be163a329
|
feat(sdk): 批量传输(批量/退避/信标/丢包计数)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 16:07:18 +08:00 |
|
浅念
|
18537c5dba
|
fix(sdk): 设备检测顺序修订(iPad/Firefox 平板先判)+ FxiOS 前移
- device_type:iPad/Tablet 先于 Mobile/Android/iPhone 判(真实 iPad UA 恒含 Mobile 串、Firefox Android 平板显式 '; Tablet;',旧顺序误判手机)
- browser:Firefox/FxiOS 前移至 Safari 之前(iOS Firefox UA 尾部恒含 Safari/,旧顺序为死代码)
- 测试 23 过(翻转 iPad 锁定测试 + 新增 Android 平板、iOS Firefox 两条)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 15:58:42 +08:00 |
|
浅念
|
8e4d5a3be5
|
docs: Task13 规格修订——UA 检测顺序(iPad/Tablet 先判、FxiOS 前移)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 15:57:57 +08:00 |
|
浅念
|
c58e49bf5b
|
feat(sdk): 身份与环境上下文模块
- identity.ts: 访客/会话 ID(30min 空闲轮换),localStorage 异常统一内存降级不冒泡(spec §4.5 红线)
- context.ts: buildEnvContext/parseUtm/sanitizeUrl/pageContext;参数黑名单与 server URL_PARAM_DROP_PATTERNS 同源(整键精确匹配、大小写不敏感、保留空值)
- 测试 21 过(含隐私模式降级、Edg 先于 Chrome、微信 UA 判定、iPad-Mobile 规格顺序锁定)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 15:48:17 +08:00 |
|
浅念
|
fa90835ffa
|
fix: 访客API 微收口(duration_ms 移除/truncated 标记/锁定测试/source 收敛)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 15:38:58 +08:00 |
|
浅念
|
9a2cd76e99
|
feat: 访客列表/详情/时间线/会话接口
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 15:20:06 +08:00 |
|
浅念
|
0b93814261
|
chore: dashboard 确定性排序与注释修正
- sources/top_pages Top8 加平局次序键(referrer_domain/path),
平局时跨请求顺序稳定
- test_dashboard 修正过时注释(b 站数据同为 refresh_daily 真实落行)
pytest 79 passed 无回归。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 15:06:21 +08:00 |
|
浅念
|
a0f7bdb87e
|
feat: 总览聚合接口
GET /api/admin/dashboard/overview?site=<site_id>(site 可选,缺省聚合全部站点):
- today:daily_counts 实时四指标(与 refresh_daily 共享口径)+ active_now
(Visitor.last_seen_at 5 分钟窗口,走 site,-last_seen_at 索引)
- trend:DailyStat 近 30 天 values(date).annotate(Sum) 跨站点求和,
缺日补零,今天一位用实时值覆盖(聚合作业未跑也不缺当日)
- sources/top_pages:当天上海自然日窗口 Top8,空来源归"直接访问"
- ?site= 不存在 → 404 信封 site_not_found;未认证 401(默认权限)
测试 4 个(认证/数值与形态/DailyStat 历史/站点过滤与 404),全套 79 passed。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 14:53:01 +08:00 |
|
浅念
|
cf925e8763
|
refactor: stats 提取共享 daily_counts
refresh_daily 四指标口径提取为模块级 daily_counts(site, date),
site=None 时聚合全部站点,为 dashboard 今日实时位复用做准备
(Task8 审查结论:防两处口径漂移)。语义不变,既有 stats 测试全绿。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 14:50:09 +08:00 |
|
浅念
|
eb27bc830b
|
fix: sites 标量 domains 防御/_to_bool/403 锁定/注释
- _norm_domains 入口类型守卫:domains 传数字曾 500、字符串曾逐字符
迭代成单字符域名静默落库,统一走 invalid_domains 400
- bool() 强转换 _to_bool:"false" 字符串曾是 True,对 allow_no_origin
这类放宽开关方向不利,改按字面解析(其余未知值仍 False)
- 补 member DELETE 不存在 pk → 403(先于 404)锁定测试
- SiteDetailView 注释删去 GET 字样(无 detail GET,前端走列表+Dialog)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 14:43:26 +08:00 |
|
浅念
|
16207ae309
|
feat: 站点管理接口
GET/POST /api/admin/sites、PATCH /api/admin/sites/<pk> 登录成员可用;
DELETE 仅 admin,走软删(is_active=False),物理清除留待未来管理命令
分批删(防大站级联删除锁表),CASCADE 仅完整性兜底。域名归一去协议/
端口/路径、小写、去空去重;错误响应统一信封(EnvelopeMixin)。
软删后 collect 上报 403 not_allowed(Task7 联动,测试锁定)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 14:29:18 +08:00 |
|
浅念
|
f22786d746
|
refactor: 提取共享信封模块 EnvelopeMixin/ok
auth.py 的 _EnvelopeMixin/_ok 提取到 tracker/api/envelope.py(去下划线前缀),
auth.py 改为 import 使用;collect.py 的 finalize_response 含 ACAO 回显逻辑
保留在自身视图,仅注释指向未来收敛。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 14:25:14 +08:00 |
|
浅念
|
7ff1536fbf
|
fix: auth 畸形body防御/字段校验信封/用户名校验/429 测试
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 14:18:37 +08:00 |
|
浅念
|
3e58fe003f
|
docs: Task10 增加共享信封模块提取指令(Task9 审查结论)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 14:16:20 +08:00 |
|
浅念
|
754ae1d39d
|
feat: JWT 登录与用户接口
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 14:01:59 +08:00 |
|
浅念
|
77a7f568b2
|
fix: new_visitors 排爬虫+日界/爬虫口径回归测试
- refresh_daily new_visitors 加 is_bot=False(爬虫不是受众,四指标口径统一)
- test_refresh_daily_shanghai_boundary:固定 UTC 时间戳钉死上海自然日界
- test_refresh_daily_excludes_bots:事件/会话/访客 is_bot 均不计入
- refresh_stats 删未使用的 stat = 赋值
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 13:55:13 +08:00 |
|
浅念
|
79a26c77f3
|
docs: Task11 增加共享 daily_counts 实现约束(Task8 审查结论)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 13:53:06 +08:00 |
|
浅念
|
cc1ea6805b
|
feat: 日聚合服务与命令 + 索引迁移打包(Task3 审查结论)
- refresh_daily:按上海自然日聚合 pv/uv/sessions/new_visitors,update_or_create 幂等
- refresh_stats 管理命令:回刷近 N 天(生产由 1Panel 每日 00:10 调度,见 Task 22)
- 索引打包(0002):Event/VisitSession 增加 (site, 时间) 日聚合索引;
删 5 个冗余单列 FK 索引(Event.site/session、VisitSession.site/visitor、DailyStat.site),
保留 Event.visitor/Visitor.site;sqlite PRAGMA 实证级联索引完整、EXPLAIN 走新索引
- test_models:IntegrityError 断言收紧 + Site 级联删除测试
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 13:38:01 +08:00 |
|
浅念
|
f69822859e
|
docs: Task7 收口注记(urlsplit/信封/CL 防御/get_rate)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 13:30:54 +08:00 |
|
浅念
|
678d215b31
|
fix: 采集接口 origin urlsplit/finalize_response 信封/CL 防御
审查三项必修:
1. Origin host 提取改 urlsplit(封堵 https://evil.com/?x=https://www.a.com
类查询串绕过);"null" Origin 视为无 host 走 allow_no_origin;
Referer 回显死逻辑一并清理,ACAO 只回显真正的 Origin 头。
2. finalize_response 统一钩子:429/ParseError 等 DRF 异常响应补 ACAO +
{code,data,message} 信封(浏览器 SDK 需读错误体,误判网络错误重试会
打爆限流器);删 post/_deny/options 三处临时加头代码。
3. Content-Length isdecimal 防御("abc" → 400 非 500;isdigit 放过 "²"
而 int("²") 仍崩,isdecimal 与 int() 可解析集精确对齐)。
锁定测试 ×4:429 信封+ACAO / 坏 JSON 信封+ACAO / 查询串绕过 403 / 畸形 CL 400。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 13:24:31 +08:00 |
|
浅念
|
cf04db794b
|
feat: 采集接口(域名白名单/限流/textplain解析/幂等)
POST /api/collect/batch:text/plain JSON 解析(ParseError 400 防 500)、
域名白名单/站点停用/未知站点统一 403 not_allowed 防枚举、
Anon 限流(collect scope,get_rate 读实时 api_settings 修 import 固化)、
occurred_at ISO 归一(naive 补 UTC)、XFF 末段取 IP + ::ffff: 归一、
成功/拒绝分支均回显 ACAO 供 SDK 读响应。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 13:07:56 +08:00 |
|
浅念
|
acb180e363
|
docs: Task6 收口注记(会话族切分/同批去重等审查修复)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 13:01:31 +08:00 |
|
浅念
|
173d13dbf3
|
fix: ingest 同批去重/会话族切分修复/xdb 无关测试/边界加固
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:59:13 +08:00 |
|
浅念
|
6147f2b9ff
|
feat: 批量入库服务(幂等/首触/会话兜底/聚合更新)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:44:33 +08:00 |
|
浅念
|
e880dbe458
|
fix: geo 收口(模块单例/IPv6测试/降级日志)
- 导出模块级 resolver 单例:Task 6 起 import resolver 使用,
防多实例各持 ~11MB xdb 副本、lru_cache 按实例分片
- 补公网 IPv6→None 测试,锁定 M1 v4-only 决策
- __init__ 降级路径(文件过短/结构无法识别/except)均记
warning 日志,运维可区分「没部署 xdb」与「库 API 崩了」
- 删掉测试未使用的 monkeypatch 参数
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:39:08 +08:00 |
|
浅念
|
c5626be589
|
docs: Task5 收口注记与 Task6/7 指令更新(geo 单例/0占位归一/::ffff: 归一/IPv6 接受)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:38:04 +08:00 |
|
浅念
|
138b472485
|
feat: ip2region 离线地理解析(优雅降级)
GeoResolver 进程级单例,c_buffer 模式一次读入内存(线程安全)。
适配 py-ip2region 3.0.4 实际 API:new_with_buffer(version, buff) 需
Version 对象,由 xdb 头 256 字节探测(2.0 老库自动归 IPv4)。
数据段布局按结构版本分派:3.0 新库 国家|省|城市|ISP|国家代码,
2.0 老库 国家|区域|省|市|ISP——错位会把 ISP 串进 city。
包/xdb 缺失或损坏时 resolve 一律返回 None,测试全绿。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:28:01 +08:00 |
|
浅念
|
c256d1becb
|
docs: Task4 收口注记(最终实现 7b26c7e 为准)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:22:22 +08:00 |
|
浅念
|
7b26c7e14a
|
fix: 孤代理三入口堵漏+精确断言+截断清洗换序
- _utf8_ok 助手:event_id/path/title 含孤代理("\ud800")在入口即拒
(原会流到下游 encode 必 500);props 字节守门 try/except 归入 properties_invalid
- 补零覆盖原因码测试:path=123 → invalid_field_type;utm 三层嵌套 → properties_depth
- 子串断言("sensitive" in r 等)全改精确等值断言,码即 API
- path 改为先 sanitize_url 再截 500:中文查询参数 urlencode 膨胀最多 3 倍,
先截后洗会破坏出门 ≤MAX_PATH_LEN 不变量(实测汉*200 查询洗后截回 500)
- docstring 写明就地写回契约(Task 6 ingest 依赖)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:20:27 +08:00 |
|
浅念
|
c5f900f3bd
|
fix: 校验守门按字节+递归长度+非dict拒绝
- 体积守门改 UTF-8 字节数(原按字符数,"汉"*1500 约 4.5KB 可绕过 4096 上限)
- 字符串长度检查并入 _walk_props 递归,嵌套字符串同样受 MAX_STR_LEN 约束
(顺序:体积先行,故同一值既超长又超体积时报 properties_too_large)
- properties 传了但非 dict([]/""/0/None)不再被 or {} 静默放行,缺省键仍放行
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:10:56 +08:00 |
|
浅念
|
6086031367
|
docs: Task4 最终实现同步进计划(敏感键先于白名单/递归扫描/naive 防御)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:05:31 +08:00 |
|
浅念
|
f2a5f7611a
|
fix: 校验加固(嵌套敏感键/naive时间防御)
- _depth_ok 与敏感键扫描合并为单次递归 _walk_props,dict 所有层级键均过
_SENSITIVE(此前嵌套键不扫描,utm 白名单内可夹带敏感键)
- occurred_at 为 naive datetime 时返回 invalid_occurred_at(原为 TypeError 500)
- 删除未使用的 timedelta 导入
- 深度超限即停止下探,10 万层嵌套不爆栈
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:04:40 +08:00 |
|
浅念
|
cb57e67179
|
feat: 事件校验服务(白名单/敏感键/时间窗/URL清洗)
TDD:7 测试先红(ModuleNotFoundError)后绿。与计划的一处偏差:
敏感键扫描移至属性白名单之前——白名单内无任何键命中敏感模式,
原顺序下 sensitive_field 不可达,test_sensitive_property_rejected
(user_password 非白名单键)将得到 property_not_allowed 而失败。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 12:01:45 +08:00 |
|
浅念
|
3242d12f12
|
docs: 沉淀 Task3 质量审查结论(Task8 索引打包/active_now 走 last_seen_at/站点软删/分区预案)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:56:44 +08:00 |
|
浅念
|
462852c3f3
|
fix: VisitSession 时间戳恢复 NOT NULL,测试补显式时间(修正计划的测试笔误)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:46:51 +08:00 |
|
浅念
|
79f2a89e0a
|
docs: 修正 Task3 测试笔误(VisitSession 建档补显式时间戳,保持 NOT NULL)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:46:14 +08:00 |
|
浅念
|
d1472c1845
|
feat: 核心数据模型(Site/Visitor/VisitSession/Event/DailyStat)
VisitSession.started_at/ended_at 在计划模型基础上加 null=True(计划测试
未传这两字段,原 NOT NULL 会导致测试失败;ended_at 为空也表示会话进行中)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:45:03 +08:00 |
|
浅念
|
cda80b1605
|
fix: Task2 质量修复(TS2774/降级分支测试/跨平台checksize/显式lib)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:39:34 +08:00 |
|
浅念
|
15853f20b3
|
docs: 计划追溯修正——TS2774 安全 uuid/降级分支测试/跨平台 checksize
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:39:12 +08:00 |
|
浅念
|
8e2c91663e
|
chore: SDK 工程骨架(esbuild+vitest)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:30:42 +08:00 |
|
浅念
|
2a7f08fd14
|
fix: Task1 质量审查修复(RuntimeError fail-fast/ALLOWED_HOSTS strip/lock 清理/测试缓存隔离)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:27:25 +08:00 |
|
浅念
|
6dbe26af0b
|
chore: Django 工程骨架(config+tracker app+常量)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:16:01 +08:00 |
|
浅念
|
8af480e4a4
|
docs: M1 计划四维审查修复(30+ 处)
- 后端: py-ip2region 正确包名与API/会话缓存键/并发F表达式/重放聚合排除/parser与Django5时区500/类型与体积深度白名单/限流测试夹具/字段截断
- SDK: localStorage内存降级/异步路径try-catch/批次context补首触字段/page_stay同源path/4xx不重试/测试技巧
- 安全: 生产fail-fast/请求体双层上限/deny统一防枚举/拒绝回ACAO/文件缓存共享限流/前端禁v-html/JWT取舍明示
- 交付: .env.production/xdb volume挂载/compose全量与MySQL三路径/.dockerignore/大陆镜像源/隐私告知前置/跨天验证指引
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 11:02:50 +08:00 |
|
浅念
|
63f711d915
|
docs: M1 计划加固——修复 XFF 取 IP/ended_at 回退/uv 口径/有效停留取数,补爬虫过滤/登录限流/部署构建步骤
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 10:32:41 +08:00 |
|
浅念
|
57ea40ed95
|
docs: M1 实施计划(23 任务,评审通过+修正)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 10:17:52 +08:00 |
|
浅念
|
173b7c3b59
|
docs: 确认 spec 定稿——数据采集底座先行,客户画像列为 M4+ 路线图
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 10:05:28 +08:00 |
|
浅念
|
53827a6aca
|
docs: spec 评审修正(M1/M3 范围对齐、跨站串联口径、IPv6 截断等)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 09:54:56 +08:00 |
|
浅念
|
3d013fd0b7
|
docs: 客户行为采集平台设计文档(M1/M2/M3 需求基线)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-15 09:51:36 +08:00 |
|