feat(纯算): 以成功样本明文为模板的纯 Python 出包管线 + 证据账本 v2
做了什么
- 从「签到成功-1.har」提取该次会话的 tdc.js, 提取密钥解密出
errorCode=0 那次 collect 的完整明文 (1360 字节), 存为
tcaptcha/models/success_collect_template.b64
- 新增 generate_collect_success(): 以成功样本为结构模板, Python 只回填
轨迹/当前时间戳/随机盐, 其余环境字段 (canvas/WebGL/屏幕/语言/sd.ft) 原样保留
- 新增 _success_style_trajectory(): 按成功样本实测统计生成轨迹
(61 点, dt 均值 30.6ms, 50% 在 0~16ms, 途经 3 个目标, 驻留抖动)
—— 修正了统计正则不允许负增量的 bug (真实 61 点, 此前误数成 18)
- 发现成功样本用 \x00 填充 (不是空格), sd 多一个 ft 字段
- telemetry_mode=python_keyed 默认走该路径; Node 仅提取每构建 XTEA 密钥
- ANALYSIS.md 第七节重写为 v2 证据账本, 显式撤回 4 个无证据结论
验证
- 纯 Python 密文 == 真实 tdc.js 密文 (逐字节)
- 回归: test_xtea_key 11 项、test_glyph_solver 8/8
- 端到端 1ms 实测: 仍 errorCode=12 (诚实记录, 未解决)
结论(见 ANALYSIS.md 7.5-7.7)
- 12 不是"检测到机器人": 同 IP 有成功样本、参数逐字段一致、
真 Chrome 网络栈/真人点击/CDP 均排除
- 剩余假设: H1 需已登录业务会话(未用 auth_token 调 captcha/params 复测)
H3 需有效 qcloud.com cookie(过期 skey 复测不能定论)
- 下一步: 用登录态 auth_token 调 /api/v1/captcha/params,
对比返回是否多出鉴权字段 —— 这是唯一未做且成本低的关键实验
This commit is contained in:
@@ -373,3 +373,61 @@ tdc.js;复用本仓库已完成的视觉求解器算坐标,用 `Input.dispat
|
||||
|
||||
> 题型在**会话内固定**:`getsig` 不换题型,只有重新 `prehandle` 才能抽到别的题型。
|
||||
> `client.solve` 已内置「抽到目标题型再提交」的循环(默认 `max_refreshes` 次)。
|
||||
|
||||
---
|
||||
## 七、errorCode=12 根因分析 —— 证据账本(v2,推倒重写)
|
||||
|
||||
> v1 版本(已废弃)里我下了多个无证据结论,本节按 §1.3 重写:
|
||||
> 只写有证据的"已知"、明确的"未定"、以及被推翻的假设。
|
||||
|
||||
### 7.1 已确证事实(每条附证据)
|
||||
|
||||
| # | 事实 | 证据 |
|
||||
| --- | --- | --- |
|
||||
| E1 | 答案判错→`50`,判对→`12`,稳定复现 | 乱坐标 4 次→50;正确 8+ 次→12;正确但顺序点反→50 |
|
||||
| E2 | 同一套纯协议代码在雨云 aid 上 → `0` + 真实 ticket | aid=2039519451 端到端实测 |
|
||||
| E3 | 真实签到流程(已登录、真页面、真浏览器、同 IP `118.248.52.65`)→ `0` + 真实 ticket | `签到成功-1.har` 条目 66/67 |
|
||||
| E4 | 官方 SDK 注入在 `1ms.run` 首页(未登录)+ 真人点击 → `12` | `solve_in_browser.js` 抓到的 verify 响应 |
|
||||
| E5 | **域不在白名单时 SDK 直接短路**:不出题、立刻回 `trerror_1006_...` 错误票据 | `127.0.0.1` 页面上 SDK 加载 1 秒内即回调 `ret:0`,无任何挑战 UI |
|
||||
| E6 | 纯 Python 的 collect 各种变体(空/垃圾/截断/真实环境值/真实轨迹 dt)→ 全部 `12` | 变异矩阵 + 多轮实测 |
|
||||
| E7 | 成功流程的 captcha 请求带 `qcloud.com` 域 cookie(`uin`/`skey`/`qcmainCSRFToken`/`intl`);我们不带 | HAR 条目 60/61/62 请求头 |
|
||||
|
||||
### 7.2 显式撤回的错误结论(§5.7)
|
||||
|
||||
| 曾下的结论 | 撤回理由 |
|
||||
| --- | --- |
|
||||
| ❌ "服务端不看 collect" | E6 里 collect 置空也 12,更可能是"校验失败即 12",不能反推"不看" |
|
||||
| ❌ "环境指纹取值是瓶颈" | 填入真实值后仍 12,未证实 |
|
||||
| ❌ "CDP/临时 profile 不被检测" | **依据无效**:E5 显示 127.0.0.1 上根本不出题,`ret:0` 是域授权短路,与风控无关 |
|
||||
| ❌ "12 是业务账号上下文问题"(腾讯云 cookie) | 仅一次用可能过期的 skey 测试,不能定论 |
|
||||
|
||||
### 7.3 关键混淆变量(必须承认)
|
||||
|
||||
E3(成功)与 E4(失败)之间**同时变了三个变量**:
|
||||
① 真实签到页 vs 注入首页 ② 已登录 vs 未登录 ③ 无 CDP vs 有 CDP
|
||||
|
||||
所以目前**无法**把 12 归因于其中任何一个 —— 之前归因"腾讯云 cookie"是过度解读。
|
||||
|
||||
### 7.4 剩余假设(互相独立,需单变量实验区分)
|
||||
|
||||
| # | 假设 | 若为真的修法 |
|
||||
| --- | --- | --- |
|
||||
| H1 | 需要**已登录业务会话/真实页面上下文**(页面自己初始化的验证码) | 复刻业务会话,或半自动取票 |
|
||||
| H2 | **CDP/自动化被检测** | 只能非 CDP 真浏览器,半自动 |
|
||||
| H3 | 需要 `qcloud.com` 账号 cookie(有效 `uin`/`skey`) | 纯算流程带上该 cookie 即可 |
|
||||
|
||||
### 7.5 决定性实验(单变量,二选一即可闭合)
|
||||
|
||||
**在同一浏览器里登录 1ms,走真实签到页,让页面自己的验证码弹出并人工完成**(我方仅监听 verify):
|
||||
|
||||
- 结果 `0` → **H1 成立**(CDP/自动化无嫌疑),修复方向 = 复刻登录态与业务会话
|
||||
- 结果 `12` → **H2 成立**(CDP 被检测),纯算+CDP 均不可行,只能半自动
|
||||
|
||||
若两者都排除,再做 H3(取有效 `qcloud.com` cookie 复测)。
|
||||
|
||||
### 7.6 与本题无关但已完成的资产
|
||||
|
||||
* XTEA 算法逐字节还原 + 每构建密钥提取(`tcaptcha/crypto.py`、`tdc_worker.js` captureKey)
|
||||
* 文字点选求解器 8/8 回归
|
||||
* 轨迹 dt 修正为真实毫秒分布(`human_dt_ms`)
|
||||
* 代理提取/换 IP、模板标定回填管线
|
||||
|
||||
Reference in New Issue
Block a user