Skip to content

Latest commit

 

History

History
209 lines (165 loc) · 12 KB

File metadata and controls

209 lines (165 loc) · 12 KB

03 · 抗检测子系统

本篇是"高强度档"目标的技术核心。所有结论基于 2026 年一手基准与工具现状(见 09)。 定位:让代表用户行事的合法 Agent 不被反自动化系统误判封锁——一致性优先于欺骗,硬挑战升级人工(责任使用见 00 §6)。

1. 关键认知:反机器人检测分三层,各自独立

flowchart TB
    subgraph L_APP["① JS 指纹层(页面加载后)"]
        A1["navigator.webdriver / UA-CH"]
        A2["canvas / WebGL / audio 指纹"]
        A3["screen / 字体 / 时区 / 语言"]
    end
    subgraph L_NET["② TLS / 网络层(连接建立时)"]
        B1["TLS ClientHello / JA3 / JA4"]
        B2["HTTP/2 SETTINGS 帧序"]
        B3["源 IP 的 ASN(住宅 vs 机房)"]
    end
    subgraph L_PROTO["③ 自动化协议层(浏览器怎样被驱动)★"]
        C1["Runtime.enable / Target.setAutoAttach 握手形状"]
        C2["CDP 连接方式(TCP 端口 vs pipe)"]
        C3["WebDriver / ChromeDriver 标记"]
    end
    NOTE["★ 第三层是‘悬崖’:<br/>Playwright/Puppeteer 及其补丁(patchright/rebrowser)<br/>仍在此层泄漏,被 Cloudflare/DataDome 最硬目标拦截"]
    L_PROTO --- NOTE
Loading

基准实证(Ian Paterson 2026,31 目标 × 7 工具 × 3 轮 = 651 判定):

  • 唯一 0 拦截 的是 nodriver(裸 CDP 直连系统 Chrome,控制面无 Playwright)。
  • vanilla Playwright 与 rebrowser 拦截集完全相同——CDP-leak 补丁在最硬目标上"等于没打"。
  • patchright 仅比 vanilla 多过 1 个,靠的更多是 channel=chrome(真实 Chrome 版本+TLS),而非补丁本身。
  • 代理不救命:代理只改第②层的 IP;TLS/HTTP2/JS 指纹全部源自真实宿主。Linux VPS + 住宅代理反而制造"矛盾",比未代理的 Mac 更容易被拦。

对设计的三条硬约束(本次重估的依据):

  1. 高强度档必须放弃 Playwright 控制面,改用裸 CDP。
  2. 形状一致性(同宿主的 IP/TLS/JS/HTTP2 自洽)比任何单点技巧更重要。
  3. 本地跑真实 Chrome、headful 是最优隐身宿主——与你选的 local-first 天然契合。

2. 隐身阶梯(Stealth Ladder):T0–T3

不追求"一个万能隐身浏览器",而是按目标站点选择最小够用档(基准第一条建议:"先判断目标 gate 在哪一层")。

flowchart LR
    T0["T0 · 无浏览器<br/>TLS 一致 HTTP"]:::t --> T1["T1 · 均衡<br/>Patchright + channel=chrome"]:::t --> T2["T2 · 高强度<br/>裸 CDP pipe 直驱系统 Chrome"]:::t --> T3["T3 · 极限<br/>T2 + 身份/代理轮换 + patched 二进制"]:::t
    classDef t fill:#0b3,stroke:#093,color:#fff
Loading
何时用 传输/手段 过哪层 成本 参考实现
T0 页面无需执行 JS(静态/已知 XHR) curl_cffi / bogdanfinn tls-client:Chrome 形状 TLS+H2 ②TLS 极低(无浏览器进程) curl_cffi(impersonate=chrome)
T1 主流电商/内容站,仅 JS 指纹 gate Patchrightchannel=chrome 真实 Chrome)+ 行为合成 ①JS +部分② patchright + humanization-playwright
T2 Cloudflare/DataDome/Akamai 等自动化协议层 gate 裸 CDP over pipe--remote-debugging-pipe,无 TCP、无 Runtime.enable)直驱系统 Chrome,headful,(profile,seed) 一致性指纹,OS 级输入 ①②③ nodriver / mochi(pipe,MIT) / veil
T3 单 IP 会累积风控、需长跑高频 T2 + 住宅身份/代理轮换池 + 必要时 patched 二进制(camoufox 的 Firefox TLS 白名单效应)+ CAPTCHA 升级人工 ①②③ + 声誉 最高 T2 + 代理编排 + camoufox/Cloak(按需)

