{"id":39909261,"url":"https://github.com/happyhackingspace/gakido","last_synced_at":"2026-01-28T10:10:23.641Z","repository":{"id":333305577,"uuid":"1136860880","full_name":"HappyHackingSpace/gakido","owner":"HappyHackingSpace","description":"Gakido is a high-performance Python HTTP client focused on browser impersonation and anti-bot evasion. It supports Chrome/Firefox/Safari/Edge/Tor-style profiles, JA3/Akamai-like TLS overrides, HTTP/1.1 and HTTP/2, optional native HTTP fast-path, sync and async APIs, multipart uploads, and a minimal WebSocket client.","archived":false,"fork":false,"pushed_at":"2026-01-21T18:10:46.000Z","size":943,"stargazers_count":7,"open_issues_count":8,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-23T16:10:47.051Z","etag":null,"topics":["antibot","browser","crawling","python","request","security-tools","web"],"latest_commit_sha":null,"homepage":"https://happyhackingspace.github.io/gakido/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HappyHackingSpace.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-18T13:51:20.000Z","updated_at":"2026-01-22T09:51:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/HappyHackingSpace/gakido","commit_stats":null,"previous_names":["happyhackingspace/gakido"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/HappyHackingSpace/gakido","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyHackingSpace%2Fgakido","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyHackingSpace%2Fgakido/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyHackingSpace%2Fgakido/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyHackingSpace%2Fgakido/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HappyHackingSpace","download_url":"https://codeload.github.com/HappyHackingSpace/gakido/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyHackingSpace%2Fgakido/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28741621,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T01:40:51.112Z","status":"online","status_checked_at":"2026-01-25T02:00:06.841Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["antibot","browser","crawling","python","request","security-tools","web"],"created_at":"2026-01-18T16:05:05.608Z","updated_at":"2026-01-25T02:00:32.723Z","avatar_url":"https://github.com/HappyHackingSpace.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Gakido\n\nHigh-performance CPython HTTP client focused on browser impersonation, anti-bot evasion, and speed.\n\n### Features\n- Browser profiles (Chrome/Firefox/Safari/Edge/Tor aliases)\n- JA3/Akamai-style TLS overrides (`tls_configuration_options`, `ExtraFingerprints`)\n- HTTP/1.1, HTTP/2, and **HTTP/3 (QUIC)** support\n- HTTP/3 optimized for Cloudflare and CDN targets\n- **Automatic compression** (gzip, deflate, brotli) with profile-based Accept-Encoding\n- Sync + async clients, connection pooling\n- Multipart uploads\n- Minimal WebSocket client\n- Optional native HTTP fast-path (`gakido_core`, HTTP only)\n\n### Install\n```bash\npip install gakido\npip install gakido[h3]     # with HTTP/3 support\npip install gakido[dev]    # development dependencies\n```\n\n### Quick start (sync)\n```python\nfrom gakido import Client\n\nc = Client(impersonate=\"chrome_120\")  # force_http1 defaults to True\nr = c.get(\"https://example.com\")\nprint(r.status_code, r.text[:200])\n```\n\n### Async\n```python\nimport asyncio\nfrom gakido.aio import AsyncClient\n\nasync def main():\n    async with AsyncClient(impersonate=\"chrome_120\") as c:\n        r = await c.get(\"https://httpbin.org/get\")\n        print(r.status_code)\n\nasyncio.run(main())\n```\n\n### Multipart upload\n```python\nfiles = {\"file\": (\"test.txt\", b\"hello\", \"text/plain\")}\ndata = {\"foo\": \"bar\"}\nwith Client() as c:\n    r = c.post(\"https://httpbin.org/post\", data=data, files=files)\n    print(r.json())\n```\n\n### TLS overrides (JA3-like)\n```python\nfrom gakido import Client, ExtraFingerprints\n\nja3_str = \"771,4866-4867-4865-49196,0-11-10,29,0\"\nextra_fp = ExtraFingerprints(alpn=[\"http/1.1\"])\n\nc = Client(\n    impersonate=\"chrome_120\",\n    tls_configuration_options={\"ja3_str\": ja3_str, \"extra_fp\": extra_fp},\n)\nr = c.get(\"https://tls.browserleaks.com/json\")\nprint(r.json().get(\"ja3_hash\"))\n```\n\n### WebSocket\n```python\nfrom gakido.websocket import WebSocket\n\nws = WebSocket.connect(\"echo.websocket.events\", 443, \"/\", headers=[], tls=True)\nws.send_text(\"hello\")\nop, payload = ws.recv()\nprint(payload.decode(errors=\"ignore\"))\nws.close()\n```\n\n### Proxies\n```python\nfrom gakido import Client\n\nc = Client(proxies=[\"http://127.0.0.1:8080\"])\nr = c.get(\"http://httpbin.org/ip\")  # HTTP proxy only\nprint(r.text)\n```\n\n### HTTP/3 (QUIC) for Cloudflare/CDN\n```python\nimport asyncio\nfrom gakido import AsyncClient, is_http3_available\n\nasync def main():\n    print(f\"HTTP/3 available: {is_http3_available()}\")\n\n    async with AsyncClient(\n        impersonate=\"chrome_120\",\n        http3=True,           # Enable HTTP/3\n        http3_fallback=True,  # Fall back to H1/H2 if H3 fails\n    ) as c:\n        r = await c.get(\"https://cloudflare.com/cdn-cgi/trace\")\n        print(f\"HTTP/{r.http_version}: {r.status_code}\")\n\nasyncio.run(main())\n```\n\n### Notes\n- `force_http1=True` by default for compatibility; set `force_http1=False` to allow ALPN h2.\n- `http3=True` enables HTTP/3 (QUIC) for compatible targets (requires `pip install gakido[h3]`).\n- `auto_decompress=True` by default: uses profile's Accept-Encoding (gzip, deflate, br) and auto-decompresses responses.\n- Set `auto_decompress=False` to disable compression and receive raw responses.\n- Native core (`gakido_core`) is HTTP-only; HTTPS still uses the Python path.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhappyhackingspace%2Fgakido","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhappyhackingspace%2Fgakido","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhappyhackingspace%2Fgakido/lists"}