Skip to main content

libcurl ffi bindings for Python, with impersonation support

Project description

curl_cffi

Python binding for curl-impersonate via CFFI.

中文文档

Unlike other pure python http clients like httpx or requests, this package can impersonate browsers' TLS signatures or JA3 fingerprints. If you are blocked by some website for no obvious reason, you can give this package a try.

Note on Chrome 110+ JA3 fingerprints

Chrome introduces ClientHello permutation in version 110, which means the order of extensions will be random, thus JA3 fingerprints will be random. So, when comparing JA3 fingerprints of curl_cffi and a browser, they may differ. However, this does not mean that TLS fingerprints will not be a problem, ClientHello extension order is just one factor of how servers can tell automated requests from browsers.

See more from this article and curl-impersonate notes

Install

pip install --upgrade curl_cffi

This should work for Linux(x86_64/aarch64), macOS(Intel/Apple Silicon), Windows(amd64). If it does not work, you may need to compile and install curl-impersonate first.

Usage

requests/httpx-like API:

from curl_cffi import requests

# Notice the impersonate parameter
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome101")

print(r.json())
# output: {'ja3_hash': '53ff64ddf993ca882b70e1c82af5da49'
# the fingerprint should be the same as target browser

# proxies are supported
proxies = {"https": "http://localhost:3128"}
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome101", proxies=proxies)

# socks proxies are also supported
proxies = {"https": "socks://localhost:3128"}
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome101", proxies=proxies)

Sessions

# sessions are supported
s = requests.Session()
# httpbin is a http test website
s.get("https://httpbin.org/cookies/set/foo/bar")
print(s.cookies)
# <Cookies[<Cookie foo=bar for httpbin.org />]>
r = s.get("https://httpbin.org/cookies")
print(r.json())
# {'cookies': {'foo': 'bar'}}

Supported impersonate versions:

  • chrome99
  • chrome100
  • chrome101
  • chrome104
  • chrome107
  • chrome110
  • chrome99_android
  • edge99
  • edge101
  • safari15_3
  • safari15_5

Alternatively, you can use the low-level curl-like API:

from curl_cffi import Curl, CurlOpt
from io import BytesIO

buffer = BytesIO()
c = Curl()
c.setopt(CurlOpt.URL, b'https://tls.browserleaks.com/json')
c.setopt(CurlOpt.WRITEDATA, buffer)

c.impersonate("chrome101")

c.perform()
c.close()
body = buffer.getvalue()
print(body.decode())

See example.py or tests/ for more examples.

API

Requests: almost the same as requests.

Curl object:

  • setopt(CurlOpt, value): Sets curl options as in curl_easy_setopt
  • perform(): Performs curl request, as in curl_easy_perform
  • getinfo(CurlInfo): Gets information in response after curl perform, as in curl_easy_getinfo
  • close(): Closes and cleans up the curl object, as in curl_easy_cleanup

Enum values to be used with setopt and getinfo, and can be accessed from CurlOpt and CurlInfo.

Trouble Shooting

Pyinstaller ModuleNotFoundError: No module named '_cffi_backend'

You need to tell pyinstaller to pack cffi and data files inside the package:

pyinstaller -F .\example.py --hidden-import=_cffi_backend --collect-all curl_cffi

Using https proxy, error: OPENSSL_internal:WRONG_VERSION_NUMBER

You are messing up https-over-http proxy and https-over-https proxy, for most cases, you should change {"https": "https://localhost:3128"} to {"https": "http://localhost:3128"}. Note the protocol in the url for https proxy is http not https.

See this issue for a detailed explaination.

Current Status

This implementation is very hacky now, but it works for most common systems.

When people installing other python curl bindings, like pycurl, they often face compiling issues or OpenSSL issues, so I really hope that this package can be distributed as a compiled binary package, uses would be able to use it by a simple pip install, no more compile errors.

For now, I just download the pre-compiled libcurl-impersonate from github and build a bdist wheel, which is a binary package format used by PyPI, and upload it. However, the right way is to download curl and curl-impersonate sources on our side and compile them all together.

Help wanted!