为什么这样切档而不是"永远用最强档":

  • T2/T3 更贵、更重(如 Patchright 峰值内存 13GB 级 vs curl 58MB),且 Firefox 系(camoufox)在个别 CDN 上因 TLS 怪癖反而被拦(如 dev.to)——没有免费的最强
  • 站点差异极大:同一批工具在 25/31 目标上判定一致,信号只集中在 6 个目标。按站点选档 + 记忆才是最优。

3. 传输自动选档与升级记忆

flowchart TD
    REQ["会话请求(目标域, 站点策略)"] --> MEM{"该域有历史档位?"}
    MEM -->|有| USE["用记忆档位启动"]
    MEM -->|无| PROBE["闸门探针:<br/>轻量请求判定 gate 层(JS/TLS/协议)"]
    PROBE --> PICK["选最小够用档"]
    PICK --> USE
    USE --> RUN["执行"]
    RUN -->|被拦/挑战| ESCUP["升一档 + 记忆"]
    ESCUP --> USE
    RUN -->|命中硬挑战(图形/风控人机)| HUMAN["升级人工(onEscalation)"]
    RUN -->|成功| SAVE["记忆该域最优档位 + 成功身份画像"]
Loading
  • 闸门探针(gate probe):首次访问用低成本探测判断目标 gate 在哪层,避免无脑上最强档。
  • 升级记忆:被拦即升档并把"域→最优档位/身份"写入策略库,后续直接命中。
  • 硬挑战边界:图形/音频验证码、风控人机 → 不盲目对抗,触发 onEscalation 交人(N3/责任使用)。这是明确的已知边界,对应 SC4。

4. 指纹一致性引擎(Coherence Engine)

原则(借鉴 mochi 的 48 规则关系型 DAG):所有指纹面从单一 (profile, seed) 派生、跨面自洽,绝不逐面随机(I-3)。一次跨面对比(如 Mac UA 却配 Linux WebGL)就会破功。

flowchart TD
    SEED["(profile, seed)<br/>profile=mac-m4-chrome-stable, seed=identity-A"] --> DAG["关系型派生 DAG"]
    DAG --> UA["UA / UA-CH"]
    DAG --> GPU["WebGL/ANGLE renderer"]
    DAG --> CANVAS["canvas/audio 指纹"]
    DAG --> SCREEN["screen/DPR/字体"]
    DAG --> TZ["时区/语言/地理"]
    DAG --> BEH["行为参数(hand/tremor/wpm)"]
    subgraph COHERE["强制自洽"]
        UA -.同一OS家族.-> GPU
        TZ -.对齐IP地理.-> SCREEN
    end
Loading

设计要点:

  • 一身份一 (profile, seed):同一逻辑身份复用同一画像,字节级稳定(长期可信、可累积正常声誉)。
  • 宿主 OS 匹配优先:darwin/arm64 → mac-m4-chrome-stable。在本地 Mac 上就用 Mac 画像——与真实宿主一致(mochi 的核心论点:真实即最优)。
  • 地理一致性:时区/语言/navigator 与出口 IP 地理对齐;代理时同步校正,冲突则 GeoMismatch 拒启(避免制造矛盾)。
  • 真实网络走浏览器自身session.fetch 也经 Chromium 发出,使 JA4/JA3/H2 天然是真 Chrome,杜绝"旁路 HTTP 层"泄漏(mochi 的 no-parallel-HTTP 思路)。
  • 持久化真实 Profile:cookies/localStorage 持久化,让身份"有历史",比全新会话更像真人。

5. 行为合成器(Behavioral Synthesis)

反机器人已进入行为生物特征层(BioCatch/NuData 等)。仅有静态指纹不够,动作动力学也要像人。

flowchart LR
    subgraph MODEL["生物力学模型(按身份画像参数化)"]
        MOUSE["鼠标:三次 Bezier 路径 + overshoot/correction<br/>+ Fitts 定律运动时长 + Gaussian 抖动"]
        TYPE["键入:lognormal digraph 延迟<br/>+ 偶发错字/回删 + 空格后停顿"]
        SCROLL["滚动:惯性减速 + 阅读停顿估计"]
        HES["重要性缩放:submit/pay/confirm 前迟疑更久"]
    end
    MODEL --> INPUT["OS 级输入注入(CDP-Patches)<br/>避开 CDP 输入指令泄漏"]
Loading

