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.
Install
pip install --upgrade curl_cffi
This should work for Linux(x86_64/aarch64), macOS(Intel), 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
For a list of supported impersonation versions, please check the curl-impersonate repo.
Or, 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/
from more examples.
API
Requests: almost the same as requests.
Curl object:
setopt(CurlOpt, value)
: Sets curl options as incurl_easy_setopt
perform()
: Performs curl request, as incurl_easy_perform
getinfo(CurlInfo)
: Gets information in response after curl perform, as incurl_easy_getinfo
close()
: Closes and cleans up the curl object, as incurl_easy_cleanup
Enum values to be used with setopt
and getinfo
can be accessed from CurlOpt
and CurlInfo
.
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) and Windows.
- Support musllinux(alpine) and macOS(Apple Silicon) 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.Session
. - Create ABI3 wheels to reduce package size and build time.
Acknowledgement
This package was originally forked from https://github.com/multippt/python_curl_cffi
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
Built Distributions
Hashes for curl_cffi-0.2.4-pp39-pypy39_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 59a09f3b76a1784fd3545ce49f28b3156dca8c107548a7fd18e53e4ac7e93258 |
|
MD5 | 416c8bbd2a96b75711b8758d3ab0e3cf |
|
BLAKE2b-256 | 87c8909a72be20afedc752975efe1660cde7e440d5f74d6ec2944c5dd32224dd |
Hashes for curl_cffi-0.2.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b1a6928897e40c62f3866cff51d81337c633b7203837a649bb0b4ebc5351dbd4 |
|
MD5 | da4daeae1a2f275040e47264205bf000 |
|
BLAKE2b-256 | 3d3e0bed4b80554e66222d04eff7efcbaf1ae550ef5c99a8b3d365341f8f511f |
Hashes for curl_cffi-0.2.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e61c0725414e46b64d19649478612e311641212820afc743b01005aa832bd747 |
|
MD5 | 7b19566ffe3cf83fb5ebd95c13753af8 |
|
BLAKE2b-256 | f2b7085556232d7af9162b9343bb779df2d193a940468559ece093bac4ce23fc |
Hashes for curl_cffi-0.2.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c9f722039877000c689f588396071dcbf92597e4892680a69fc1dbdcb7b7524 |
|
MD5 | 4a9b6796712c6140db1f53e72fb8a7c4 |
|
BLAKE2b-256 | 58deff98021a5834db5009cc960e35a8cf28a71372ffcca373eaca7de11fe7cf |
Hashes for curl_cffi-0.2.4-pp38-pypy38_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 59d46672f3fc1e63495decebcc8c5c351656e3f721ea3b70831a8ce0a853c979 |
|
MD5 | a478849d9dd049c5b7e9402ba53bb4de |
|
BLAKE2b-256 | e67be3ee4106a3bdfc73bd3d06eb873329451764e0e14f4794967a0ab8b4c22d |
Hashes for curl_cffi-0.2.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7c5552970aede1c7f57783c5f40736e42fb73b18f020d0ea1d473bc0996e174a |
|
MD5 | ab4c1f82389df5c4b25b6d53c109bfcc |
|
BLAKE2b-256 | f56b0f7372bbc2265254957e845985bb0bca72374cbb2cbd29777a35db583435 |
Hashes for curl_cffi-0.2.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 39370bd702d45222250dc710e34f4dfc226d66d104ef7be1aa6a63814578792f |
|
MD5 | 2107281de6487e05bcc135f6438bcc1d |
|
BLAKE2b-256 | c668db93250f775a24749499dc4a656cd704c4b190af2ca5c98e07c0b63f0360 |
Hashes for curl_cffi-0.2.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1c72cc0b0b20a39ea70d5e719cad2b0953346146c1cc3190c49eedd88ea1ed70 |
|
MD5 | f35d6ab7330e46b78f401c23511ec937 |
|
BLAKE2b-256 | 14119cf79d1d4484454a5933057dd414c6bd1e2ab77d5affc3f2b2984a50b851 |
Hashes for curl_cffi-0.2.4-pp37-pypy37_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c6643e10f610d3584c04cebbf59db54ac475fb9646eb6e343bc88f4a5d95e0d5 |
|
MD5 | 802ec7469c1798bee4e5d681ec2a4f83 |
|
BLAKE2b-256 | ffcd09273c5e5aceaf49ed87f4aa0a8264b9803ed9897cd799f7aa75f59a0496 |
Hashes for curl_cffi-0.2.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5f7b1db9aff422a85bf77d548da4fafc5bb1d5cb564857727cfe889d78ab6157 |
|
MD5 | 2d3dd326ab8b52dbd339a68338561b35 |
|
BLAKE2b-256 | 397f0ebd4b3780df2d3866aec865f0976e7bb060b0aa6987e4122efc6625f51b |
Hashes for curl_cffi-0.2.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a556814478be0d3e9098af071fe521230e5f9340a12d541ac7b2bc8153d63725 |
|
MD5 | 3b9bf1dba5f8bf704d1ded47c0b48b28 |
|
BLAKE2b-256 | f0815c75ef4192f46a0e5deceb9484185fc0e3631402b60969a70614a446d6d6 |
Hashes for curl_cffi-0.2.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f1c81ef65e01df59f9120155e0a3c918bd3f26d946a2fd5b5f7edc6e5a3f051f |
|
MD5 | 793c64a07fb662b9022cfc72e913d98d |
|
BLAKE2b-256 | f8d4cb5df8e0c99df2991270d13e22f4c8bbbba198fe966dc0a9a17a0c87c02b |
Hashes for curl_cffi-0.2.4-cp311-cp311-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b1d56864967baf6c95ef324aee048ffb6812cbcd3ff79a3d0308c255feb69944 |
|
MD5 | fc1085ebf1c5fe0fca5f7190374e13cd |
|
BLAKE2b-256 | a4b063d75455603e595e023ada01b91eb7d3432d2ec82f8a88989c1993e2d6ec |
Hashes for curl_cffi-0.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a0a902add8d05b5a361538182b2d6bf8a8f746b7fa88b1a69ccf67634e6e01b4 |
|
MD5 | 5571afe757610d9f3996bc4d7a261b01 |
|
BLAKE2b-256 | 50127e4babbb7860c87d0eda22a9194224030f7e72602d0c64c9258728ddc657 |
Hashes for curl_cffi-0.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d154098d835d54847b4b3f5952ece4d754b81bd6523fc8fdfc7a1276146d99fc |
|
MD5 | 2b0b681cea17c77a73c582af5f02644d |
|
BLAKE2b-256 | 5faac37d2fdbff5609c084cff78dea04f52da0f5a21d15ad7426a73369f37c19 |
Hashes for curl_cffi-0.2.4-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a0f52489c93266c5595cf9aaf6d4c407382b23cc1eb10813185accc0cf57ec51 |
|
MD5 | b7eca3f2fab392cfd40d09b85b6d10ee |
|
BLAKE2b-256 | aa116391cfb1ed36b47dbe25a30e65d34b77e48e6dfd8fea89c647dae38131eb |
Hashes for curl_cffi-0.2.4-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b1294055dc5debb8567ff5ce114842739962510f6661d4cfb772913df98cfb66 |
|
MD5 | 85fb70e1c18e7d0a8f964222ccfaa85b |
|
BLAKE2b-256 | 51710c08239e71b797754e9901a569217b64482c980b5af0270a7258cc388670 |
Hashes for curl_cffi-0.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d9cf802aa892722e67ba862d75dd7d6b9e123021efb0247b36093babef8a260a |
|
MD5 | c18ce1f7efa4f9a9a2e24f15dec72297 |
|
BLAKE2b-256 | 6c1c4a91fd8e06d379c20fb9b9fc7ce0fde8e20d34a43fb7988e5945ea30e275 |
Hashes for curl_cffi-0.2.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 89a0b7d089d1093d7d0b0a79e7e6bf5ffe358c03bc3de861629d1613e3d9ca54 |
|
MD5 | 1d504ba3a162cdde3c96bc949f0bfae7 |
|
BLAKE2b-256 | 72618fa68c7fd3adfd4ef46825ae29899cebe1f854956bb483e20644f128a2ea |
Hashes for curl_cffi-0.2.4-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e10daff76bdd01f42da08d362b1d2014804a95e2147c8650e876b47d0bd51601 |
|
MD5 | 1204a9c0499982583df1787f23fc11a9 |
|
BLAKE2b-256 | f60549754f86018f597103004b7efbdd0f320c272cc611cc338c3f2d20c78193 |
Hashes for curl_cffi-0.2.4-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9965727a786198d9a141df562e614aae410b41cfc8e15fcea6694edff7d35bfb |
|
MD5 | 08bd1794a0dd8307c99880e20c0c48de |
|
BLAKE2b-256 | 123cad4809ae62a46d946501dc458483accf29d342a36dd193100bf3406f3258 |
Hashes for curl_cffi-0.2.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 82599fab73a977280280532c8cc96c0da35d989960824232e5458c5efd1b587d |
|
MD5 | a3a4957c7f166d8b422a0bb13d4b088a |
|
BLAKE2b-256 | 36984176e10faaecba44da7f277c4d24e3c518455f22a9a17f48069d4fa9bc05 |
Hashes for curl_cffi-0.2.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 682d43a6078797b8c7799159f95738c954d67bbaf779d320764187290d46536e |
|
MD5 | ecbe166f08bc08bccea4988476008d62 |
|
BLAKE2b-256 | 55523685a9e33cdf302a824e77e8bb13fe56c4fbaa6b366b18a900e8510b231d |
Hashes for curl_cffi-0.2.4-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 964e1ffc4f1d10642e1082a55d1e1f26a269bb57d3b553356e28d43bedbbba05 |
|
MD5 | a0f33030a0ff3344f5db22c61d530fbb |
|
BLAKE2b-256 | c23a5d7b7124bba94dd254c5d149d014e5b973520b5602a99307a50d96fe83f6 |
Hashes for curl_cffi-0.2.4-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 43834298dca52f707aa0118d6dcfbef5ec1e2edd9ef8f691909af7c2905ddb5a |
|
MD5 | 3bc0038df2e45a0ddec35b1f59a0da95 |
|
BLAKE2b-256 | 6c38f96b781d9fdbf5b95c0a3640b3eae7859d6dc26f8055f7633fba8a3f63ad |
Hashes for curl_cffi-0.2.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9bb7d482c6127248a21c770655d925c011327be710feb73dd35e14ad8cccc078 |
|
MD5 | b741447a93b8df0792f2de2b9652a42d |
|
BLAKE2b-256 | fdf38a59008f2bf92466c4ab48c1c32b14d4ae6ea14ad18c6405bfda3df32521 |
Hashes for curl_cffi-0.2.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bd7061c031bc1871c207831e3e9083d58f6332139aa0308a79078dfe55b2fa24 |
|
MD5 | 9d6914b4c4344ca6b410f6e3f0d02895 |
|
BLAKE2b-256 | 179d88e117be9574470aec983e2b666eccd0c819e4797907f0ba8fef78586770 |
Hashes for curl_cffi-0.2.4-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bab3857e2a4e0ccd866ac0603e01e5864fbf0d990979990a846c02ca3c9ffd6c |
|
MD5 | ee09249b0adc99a2b7f6ab26c3d45f64 |
|
BLAKE2b-256 | 4ecdb652612f049e49c1757e3959a47e1898e122d8bf9c6a531b39d31d989f6a |
Hashes for curl_cffi-0.2.4-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f0349ae1a0b93477c648dd9f1a9d2f07da7719f209c12f3f2d8bf29250d94554 |
|
MD5 | fc938419581595d05d538c326f51fc67 |
|
BLAKE2b-256 | 0ed4edd7b51c15ef38dfbec747b3a9308259439dbae1e65f137c9c1d33eff5a2 |
Hashes for curl_cffi-0.2.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 85c1d16b04f101cbec46eb1fd0177d58d84eb13771912c2dcb23e6e794afff2b |
|
MD5 | 325a83697be961c3a626e107b805e2c5 |
|
BLAKE2b-256 | ff6216d1ae4ef1698a517fe8c548c58af707ec5d96e709b0ebd246c3da1b3b6b |
Hashes for curl_cffi-0.2.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ded27906081065e313d842ae68a70616922663bf3e9bc83bfffd4299e452d223 |
|
MD5 | 6c3f9978815db3eafb383ce71e372f29 |
|
BLAKE2b-256 | 6560333b4ff819fb398449368b3932ade07c8c251b14e0f4e117f34db607188f |
Hashes for curl_cffi-0.2.4-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ef12809c4c5b09e281ed24f0b49adf31b31915e9614cd1af0a4046ad7102652d |
|
MD5 | 63e3d91f098ca420a0f48bda2fec8149 |
|
BLAKE2b-256 | 56c3967b252180aa17202dd48d59a1bd3f0ff6584d608d3e775dc9d3f976fd4a |