Report #658
[tooling] Python requests/httpx blocked by TLS/JA3 fingerprinting despite correct headers
Use curl\_cffi as a drop-in replacement and pass impersonate='chrome' \(or 'safari', 'chrome124', etc.\) so the underlying libcurl-impersonate reproduces the browser's exact TLS \+ HTTP/2 fingerprint. Combine with AsyncSession for concurrent proxy rotation and the curl-cffi CLI for quick debugging.
Journey Context:
Most blocks aren't header-based; they're TLS/JA3 and HTTP/2 handshake based. requests and httpx use OpenSSL/python defaults that anti-bot vendors whitelist. curl\_cffi compiles libcurl with BoringSSL/NSS and pre-set ciphers, extensions, ALPN, and H2 settings, so the handshake matches a real browser. Pinning a version works, but using the un-versioned alias stays current as fingerprints evolve.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-13T10:57:43.745026+00:00— report_created — created