Skip to main content

High-performance CPython HTTP client with browser impersonation.

Project description

Gakido

High-performance CPython HTTP client focused on browser impersonation, anti-bot evasion, and speed.

Features

  • Browser profiles (Chrome/Firefox/Safari/Edge/Tor aliases)
  • JA3/Akamai-style TLS overrides (tls_configuration_options, ExtraFingerprints)
  • HTTP/1.1, HTTP/2, and HTTP/3 (QUIC) support
  • HTTP/3 optimized for Cloudflare and CDN targets
  • Automatic compression (gzip, deflate, brotli) with profile-based Accept-Encoding
  • Sync + async clients, connection pooling
  • Multipart uploads
  • Minimal WebSocket client
  • Optional native HTTP fast-path (gakido_core, HTTP only)
  • 96 browser profiles (24 base + 72 aliases) for Chrome, Firefox, Safari, Edge, Opera, Brave, Vivaldi, Tor
  • Antibot benchmark for testing impersonation against detection systems

Install

pip:

pip install gakido
pip install gakido[h3]     # with HTTP/3 support
pip install gakido[dev]    # development dependencies

uv:

uv add gakido
uv add gakido[h3]          # with HTTP/3 support
uv add gakido[dev]         # development dependencies

Quick start (sync)

from gakido import Client

c = Client(impersonate="chrome_120")  # force_http1 defaults to True
r = c.get("https://example.com")
print(r.status_code, r.text[:200])

Async

import asyncio
from gakido.aio import AsyncClient

async def main():
    async with AsyncClient(impersonate="chrome_120") as c:
        r = await c.get("https://httpbin.org/get")
        print(r.status_code)

asyncio.run(main())

Multipart upload

files = {"file": ("test.txt", b"hello", "text/plain")}
data = {"foo": "bar"}
with Client() as c:
    r = c.post("https://httpbin.org/post", data=data, files=files)
    print(r.json())

TLS overrides (JA3-like)

from gakido import Client, ExtraFingerprints

ja3_str = "771,4866-4867-4865-49196,0-11-10,29,0"
extra_fp = ExtraFingerprints(alpn=["http/1.1"])

c = Client(
    impersonate="chrome_120",
    tls_configuration_options={"ja3_str": ja3_str, "extra_fp": extra_fp},
)
r = c.get("https://tls.browserleaks.com/json")
print(r.json().get("ja3_hash"))

WebSocket

from gakido.websocket import WebSocket

ws = WebSocket.connect("echo.websocket.events", 443, "/", headers=[], tls=True)
ws.send_text("hello")
op, payload = ws.recv()
print(payload.decode(errors="ignore"))
ws.close()

Proxies

gakido supports HTTP, SOCKS5, and SOCKS5H proxies for both sync and async clients.

from gakido import Client, AsyncClient

# Sync client with HTTP or SOCKS5 proxy
c = Client()
r = c.get("http://httpbin.org/ip", proxy="http://127.0.0.1:8080")
r = c.get("http://httpbin.org/ip", proxy="socks5://127.0.0.1:1080")
r = c.get("http://httpbin.org/ip", proxy="socks5h://user:pass@127.0.0.1:1080")  # proxy resolves hostname
print(r.text)

# Async client with proxy pool
async_client = AsyncClient(proxy_pool=[
    "http://proxy1:8080",
    "socks5://proxy2:1080",
    "socks5h://user:pass@proxy3:1080",
])
r = await async_client.get("http://httpbin.org/ip")
print(r.text)

Retry with Exponential Backoff

gakido supports configurable retry with exponential backoff for both sync and async clients.

from gakido import Client, AsyncClient
import time

# Sync client with retry
client = Client(
    max_retries=3,           # Up to 3 retry attempts (4 total attempts)
    retry_base_delay=0.5,    # Start with 0.5s delay
    retry_max_delay=30.0,    # Cap delay at 30s
    retry_jitter=True,       # Add random jitter to avoid thundering herd
)
try:
    resp = client.get("http://flaky.example.com")
except Exception as e:
    print(f"Failed after retries: {e}")

# Async client with retry
async_client = AsyncClient(
    max_retries=2,
    retry_base_delay=1.0,
    retry_jitter=False,  # Predictable delays for testing
)
resp = await async_client.get("http://api.example.com")

# Retryable status codes (by default): 408, 429, 500, 502, 503, 504, 507, 511
# Retryable exceptions (by default): ConnectionError, TimeoutError, OSError

See [Retry Documentation](docs/retry.md) for detailed information about retry options and best practices.

HTTP/3 (QUIC) for Cloudflare/CDN

import asyncio
from gakido import AsyncClient, is_http3_available