TODOs:

  • Write docs.
  • Binary package for macOS(Intel/AppleSilicon) and Windows.
  • Support musllinux(alpine) bdist by building from source.
  • Exclude the curl headers from source, download them when building.
  • Update curl header files and constants via scripts.
  • Implement requests.Session/httpx.Client.
  • Create ABI3 wheels to reduce package size and build time.
  • Set default headers as in curl-impersonate wrapper scripts.

Change Log

  • 0.3.6

    • Updated to curl-impersonate v0.5.4, supported chrome107 and chrome110
  • 0.3.0, copied more code from httpx to support session

    • Add requests.Session
    • Breaking change: Response.cookies changed from http.cookies.SimpleCookie to curl_cffi.requests.Cookies
    • Using ABI3 wheels to reduce package size.

Acknowledgement

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

curl_cffi-0.4.0.tar.gz (75.2 kB view details)

Uploaded Source

Built Distributions

curl_cffi-0.4.0-cp37-abi3-win_amd64.whl (2.6 MB view details)

Uploaded CPython 3.7+Windows x86-64

curl_cffi-0.4.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.2 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ x86-64

curl_cffi-0.4.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.9 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARM64

curl_cffi-0.4.0-cp37-abi3-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.7+macOS 11.0+ ARM64

curl_cffi-0.4.0-cp37-abi3-macosx_10_9_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.7+macOS 10.9+ x86-64

File details

Details for the file curl_cffi-0.4.0.tar.gz.

File metadata

  • Download URL: curl_cffi-0.4.0.tar.gz
  • Upload date:
  • Size: 75.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for curl_cffi-0.4.0.tar.gz
Algorithm Hash digest
SHA256 625957fd6d995767cf0d9cedabbf64a26498c265efca9368aeca90a2de4778e1
MD5 aa7c9247398cdad2d2c0b1faf0a5c9ce
BLAKE2b-256 339fef07f1c1348a7e2dd76be39fb534095014684a98cc64cb696c74cfcf5344

See more details on using hashes here.

File details

Details for the file curl_cffi-0.4.0-cp37-abi3-win_amd64.whl.

File metadata

  • Download URL: curl_cffi-0.4.0-cp37-abi3-win_amd64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.7+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for curl_cffi-0.4.0-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 eda00f9db6200b76ee0c77ec536882515248b686a3176706b9f52128a2b599fa
MD5 2df4397424543a5e9c72e0f43a5ea49b
BLAKE2b-256 10cc07432b67f33e73648dbfba4d5f70226a60a9a977e363ca082f690f0fdcac

See more details on using hashes here.

File details

Details for the file curl_cffi-0.4.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.4.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 667287c0f6b2c19f9562ca57ba66c604383dfdfc6168888a434e3e70912a0509
MD5 956b13470572260cde94db668f7ca6f1
BLAKE2b-256 f5c62e7f3805e8e04ef5aebdc2484b8820802c1d1a2f2866cef19b8a173f0563

See more details on using hashes here.

File details

Details for the file curl_cffi-0.4.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.4.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 368f1e6ca39c980326d716439f74862256e62496f5b9d808952fcf58b1bb3026
MD5 655462c9cf244f3f2053a87d240a4991
BLAKE2b-256 5e2ac96388853b190efd6ecd8a3229601064b45c93c9aa62ead27e5b6690a793

See more details on using hashes here.

File details

Details for the file curl_cffi-0.4.0-cp37-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.4.0-cp37-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cf17706c5b4c4796ea34b2a9a651dbdd262f2d033e8ed9dbcdeb525642546b28
MD5 23d5c6713571f272671adc2255cc56bc
BLAKE2b-256 fd31f8d65efe79307e5099ad68eb2f491beef6ccb880ce981dc93da9a1515664

See more details on using hashes here.

File details

Details for the file curl_cffi-0.4.0-cp37-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.4.0-cp37-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f2bb857be6cc1a5c75e613c83d6c83c002baef2da9c9101663d2d3cc667136da
MD5 76f0ee516ad4e179d172abfecb5125bb
BLAKE2b-256 e41c4e70d626530f750c18808545f262831ebdc9930831e7f0a49aa99471693e

See more details on using hashes here.

Supported by

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