关键设计点:

  • 参数按身份画像绑定hand(左右手)、tremor(抖动)、wpm(打字速度)、scrollStyle 从 seed 派生——同一身份行为风格稳定,不同身份有别。
  • OS 级输入优先:高强度档用 OS 级/CDP-Patches 注入输入,而非 dispatchMouseEvent,避免可被检测的 CDP 输入痕迹。
  • 回放期重采样(核心,I-2):确定性回放不复刻探索时的轨迹/时序,而是每次从模型重新采样。理由:逐帧复刻的固定节奏本身就是"这是回放机器人"的强签名。记录做什么,重合成怎么做。
  • 重要性缩放停顿:在"下单/支付/确认"等高风险控件前加更长的人类式犹豫,符合真人心理节奏。

6. 定位器仓库与韧性(Locator Repository)

对应传统 RPA 的 Object Repository,但多模态、可自愈。它既服务回放稳定性,也减少"因定位失败而触发的高成本重探索"。

flowchart TD
    EL["目标元素"] --> ML["多模态定位器束(按韧性排序)"]
    ML --> R1["① 语义/AX:role+accessible name(抗样式漂移)"]
    ML --> R2["② 稳定属性:data-testid / aria / name"]
    ML --> R3["③ CSS / XPath(快路径,脆)"]
    ML --> R4["④ 视觉锚点:相对布局/图标/OCR 文本(兜底)"]
    R1 --> RANK["回放命中率反馈 → 动态重排(自学习)"]
    R2 --> RANK
    R3 --> RANK
    R4 --> RANK
Loading
  • 每步 ≥2 种定位器(探索期强制生成,见 02)。
  • 韧性排序自学习:L1 自愈命中哪种,就把它提前(与 02 §5 回写呼应)。
  • AX-tree ref 优先(借鉴 Stagehand/veil):给 Agent 稳定整型 ref,"Agent 永不手写选择器"。

7. 会话 · 身份 · 代理:形状一致性优先

flowchart LR
    subgraph GOOD["✅ 形状一致(本地 Mac)"]
        G1["住宅 IP(本机)"] --- G2["macOS Chrome TLS"] --- G3["macOS Chrome JS 指纹"] --- G4["macOS H2 帧序"]
    end
    subgraph BAD["❌ 制造矛盾(Linux VPS+住宅代理)"]
        B1["住宅 IP(代理)"] -.冲突.- B2["Linux TLS/JS 指纹"]
    end
Loading
  • 本地优先=隐身最优:不额外引入代理时,本机的 IP/TLS/JS/H2 天然自洽——这是最难被抓的形态。
  • 何时才上代理/轮换(T3):单 IP 长跑高频会累积站点声誉风险时。此时代理出口地理必须与画像地理一致,且优先住宅。轮换用于"防止声誉累积",不是用于"伪装地理"。
  • 一致性校验器:启动前校验 IP 地理 vs 时区/语言/画像;不一致则拒启或自动校正,绝不带矛盾上场。

8. 已知边界(诚实清单,对应 SC4)

边界 现状 Agent-RPA 策略
反调试陷阱(incolumitas / are_you_a_bot) 所有 CDP 驱动工具同样触发(需 C++ 级修改) 标记为已知限制,必要时 T0 旁路或人工
图形/音频验证码、风控人机 自动对抗越界且不稳定 升级人工(onEscalation),不盲解
机房 IP 冷会话被 IP-class 评分 服务端行为 走本地住宅 IP / T3 住宅代理
Firefox 系 TLS 怪癖(camoufox 在个别 CDN 被拦) 工具固有 按站点选档,不默认最强
目标临时换风控厂商 快照非永久事实 升级记忆 + 定期重探针

诚实原则:蓝图明确"哪些做不到、遇到就升级人工",而不是承诺"万能绕过"。这既是工程务实,也是责任使用底线。


9. 与责任使用的接口

  • Site Policy:每域可配 速率上限 / 禁行区 / 是否允许高风险动作(下单支付)。
  • 机密隔离:凭据只在 Vault,注入仅驻内存;日志/回放默认脱敏(I-5)。
  • 审计留痕:每次运行留截图/动作/网络摘要,支持事后审计。
  • 许可提示:nodriver 为 AGPL-3.0——本地个人使用无碍,若未来做联网服务分发需评估开源义务(见 08 选型)。

验收检查表(本篇)

  • 高强度档采用裸 CDP、无 Playwright 控制面、直驱真实 Chrome(对应 SC3,第③层)。
  • 隐身阶梯 T0–T3 + 自动选档 + 升级记忆(对应 SC3/SC4)。
  • 指纹从单一 (profile,seed) 派生、跨面自洽(I-3)。
  • 行为合成 Bezier/Fitts/lognormal + OS 级输入 + 回放重采样(I-2)。
  • 形状一致性校验(IP/TLS/JS/地理),本地优先。
  • 硬挑战升级人工、已知边界清单、机密隔离与审计(SC4/SC8)。