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.3.tar.gz (85.0 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.3-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.3-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.3-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

File details

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

File metadata

  • Download URL: gakido-0.1.3.tar.gz
  • Upload date:
  • Size: 85.0 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.3.tar.gz
Algorithm Hash digest
SHA256 31ab700ed41cbd04873384e63b142466a8198a84b352f97b2aa75a25618effeb
MD5 3fc7ec7c955fe932e509f0aa0a64e5c1
BLAKE2b-256 45fa5979d7b3096863e64f4baa570f80b30ab7993dc6bad5271f9cf1138cc98a

See more details on using hashes here.

File details

Details for the file gakido-0.1.3-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.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 f5359f89f52aa7cd028bdbf9ed6b03bb70881a5896598c3284a96c15fca60ebd
MD5 cca5e51d755fa7fa83d07d5d934f36b3
BLAKE2b-256 b88d646cc8a0a3e10c1b0b5a94d5c2bd004bcc85197390864c68aa1ed9c03069

See more details on using hashes here.

File details

Details for the file gakido-0.1.3-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.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 a902f956f7384b9660cbbd19d98ea09b317e9e7689f35119fc72c87814e09922
MD5 afe8753ed1419663b444fd238acc47ee
BLAKE2b-256 d20b8716f9262570e1df1b81afcfff34df2b7cdde054d981e4ff9b8e332e1260

See more details on using hashes here.

File details

Details for the file gakido-0.1.3-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.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 930d5b33f7a1d2ae14c0f2e4161ed5fff670dfa99bebb2c7063ca72d34923a95
MD5 bea0f9cebccb148aa2a9007dcb173c56
BLAKE2b-256 af8c4d717486165584a09470b56c1b88e7b20b6b690d0665965bb0e15036a45a

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