- Principle #5: no skipping degradation tiers (anti AI strategic surrender) - Phase 0 step 4: start_reverse_session() zero-arg domain auto-detect - Phase 0.5.-1: domain assertion reverify before fingerprint matching - Phase 5: assertion-driven delivery (verify_against_session + add_assertion) - Core weapon: MCP v0.8.0 (78 tools), domain session + assertion section - Error handling: AI surrender degradation tier table (L1-L6) - Experience rules: 40 -> 46 (domain persistence / reverify / assertion ROI) - New: references/domain-session-guide.md - New: CHANGELOG_v2.9.0.md - Skip v2.8.0 (process-level session design rejected)
215 lines
7.6 KiB
Markdown
215 lines
7.6 KiB
Markdown
# 域级 Session 档案指南
|
||
|
||
> v2.9.0 新增。每个目标域维护一份持久化 Session 档案,跨任务复用反爬类型判定、指纹基准、Cookie 归因结论,避免重复侦察。
|
||
|
||
## 1. 档案结构
|
||
|
||
每个域的 Session 档案存放在 `cases/_session_archives/<domain-hash>/` 下,包含以下文件:
|
||
|
||
```
|
||
cases/_session_archives/
|
||
└── <domain-hash>/
|
||
├── session.json # 核心档案(结构化元数据)
|
||
├── fingerprint.json # 浏览器指纹基准快照
|
||
├── cookie-attribution.json # Cookie 归因结论缓存
|
||
├── assertions.json # 断言集(通过/失败/跳过)
|
||
└── notes.md # 人工备注(可选)
|
||
```
|
||
|
||
### session.json 字段说明
|
||
|
||
```json
|
||
{
|
||
"domain_hash": "sha256(domain)[0:12]",
|
||
"created_at": "ISO8601",
|
||
"updated_at": "ISO8601",
|
||
"skill_version": "2.9.0",
|
||
"anti_crawl_type": "signature | behavioral | obfuscation | unknown",
|
||
"anti_crawl_evidence": {
|
||
"initial_status": 412,
|
||
"final_status": 200,
|
||
"redirect_chain_pattern": "412→412→200",
|
||
"vmp_script_url": "**/sdenv-*.js",
|
||
"vmp_case_count": 87,
|
||
"sdk_fingerprint": ["sdenv", "FuckCookie"]
|
||
},
|
||
"tool_chain": {
|
||
"primary": "instrument_jsvmp_source",
|
||
"mode": "ast",
|
||
"fallback": "hook_jsvmp_interpreter(mode=transparent)"
|
||
},
|
||
"hot_keys_snapshot": {
|
||
"top_10": ["userAgent", "plugins", "webdriver", "cookie", "platform", "language", "screen.width", "screen.height", "hardwareConcurrency", "deviceMemory"],
|
||
"total_count": 42,
|
||
"captured_at": "ISO8601"
|
||
},
|
||
"cookie_attribution_summary": {
|
||
"signature_cookies": ["acw_tc"],
|
||
"js_cookies": ["x-bogus-js"],
|
||
"mixed_cookies": ["NfBCSins"]
|
||
},
|
||
"assertions_passed": 12,
|
||
"assertions_failed": 0,
|
||
"assertions_total": 12
|
||
}
|
||
```
|
||
|
||
## 2. 生命周期
|
||
|
||
### 2.1 创建时机
|
||
|
||
Session 档案在以下时机自动创建:
|
||
|
||
1. **Phase 0 启动时**:`launch_browser` + `navigate` 成功后,检查 `cases/_session_archives/` 下是否已有该域的档案
|
||
- 已有 → 加载并验证(跑断言集,见第 4 节)
|
||
- 没有 → 创建空档案,后续步骤逐步填充
|
||
|
||
2. **反爬类型识别完成后**:将 `anti_crawl_type` 和 `anti_crawl_evidence` 写入档案
|
||
|
||
3. **Phase 0.5 指纹采集后**:将 `hot_keys_snapshot` 和 `cookie_attribution_summary` 写入档案
|
||
|
||
### 2.2 更新时机
|
||
|
||
- 每次成功完成 Phase 5 交付后,更新 `updated_at` 和断言结果
|
||
- Cookie 归因结论变化时(如新增 cookie 字段),更新 `cookie-attribution.json`
|
||
- 用户手动触发 `session refresh` 时,重新采集指纹基准
|
||
|
||
### 2.3 过期策略
|
||
|
||
- 档案默认 **7 天有效**(`updated_at` 距今超过 7 天视为过期)
|
||
- 过期档案不删除,但加载时会标记 `stale: true`,提示用户是否重新验证
|
||
- 断言集失败 ≥ 3 条时,自动标记为 `needs_refresh`
|
||
|
||
## 3. 与工作流的集成
|
||
|
||
### Phase 0 集成
|
||
|
||
```
|
||
Phase 0 步骤 4(新增):启动域级 Session 档案
|
||
① 计算目标域的 hash:sha256(domain)[0:12]
|
||
② 检查 cases/_session_archives/<hash>/session.json 是否存在
|
||
③ 存在且未过期 → 加载档案,输出摘要:
|
||
"已加载域级 Session 档案:反爬类型=签名型,上次分析于 2 天前,12/12 断言通过"
|
||
④ 存在但过期 → 加载档案 + 标记 stale,提示用户:
|
||
"域级 Session 档案已过期(7 天前),建议重新验证断言集"
|
||
⑤ 不存在 → 创建空档案,后续步骤自动填充
|
||
```
|
||
|
||
### Phase 0.5 集成
|
||
|
||
```
|
||
Phase 0.5.-1(新增前置步骤):本域断言 Reverify
|
||
如果 Session 档案存在且包含断言集:
|
||
① 逐条执行断言(见第 4 节)
|
||
② 全部通过 → 跳过 Phase 0.5 的指纹采集,直接进入 Phase 1
|
||
输出:"断言集 12/12 通过,目标站点技术栈未变,跳过重复侦察"
|
||
③ 有失败 → 标记失败断言,进入 Phase 0.5 正常流程重新采集
|
||
输出:"断言 #3(VMP case_count)失败:期望 87,实际 102。目标可能已更新,重新侦察"
|
||
```
|
||
|
||
### Phase 5 集成
|
||
|
||
```
|
||
Phase 5 交付时自动更新 Session 档案:
|
||
① 将本次分析的断言集写入 assertions.json
|
||
② 更新 session.json 的 updated_at 和 assertions_passed/failed/total
|
||
③ 如果是新域,提示用户:"已创建域级 Session 档案,下次分析同域时将自动复用"
|
||
```
|
||
|
||
## 4. 断言系统
|
||
|
||
断言是 Session 档案的核心验证机制。每条断言描述一个可自动检测的技术事实,用于快速判断目标站点是否发生了技术变更。
|
||
|
||
### 4.1 断言类型
|
||
|
||
| 类型 | 示例 | 检测方法 |
|
||
|------|------|---------|
|
||
| `script_exists` | VMP 脚本 URL 模式仍然存在 | `list_scripts` → 匹配 URL pattern |
|
||
| `script_size_range` | VMP 脚本大小在 ±20% 范围内 | `list_scripts` → 检查文件大小 |
|
||
| `dispatch_loop_count` | VMP 分发循环 case 数在 ±10 范围内 | `find_dispatch_loops` → 比较 case_count |
|
||
| `anti_crawl_type` | 反爬类型未变(仍为签名型) | `navigate` → 检查 redirect_chain 模式 |
|
||
| `cookie_names` | 关键 cookie 名称仍然存在 | `get_cookies` → 检查 name 列表 |
|
||
| `sdk_fingerprint` | SDK 特征关键词仍可搜索到 | `search_code` → 匹配关键词 |
|
||
| `hot_keys_stable` | hot_keys top 10 与快照重合度 ≥ 70% | `get_instrumentation_log` → 比较 hot_keys |
|
||
| `response_structure` | API 响应结构未变 | `get_network_request` → 检查 JSON 字段 |
|
||
|
||
### 4.2 断言格式
|
||
|
||
```json
|
||
{
|
||
"assertions": [
|
||
{
|
||
"id": 1,
|
||
"type": "script_exists",
|
||
"description": "VMP 脚本 URL 匹配 **/sdenv-*.js",
|
||
"params": { "url_pattern": "**/sdenv-*.js" },
|
||
"last_result": "passed",
|
||
"last_checked": "ISO8601"
|
||
},
|
||
{
|
||
"id": 2,
|
||
"type": "dispatch_loop_count",
|
||
"description": "VMP 分发循环 case 数在 77-97 范围内",
|
||
"params": { "expected": 87, "tolerance": 10 },
|
||
"last_result": "passed",
|
||
"last_checked": "ISO8601"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 4.3 断言执行流程
|
||
|
||
```
|
||
对每条断言:
|
||
① 根据 type 选择检测方法(MCP 工具调用)
|
||
② 执行检测,获取实际值
|
||
③ 与 params 中的期望值比较
|
||
④ 记录结果:passed / failed / skipped(工具不可用时)
|
||
⑤ 更新 assertions.json 的 last_result 和 last_checked
|
||
```
|
||
|
||
## 5. 隐私与安全
|
||
|
||
- **域名哈希化**:目录名使用 `sha256(domain)[0:12]`,不直接暴露域名
|
||
- **已加入 .gitignore**:`cases/_session_archives/` 不纳入版本控制
|
||
- **敏感数据脱敏**:session.json 中不存储具体 Cookie 值、密钥、Token 等
|
||
- **fingerprint.json 仅存结构**:存储属性名和类型,不存储具体指纹值(如 canvas hash)
|
||
|
||
## 6. 手动操作
|
||
|
||
### 查看当前域的 Session 档案
|
||
|
||
```bash
|
||
# 计算域名 hash
|
||
echo -n "target-domain.com" | sha256sum | cut -c1-12
|
||
|
||
# 查看档案
|
||
cat cases/_session_archives/<hash>/session.json | jq .
|
||
```
|
||
|
||
### 强制刷新档案
|
||
|
||
在对话中告诉 Agent:"刷新当前域的 Session 档案",Agent 将:
|
||
1. 清空 assertions.json
|
||
2. 重新执行 Phase 0 + Phase 0.5 的完整流程
|
||
3. 重建断言集
|
||
|
||
### 删除档案
|
||
|
||
```bash
|
||
rm -rf cases/_session_archives/<hash>/
|
||
```
|
||
|
||
## 7. 与经验库(cases/)的关系
|
||
|
||
| 维度 | Session 档案 | 经验库案例 |
|
||
|------|-------------|-----------|
|
||
| 粒度 | 单个域 | 一类技术方案 |
|
||
| 内容 | 运行时状态(指纹、cookie、断言) | 方法论(定位路径、还原模板) |
|
||
| 生命周期 | 7 天有效,自动过期 | 永久,手动更新 |
|
||
| 隐私 | 哈希化,不入 git | 脱敏后入 git |
|
||
| 用途 | 跳过重复侦察 | 跳过重复分析 |
|
||
|
||
两者互补:Session 档案回答"这个域现在是什么状态",经验库回答"这类技术方案怎么破"。
|