# Run with default profiles (13 profiles)
uvrunpythonexamples/antibot_benchmark.py
# Test specific profile
uvrunpythonexamples/antibot_benchmark.py--profilechrome_144
# Test all 24 base profiles
uvrunpythonexamples/antibot_benchmark.py--all-profiles
When using --output, results are saved in this format:
{"timestamp":"2025-01-25T16:15:00.000000","gakido_version":"0.1.0","total_profiles_tested":4,"total_tests_run":36,"overall_success_rate":100.0,"profiles":[{"profile_name":"chrome_144","platform":"macOS","has_client_hints":true,"has_canvas_webgl":true,"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...","tests":[{"endpoint_name":"tls_browserleaks","url":"https://tls.browserleaks.com/json","description":"TLS/JA3 fingerprint analysis","success":true,"status_code":200,"response_time_ms":711.5,"error":null,"details":{"response":{"ja3_hash":"..."}}}],"total_tests":9,"passed_tests":9,"failed_tests":0,"success_rate":100.0,"avg_response_time_ms":895.2}],"summary":{"category_stats":{"TLS Fingerprint":{"total":8,"passed":8},"HTTP Headers":{"total":8,"passed":8},"Bot Detection":{"total":12,"passed":12},"Cloudflare":{"total":8,"passed":8}},"best_profile":"chrome_144","worst_profile":"tor_145","profiles_with_100_percent":["chrome_144","firefox_147"]}}
A direct comparison against tls.peet.ws with the
chrome_120 profile. Every client sends the same Chrome User-Agent, so
the only variable is the TLS / HTTP/2 fingerprint.
requests / httpx present an OpenSSL fingerprint over HTTP/1.1 — nothing
like a browser.
gakido's pure-Python path gets the HTTP/2 fingerprint almost right (the extra
5:16384;8:0 is forced by the h2 library) but TLS is still OpenSSL.
gakido's native backend matches real Chrome on both JA4 and the Akamai
HTTP/2 fingerprint, byte for byte. For Chromium profiles the extension order
is randomized per connection, so the JA3 hash also varies the way Chrome's does.
Matching the fingerprint defeats anti-bot systems that block on the TLS / HTTP
fingerprint itself — a large and common class. It does not solve
JavaScript challenges such as Cloudflare's managed challenge or Turnstile: those
require executing JavaScript and cannot be passed by any raw HTTP client
(gakido, curl_cffi, or otherwise) without a real/headless browser. Treat gakido
as the transport-fingerprint layer, not a challenge solver.