forked from lexiforest/curl_cffi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprebuild.py
91 lines (79 loc) · 3.26 KB
/
prebuild.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from urllib.request import urlretrieve
import os
import platform
import sys
import shutil
import subprocess
uname = platform.uname()
VERSION="0.5.4"
CURL_VERSION="7.84.0"
CONST_FILE="curl_cffi/_const.py"
if uname.system == "Windows":
LIBDIR = "./lib"
elif uname.system == "Darwin" and uname.machine == "x86_64":
LIBDIR = "/Users/runner/work/_temp/install/lib"
else:
LIBDIR="/usr/local/lib"
def reporthook(blocknum, blocksize, totalsize):
readsofar = blocknum * blocksize
if totalsize > 0:
percent = readsofar * 1e2 / totalsize
s = "\r%5.1f%% %*d / %d" % (
percent, len(str(totalsize)), readsofar, totalsize)
sys.stderr.write(s)
if readsofar >= totalsize: # near the end
sys.stderr.write("\n")
else: # total size is unknown
sys.stderr.write("read %d\n" % (readsofar,))
print("Download firefox certs, see: https://curl.se/docs/caextract.html")
urlretrieve("https://curl.se/ca/cacert.pem", "curl_cffi/cacert.pem", reporthook)
if uname.system == "Darwin":
if uname.machine == "arm64":
# TODO Download my own build of libcurl-impersonate for M1 Mac
url = ""
filename = "./curl-impersonate.tar.gz"
else:
url = f"https://github.com/lwthiker/curl-impersonate/releases/download/v{VERSION}/libcurl-impersonate-v{VERSION}.{uname.machine}-macos.tar.gz"
filename = "./curl-impersonate.tar.gz"
elif uname.system == "Windows":
url = f"https://github.com/yifeikong/curl-impersonate-win/releases/download/v{VERSION}/curl-impersonate-chrome.tar.gz"
filename = "./curl-impersonate.tar.gz"
else:
url = f"https://github.com/lwthiker/curl-impersonate/releases/download/v{VERSION}/libcurl-impersonate-v{VERSION}.{uname.machine}-linux-gnu.tar.gz"
filename = "./curl-impersonate.tar.gz"
if os.path.exists(filename):
print("libcurl-impersonate already exists")
else:
print(f"Download libcurl-impersonate-chrome from {url}")
urlretrieve(url, filename, reporthook)
shutil.unpack_archive(filename, LIBDIR)
# TODO download curl automatically
if uname.system != "Windows":
print("extract consts from curl.h")
with open(CONST_FILE, "w") as f:
f.write("# This file is automatically generated, do not modify it directly.\n\n")
f.write("from enum import IntEnum\n\n\n")
f.write("class CurlOpt(IntEnum):\n")
cmd = r"""
echo '#include "curl_cffi/include/curl/curl.h"' | gcc -E - | grep -i "CURLOPT_.\+ =" | sed "s/ CURLOPT_/ /g" | sed "s/,//g"
"""
output = subprocess.check_output(cmd, shell=True)
f.write(output.decode())
f.write("""
if locals().get("WRITEDATA"):
FILE = locals().get("WRITEDATA")
if locals().get("READDATA"):
INFILE = locals().get("READDATA")
if locals().get("HEADERDATA"):
WRITEHEADER = locals().get("HEADERDATA")\n\n
""")
f.write("class CurlInfo(IntEnum):\n")
cmd = r"""
echo '#include "curl_cffi/include/curl/curl.h"' | gcc -E - | grep -i "CURLINFO_.\+ =" | sed "s/ CURLINFO_/ /g" | sed "s/,//g"
"""
output = subprocess.check_output(cmd, shell=True)
f.write(output.decode())
f.write("""
if locals().get("RESPONSE_CODE"):
HTTP_CODE = locals().get("RESPONSE_CODE")\n
""")