Skip to main content

httpx transport for curl_cffi (python bindings for curl-impersonate)

Project description

httpx-curl-cffi

httpx transport for curl_cffi - python binding for curl-impersonate fork

Unlike other pure python http clients like httpx (with native transport) or requests, curl_cffi can impersonate browser's TLS/JA3 and HTTP/2 fingerprints.

Browser simulation implemented by low-level customizations and usage of native browser TLS libraries (BoringSSL for Chrome, nss for Firefox) - which is impossible to achieve with Python's OpenSSL binding.

If you are blocked by some website for no obvious reason, you can give curl_cffi a try.

Install

pip install httpx-curl-cffi

Usage

from httpx import Client, AsyncClient
from httpx_curl_cffi import CurlTransport, AsyncCurlTransport, CurlOpt

client = Client(transport=CurlTransport(impersonate="chrome", default_headers=True))
client.get("https://tools.scrapfly.io/api/fp/ja3")

async_client = AsyncClient(transport=AsyncCurlTransport(
  impersonate="chrome",
  default_headers=True,
  # required for parallel requests, see curl_cffi issues below
  curl_options={CurlOpt.FRESH_CONNECT: True}
))

Proxy from environment variables

Note that httpx.Client and httpx.AsyncClient disables proxy configuration from environment variables on providing transport argument even with trust_env=True (default), to have this configured in the same way as native transport use snippet below:

import httpx
from httpx._utils import get_environment_proxies
from httpx_curl_cffi import CurlTransport  # or AsyncCurlTransport

def transport_factory(proxy: httpx.Proxy | None = None) -> httpx.BaseTransport:
    return CurlTransport(  # or AsyncCurlTransport
      proxy=proxy,
      verify=False,  # and other custom options
    )

client = httpx.Client(  # or httpx.AsyncClient
    transport=transport_factory(),
    mounts={
        k: transport_factory(httpx.Proxy(url=v)) if v else None
        for k, v in get_environment_proxies().items()
    }
)

TODO

  • httpx.Request content completely read in memory before sending, not sure if it's fixable with curl_cffi at all
  • CurlTransport.cert argument should support in-memory data instead of filenames, pathlib.Path (instead of strings in httpx._types.CertTypes) is forced

curl_cffi issues

Known limitations

  • httpx.Timeout.write is ignored (libcurl limitation)

  • CurlTransport.verify as ssl.SSLContext isn't supported (because OpenSSL is not used)

  • CurlTransport.trust_env argument is ignored, libcurl is always using environment variables for configuration, which is disabled for proxies using CurlOpt.NOPROXY setting to make proxy argument have complete control on proxy usage, but may have effect in TLS configuration (but may not be used by curl-impersonate fork, idk) https://github.com/lexiforest/curl_cffi/issues/345

  • httpx.Response.request.headers isn't updated with default curl-impersonate headers, which can be unexpected on CurlTransport.default_headers=True https://github.com/lexiforest/curl_cffi/issues/368

  • CurlTransport.cert argument isn't compatible with (deprecated) httpx._types.CertTypes - impossible to pass password as third tuple element, pathlib.Path (instead of strings in httpx._types.CertTypes) is forced

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

httpx_curl_cffi-0.1.5.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

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

httpx_curl_cffi-0.1.5-py3-none-any.whl (8.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: httpx_curl_cffi-0.1.5.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for httpx_curl_cffi-0.1.5.tar.gz
Algorithm Hash digest
SHA256 177ee9968e9da142407017816cc3fb08ab281b134f773a9359b6a4650a6c81f3
MD5 b72491d0e8085d6e5b6ca4527a44ba16
BLAKE2b-256 641f158975d2541effa30f0d7634542dce50e8280ab283e7efc8d221ebf8a949

See more details on using hashes here.

Provenance

The following attestation bundles were made for httpx_curl_cffi-0.1.5.tar.gz:

Publisher: release.yml on vgavro/httpx-curl-cffi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for httpx_curl_cffi-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 be414a97ac1f627693f4c8a8631f2852bb1c09456e61ff8ad996ad050a11fb53
MD5 51dc93aa5a4bbfb69ea8c2b285ed619f
BLAKE2b-256 6e1382039e3df58e0d52a6f82cc73d958400a2777d78c6cd6378c937a707afd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for httpx_curl_cffi-0.1.5-py3-none-any.whl:

Publisher: release.yml on vgavro/httpx-curl-cffi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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