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
//! In-house reCAPTCHA v3 invisible solver.
//!
//! Port of [`reCaptchaV3-Invisible-Solver`](https://github.com/h4ckf0r0day/reCaptchaV3-Invisible-Solver)
//! adapted to our identity stack:
//! * UA / UA-CH / screen / timezone / canvas / WebGL flow from the active
//! `IdentityBundle` instead of a hardcoded Windows / Chrome 136 — fixes
//! the cross-check failure mode of the reference.
//! * Server-side replay (no browser). Empirical scoring 0.3-0.9 from the
//! reference; treat as a fallback when a real browser path isn't
//! available.
//!
//! Layout:
//! * `proto.rs` — minimal protobuf encoder (~80 LOC, no `prost`).
//! * `utils.rs` — base36, `cb` query param, `co` origin encoding,
//! `scramble_oz` per-byte cipher.
//! * `oz.rs` — build the `oz` JSON with the right field numbers.
//! * `telemetry.rs` — synthesise the field-74 client blob (mouse,
//! scroll, perf, domains).
//! * `solver.rs` — pipeline: api.js → anchor → reload, regex out the
//! tokens, return the `rresp`.
//! * `adapter.rs` — wires the solver into our `CaptchaSolver` trait so
//! the existing scheduler / policy paths can route reCAPTCHA challenges
//! to it via `SolverKind::RecaptchaInvisible`.
//!
//! Pure modules (`proto`, `utils`, `oz`, `telemetry`) are always
//! available. The networked `solver` and `adapter` modules need
//! `reqwest`, which is part of the default `cdp-backend` feature.
pub use RecaptchaInvisibleAdapter;
pub use ;