Curl-impersonate: Special build of curl that can impersonate the major browsers
Curl-impersonate:可以模仿主流浏览器的特殊构建版 Curl
lwthiker/curl-impersonate
- Notifications You must be signed in to change notification settings
- Fork 323
- Star 4.5k
curl-impersonate: 可以模仿 Chrome 和 Firefox 的特殊构建版 Curl
License
lwthiker/curl-impersonate
目录和文件
| 名称 | 名称 | 最后提交信息 | 最后提交日期 | | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------- | | .github/workflows | .github/workflows | | | | chrome | chrome | | | | docs | docs | | | | firefox | firefox | | | | tests | tests | | | | Dockerfile.template | Dockerfile.template | | | | INSTALL.md | INSTALL.md | | | | LICENSE | LICENSE | | | | Makefile.in | Makefile.in | | | | README.md | README.md | | | | browsers.json | browsers.json | | | | config.guess | config.guess | | | | config.sub | config.sub | | | | configure | configure | | | | configure.ac | configure.ac | | | | generate_dockerfiles.sh | generate_dockerfiles.sh | | |
最新提交
历史记录
Repository files navigation
curl-impersonate

一个特殊的 curl 构建版本,可以模仿四个主要浏览器:Chrome、Edge、Safari 和 Firefox。curl-impersonate 能够执行与真实浏览器相同的 TLS 和 HTTP 握手。
curl-impersonate 可以用作命令行工具(类似于常规 curl),也可以作为库集成来代替常规的 libcurl。请参阅下面的 Usage。
为什么?
当你使用 HTTP 客户端与 TLS 网站通信时,它首先执行 TLS 握手。该握手的第一个消息称为 Client Hello。大多数 HTTP 客户端和库生成的 Client Hello 消息与真实浏览器的消息差异很大。
如果服务器使用 HTTP/2,那么除了 TLS 握手之外,还有一个 HTTP/2 握手,其中交换各种设置。大多数 HTTP 客户端和库使用的设置也与任何真实浏览器的设置不同。
由于这些原因,一些 Web 服务使用 TLS 和 HTTP 握手来识别访问它们的客户端,然后为不同的客户端呈现不同的内容。这些方法被称为 TLS 指纹识别 和 HTTP/2 指纹识别。它们的广泛使用导致 Web 变得不那么开放、不那么私密,并且对特定 Web 客户端的限制更多。
使用此存储库中修改后的 curl,TLS 和 HTTP 握手看起来 exactly 像真实浏览器。
如何实现?
为了实现这一点,curl 进行了大量修改以类似于浏览器。具体来说,使之工作所需的修改:
- 使用 nss(Firefox 使用的 TLS 库)而不是 OpenSSL 编译 curl。对于 Chrome 版本,使用 Google 的 TLS 库 BoringSSL 编译。
- 修改 curl 配置各种 TLS 扩展和 SSL 选项的方式。
- 添加对新 TLS 扩展的支持。
- 更改 curl 用于其 HTTP/2 连接的设置。
- 使用一些非默认标志运行 curl,例如
--ciphers、--curves和一些-H标头。
从网络角度来看,生成的 curl 看起来与真实浏览器相同。
支持的浏览器
可以模拟以下浏览器。
| 浏览器 | 版本 | 构建版本 | 操作系统 | 目标名称 | 封装脚本 |
| ------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | ------------ | -------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| 99 | 99.0.4844.51 | Windows 10 | chrome99 | curl_chrome99 |
|
| 100 | 100.0.4896.75 | Windows 10 | chrome100 | curl_chrome100 |
|
| 101 | 101.0.4951.67 | Windows 10 | chrome101 | curl_chrome101 |
|
| 104 | 104.0.5112.81 | Windows 10 | chrome104 | curl_chrome104 |
|
| 107 | 107.0.5304.107 | Windows 10 | chrome107 | curl_chrome107 |
|
| 110 | 110.0.5481.177 | Windows 10 | chrome110 | curl_chrome110 |
|
| 116 | 116.0.5845.180 | Windows 10 | chrome116 | curl_chrome116 |
|
| 99 | 99.0.4844.73 | Android 12 | chrome99_android | curl_chrome99_android |
|
| 99 | 99.0.1150.30 | Windows 10 | edge99 | curl_edge99 |
|
| 101 | 101.0.1210.47 | Windows 10 | edge101 | curl_edge101 |
|
| 91 ESR | 91.6.0esr | Windows 10 | ff91esr | curl_ff91esr |
|
| 95 | 95.0.2 | Windows 10 | ff95 | curl_ff95 |
|
| 98 | 98.0 | Windows 10 | ff98 | curl_ff98 |
|
| 100 | 100.0 | Windows 10 | ff100 | curl_ff100 |
|
| 102 | 102.0 | Windows 10 | ff102 | curl_ff102 |
|
| 109 | 109.0 | Windows 10 | ff109 | curl_ff109 |
|
| 117 | 117.0.1 | Windows 10 | ff117 | curl_ff117 |
|
| 15.3 | 16612.4.9.1.8 | MacOS Big Sur | safari15_3 | curl_safari15_3 |
|
| 15.5 | 17613.2.7.1.8 | MacOS Monterey | safari15_5 | curl_safari15_5 |
此列表也可在 browsers.json 文件中找到。
基本用法
对于每个受支持的浏览器,都有一个封装脚本,它使用所有需要的标头和标志启动 curl-impersonate。例如:
curl_chrome116 https://www.wikipedia.org
你可以添加命令行标志,它们将传递给 curl。但是,某些标志会更改 curl 的 TLS 签名,这可能会导致它被检测到。
请注意,封装脚本使用一组默认的 HTTP 标头。如果你想更改这些标头,你可能需要修改封装脚本以适合你自己的目的。
有关更多选项,包括将 libcurl-impersonate 用作库,请参阅 Advanced usage。
文档
更多文档可在 docs/ 目录中找到。
安装
由于技术原因,curl-impersonate 有两个版本。chrome 版本用于模拟 Chrome、Edge 和 Safari。firefox 版本用于模拟 Firefox。
预编译的二进制文件
Linux 和 macOS (Intel) 的预编译二进制文件可在 GitHub releases 页面上找到。在使用它们之前,你需要安装 nss(Firefox 的 TLS 库)和 CA 证书:
- Ubuntu -
sudo apt install libnss3 nss-plugin-pem ca-certificates - Red Hat/Fedora/CentOS -
yum install nss nss-pem ca-certificates - Archlinux -
pacman -S nss ca-certificates - macOS -
brew install nss ca-certificates
另请确保你的系统上安装了 zlib。zlib 几乎总是存在,但在某些最小系统中可能缺少它。
预编译的二进制文件包含 libcurl-impersonate 和一个静态编译的 curl-impersonate,以便于使用。
预编译的 Linux 二进制文件是为 Ubuntu 系统构建的。在其他发行版上,如果你在证书验证方面遇到错误,你可能必须告诉 curl 在哪里可以找到 CA 证书。例如:
curl_chrome116 https://www.wikipedia.org --cacert /etc/ssl/certs/ca-bundle.crt
另请务必阅读 Notes on Dependencies。
从源代码构建
请参阅 INSTALL.md。
Docker 镜像
基于 Alpine Linux 和 Debian 的 Docker 镜像,其中 curl-impersonate 已编译并准备好使用,可在 Docker Hub 上找到。这些镜像包含二进制文件和所有封装脚本。使用方法如下:
# Firefox 版本, Alpine Linux
docker pull lwthiker/curl-impersonate:0.6-ff
docker run --rm lwthiker/curl-impersonate:0.6-ff curl_ff109 https://www.wikipedia.org
# Chrome 版本, Alpine Linux
docker pull lwthiker/curl-impersonate:0.6-chrome
docker run --rm lwthiker/curl-impersonate:0.6-chrome curl_chrome110 https://www.wikipedia.org
发行版软件包
AUR 软件包可供 Archlinux 用户使用:
- 预编译软件包:curl-impersonate-bin, libcurl-impersonate-bin.
- 从源代码构建:curl-impersonate-chrome, curl-impersonate-firefox.
Mac 的非官方 Homebrew 配方(仅限 Chrome)可在此处获得:here:
brew tap shakacode/brew
brew install curl-impersonate
高级用法
libcurl-impersonate
libcurl-impersonate.so 是 libcurl,它使用与命令行 curl-impersonate 相同的更改进行编译。它有一个额外的 API 函数:
CURLcode curl_easy_impersonate(struct Curl_easy *data, const char *target,
int default_headers);
你可以使用目标名称(例如 chrome116)调用它,它将在内部设置所有选项和标头,否则这些选项和标头将由封装脚本设置。如果 default_headers 设置为 0,则不会设置内置的 HTTP 标头列表,并且用户应使用常规的 CURLOPT_HTTPHEADER (https://curl.se/libcurl/c/CURLOPT_HTTPHEADER.html) libcurl 选项来提供它们。
调用上述函数会设置以下 libcurl 选项:
CURLOPT_HTTP_VERSIONCURLOPT_SSLVERSION,CURLOPT_SSL_CIPHER_LIST,CURLOPT_SSL_EC_CURVES,CURLOPT_SSL_ENABLE_NPN,CURLOPT_SSL_ENABLE_ALPNCURLOPT_HTTPBASEHEADER,如果default_headers非零(这是为此项目创建的非标准 HTTP 选项)。CURLOPT_HTTP2_PSEUDO_HEADERS_ORDER,CURLOPT_HTTP2_NO_SERVER_PUSH(为此项目创建的非标准 HTTP/2 选项)。CURLOPT_SSL_ENABLE_ALPS,CURLOPT_SSL_SIG_HASH_ALGS,CURLOPT_SSL_CERT_COMPRESSION,CURLOPT_SSL_ENABLE_TICKET(为此项目创建的非标准 TLS 选项)。CURLOPT_SSL_PERMUTE_EXTENSIONS(为此项目创建的非标准 TLS 选项)。 请注意,如果你稍后使用上述选项之一调用curl_easy_setopt(),它将覆盖curl_easy_impersonate()设置的选项。
使用 CURL_IMPERSONATE 环境变量
如果你的应用程序已经使用了 libcurl,你可以在运行时使用 LD_PRELOAD(仅限 Linux)替换现有库。然后,你可以设置 CURL_IMPERSONATE 环境变量。例如:
LD_PRELOAD=/path/to/libcurl-impersonate.so CURL_IMPERSONATE=chrome116 my_app
CURL_IMPERSONATE 环境变量有两个作用:
- 对于
curl_easy_init()创建的任何新 curl 句柄,都会自动调用curl_easy_impersonate()。 - 在任何
curl_easy_reset()调用之后,都会自动调用curl_easy_impersonate()。
这意味着将自动为任何 curl 句柄设置模拟所需的所有选项。
如果你需要精确控制 HTTP 标头,请设置 CURL_IMPERSONATE_HEADERS=no 以禁用内置的 HTTP 标头列表,然后使用 curl_easy_setopt() 自己设置它们。例如:
LD_PRELOAD=/path/to/libcurl-impersonate.so CURL_IMPERSONATE=chrome116 CURL_IMPERSONATE_HEADERS=no my_app
请注意,LD_PRELOAD 方法不适用于 curl 本身,因为 curl 工具会覆盖 TLS 设置。请改用封装脚本。
关于依赖项的说明
如果你打算