captchaforge 0.2.39

Captcha detection and solving for Firefox and BiDi-driven browsers. Detection, vendor solver scaffolding, trusted cross-origin click delivery into nested OOPIFs, and stealth personas are implemented and tested; broad live-vendor solve rates are not yet benchmarked.
Documentation
pub(crate) use crate::Page;
/// CAPTCHA solving pipeline (layered short-circuit + multi-strategy chain).
///
/// Pre-chain layers:
///   0. Token cache, per-(domain, captcha_type) solved-token cache
///      with TTL and cookie replay on hit. Skip the rest of the chain
///      when fresh.
///
/// Strategies in default order:
///   1. Behavioral, realistic mouse + timing for Turnstile / reCAPTCHA
///      v3 / TOML-rule vendors recommending BehavioralBypass.
///   2. VLM, screenshot → Ollama qwen3-vl:30b → solve grid / text /
///      click CAPTCHAs.
///   3. Audio (click audio challenge → speech-to-text → type answer).
///   4. ThirdParty: 2captcha-compatible service (2captcha / CapMonster /
///      CapSolver). Inert without an API key.
///   5. Human (unsolved + screenshot for human-in-the-loop fallback).
///
/// Pattern store (bounded-α EMA) re-orders eligible solvers per
/// domain so the historically-best method runs first; vendor migrations
/// register within ~10 fresh samples instead of being averaged out by
/// historical wins.
//
// Shared dependencies re-exported at crate-internal visibility so that child
// modules can pick them up via `use super::*;` without duplicating imports.
pub(crate) use anyhow::{anyhow, Result};
pub(crate) use async_trait::async_trait;
pub(crate) use serde::{Deserialize, Serialize};
pub(crate) use std::time::{Duration, Instant};

pub(crate) use crate::captcha_detect::CaptchaInfo;

pub(crate) mod audio;
pub(crate) mod behavioral;
pub(crate) mod crnn_text;
pub(crate) mod util;
pub(crate) mod vlm;
pub(crate) mod yolo_grid;

pub mod adversarial_decoy;
pub mod bandit;
mod cache;
mod chain;
pub mod decoy_detector;
mod grid_click;
mod math_captcha;
mod multi_step;
mod ocr;
pub mod oracle;
mod pattern;
pub mod planner;
mod pow;
mod race;
mod slider;
pub mod speculation;
mod third_party;
pub mod token_oracle;
pub mod token_shapes;
mod types;
pub mod vendors;
mod wait_for_token;

// ─── Curated public API ──────────────────────────────────────────────────────

pub use self::types::{CaptchaSolveResult, CaptchaSolver, CaptchaType, SolveConfig, SolveMethod};

pub use self::audio::{normalize_transcript, AudioCaptchaSolver};
pub use self::behavioral::BehavioralCaptchaSolver;
pub use self::cache::{CacheStats, CachedToken, TokenCache};
pub use self::chain::{CaptchaSolverChain, ChainConfig};
// Vendor-dedicated solvers, re-exported flat at the crate root so
// existing `use captchaforge::solver::ArkoseSolver` etc. paths
// continue to work after the vendors/ collation.
pub use self::crnn_text::CrnnTextSolver;
pub use self::math_captcha::MathCaptchaSolver;
pub use self::multi_step::MultiStepCaptchaSolver;
pub use self::ocr::OcrCaptchaSolver;
pub use self::oracle::{classify, take_snapshot, OutcomeClassification, PageSnapshot};
pub use self::pattern::{CaptchaPattern, PatternStore};
pub use self::planner::{
    HopOutcome, MultiHopPlanner, PlannerConfig, PlannerOutcome, PlannerTerminal,
};
pub use self::pow::PowCaptchaSolver;
pub use self::race::RacingSolver;
pub use self::slider::{SliderCaptchaSolver, SliderSelectors};
pub use self::speculation::{PreflightError, PreflightHandle};
pub use self::third_party::{ThirdPartyCaptchaSolver, ThirdPartyService};
pub use self::token_oracle::{
    classify_response as classify_token_response, TokenEncoding, TokenValidator, ValidationVerdict,
    ValidatorMethod,
};
pub use self::vendors::{
    classify_abck, classify_datadome_cookie, classify_imperva, classify_kasada, classify_px_cookie,
    clean_transcript, is_rate_limited, is_valid_arkose_token, is_valid_aws_waf_token,
    is_valid_v3_triple, is_valid_v4_quad, looks_like_audio_url, AbckValidity,
    AkamaiInterstitialSolver, ArkoseSolver, AwsWafSolver, CloudflareInterstitialSolver,
    DataDomeCookie, DataDomeSolver, GeeTestProtocol, GeeTestSolver, ImpervaClearance,
    ImpervaSolver, KasadaClearance, KasadaSolver, PerimeterXSolver, PxCookie, RecaptchaAudioSolver,
    TurnstileInteractiveSolver, AUDIO_BUTTON_SELECTOR, AUDIO_ELEMENT_SELECTOR, CHECKBOX_OFFSET_X,
    CHECKBOX_OFFSET_Y, MAX_AUDIO_RETRIES, RATE_LIMIT_PHRASES, RECAPTCHA_BFRAME_SELECTOR,
    RESPONSE_INPUT_SELECTOR, TOKEN_INPUT_NAME, TURNSTILE_IFRAME_SELECTOR, VERIFY_BUTTON_SELECTOR,
};
pub use self::vlm::VlmCaptchaSolver;
pub use self::wait_for_token::WaitForTokenSolver;
pub use self::yolo_grid::YoloGridSolver;

// Internal re-export so submodules can access screenshot_b64 via `super::screenshot_b64`.
pub(crate) use self::util::screenshot_b64;