async def main():
    print(f"HTTP/3 available: {is_http3_available()}")

    async with AsyncClient(
        impersonate="chrome_120",
        http3=True,           # Enable HTTP/3
        http3_fallback=True,  # Fall back to H1/H2 if H3 fails
    ) as c:
        r = await c.get("https://cloudflare.com/cdn-cgi/trace")
        print(f"HTTP/{r.http_version}: {r.status_code}")

asyncio.run(main())

Notes

  • force_http1=True by default for compatibility; set force_http1=False to allow ALPN h2.
  • http3=True enables HTTP/3 (QUIC) for compatible targets (requires pip install gakido[h3]).
  • auto_decompress=True by default: uses profile's Accept-Encoding (gzip, deflate, br) and auto-decompresses responses.
  • Set auto_decompress=False to disable compression and receive raw responses.
  • Native core (gakido_core) is HTTP-only; HTTPS still uses the Python path.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gakido-0.1.5.tar.gz (85.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

gakido-0.1.5-py3-none-any.whl (53.2 kB view details)

Uploaded Python 3

gakido-0.1.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (79.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

gakido-0.1.5-cp313-cp313-macosx_11_0_arm64.whl (61.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

gakido-0.1.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (79.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

gakido-0.1.5-cp312-cp312-macosx_11_0_arm64.whl (61.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

gakido-0.1.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (77.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

gakido-0.1.5-cp311-cp311-macosx_11_0_arm64.whl (61.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file gakido-0.1.5.tar.gz.

File metadata

  • Download URL: gakido-0.1.5.tar.gz
  • Upload date:
  • Size: 85.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for gakido-0.1.5.tar.gz
Algorithm Hash digest
SHA256 c9490f2624ed97b3573e3dfc981f77dcf324426b1e42571b6a0c1559c58bec36
MD5 ead771cff9b862d7326ecbd8dc0ab296
BLAKE2b-256 50f87199d32cb91c3efc00a32358c1e4c84e4348843806e3a0acb6bfacead782

See more details on using hashes here.

File details

Details for the file gakido-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: gakido-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 53.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for gakido-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 9576b1f264aa261f1b21fb3921134d0c1c5c97afdedb9e7362b677b819382b4f
MD5 96083178889531ae9ba13f93a78fe762
BLAKE2b-256 962b697a048186d5c26ecca8bf6215e5c014dfe97009b5502ecf21fd8c846309

See more details on using hashes here.

File details

Details for the file gakido-0.1.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for gakido-0.1.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 e5faadf9ee72ee62f27752a00306a337837454958c3d61fda0762c472823d55c
MD5 c59375b330455b0555841ed67a319c2c
BLAKE2b-256 d8d67dfb74e6479180643b01b8ddfef14fe9aad2b9a3ec59885bcedb33b13772

See more details on using hashes here.

File details

Details for the file gakido-0.1.5-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gakido-0.1.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8f87a8a2c9155f51b646cd0379037ab91de1ed4c891eb5939325a56e6479e53d
MD5 54b02d36dcfd9cfe80e339a92b43d5fa
BLAKE2b-256 a7025b26d1d8116343b087b6f75ada159efda7ba22286d0c01af7d6240141d29

See more details on using hashes here.

File details

Details for the file gakido-0.1.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for gakido-0.1.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 8c434e7335f250574fd4d1212acd10c03634abb8c29587ddb3b926dfd12d7ded
MD5 50b7de98b756e4ad5fcf0d4d3616a338
BLAKE2b-256 d3a88930aa29b4f3f834fde352bb672eb068bd1b23b5ad96c228db175d2b54ce

See more details on using hashes here.

File details

Details for the file gakido-0.1.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gakido-0.1.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0a0b2d4dcb75c4e68695dc8b545f010d48628d7fdb79db89ad37582ad8c58e96
MD5 b2be4de6dd2718845bd858332e84e952
BLAKE2b-256 354e2e0da548c4fe5f7f54e4189e7a4b78da8e93816e776da845600065bd5479

See more details on using hashes here.

File details

Details for the file gakido-0.1.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for gakido-0.1.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 788859ca506c04fabf9f37d705d8f54d6f176e1d7185fdf7ccd998d5e2ebddac
MD5 eea5c523e5ee9fa70c0e3ed63f5c4323
BLAKE2b-256 94d8282fed80d1762ac675ca3a62317fe1885f92edf422bd85c66fab91473124

See more details on using hashes here.

File details

Details for the file gakido-0.1.5-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gakido-0.1.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8305f56269b25c4316af535b3e2954a363313fb7fa8bc1dbd4131795abcf5771
MD5 1a7b32983fcb11388f8a9748cff31d96
BLAKE2b-256 1f7ff1cc2aa281ce0a438f461acd3be633ed253076a3d0cafbed1451b09cf67c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page