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_VERSION
CURLOPT_SSLVERSION
,CURLOPT_SSL_CIPHER_LIST
,CURLOPT_SSL_EC_CURVES
,CURLOPT_SSL_ENABLE_NPN
,CURLOPT_SSL_ENABLE_ALPN
CURLOPT_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 设置。请改用封装脚本。
关于依赖项的说明
如果你打算