Curl-impersonate:可以模仿主流浏览器的特殊构建版 Curl

lwthiker/curl-impersonate

curl-impersonate: 可以模仿 Chrome 和 Firefox 的特殊构建版 Curl

License

MIT license

4.5k stars 323 forks

lwthiker/curl-impersonate

Branches Tags

目录和文件

| 名称 | 名称 | 最后提交信息 | 最后提交日期 | | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------- | | .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 | | |

最新提交

历史记录

270 Commits

Repository files navigation

curl-impersonate Chrome Edge Firefox Safari

Build and test Docker images

一个特殊的 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 进行了大量修改以类似于浏览器。具体来说,使之工作所需的修改:

从网络角度来看,生成的 curl 看起来与真实浏览器相同。

阅读博客文章中的完整技术说明:part apart b

支持的浏览器

可以模拟以下浏览器。

| 浏览器 | 版本 | 构建版本 | 操作系统 | 目标名称 | 封装脚本 | | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | ------------ | -------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Chrome | 99 | 99.0.4844.51 | Windows 10 | chrome99 | curl_chrome99 | | Chrome | 100 | 100.0.4896.75 | Windows 10 | chrome100 | curl_chrome100 | | Chrome | 101 | 101.0.4951.67 | Windows 10 | chrome101 | curl_chrome101 | | Chrome | 104 | 104.0.5112.81 | Windows 10 | chrome104 | curl_chrome104 | | Chrome | 107 | 107.0.5304.107 | Windows 10 | chrome107 | curl_chrome107 | | Chrome | 110 | 110.0.5481.177 | Windows 10 | chrome110 | curl_chrome110 | | Chrome | 116 | 116.0.5845.180 | Windows 10 | chrome116 | curl_chrome116 | | Chrome | 99 | 99.0.4844.73 | Android 12 | chrome99_android | curl_chrome99_android | | Edge | 99 | 99.0.1150.30 | Windows 10 | edge99 | curl_edge99 | | Edge | 101 | 101.0.1210.47 | Windows 10 | edge101 | curl_edge101 | | Firefox | 91 ESR | 91.6.0esr | Windows 10 | ff91esr | curl_ff91esr | | Firefox | 95 | 95.0.2 | Windows 10 | ff95 | curl_ff95 | | Firefox | 98 | 98.0 | Windows 10 | ff98 | curl_ff98 | | Firefox | 100 | 100.0 | Windows 10 | ff100 | curl_ff100 | | Firefox | 102 | 102.0 | Windows 10 | ff102 | curl_ff102 | | Firefox | 109 | 109.0 | Windows 10 | ff109 | curl_ff109 | | Firefox | 117 | 117.0.1 | Windows 10 | ff117 | curl_ff117 | | Safari | 15.3 | 16612.4.9.1.8 | MacOS Big Sur | safari15_3 | curl_safari15_3 | | Safari | 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 证书:

另请确保你的系统上安装了 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 用户使用:

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 选项:

使用 CURL_IMPERSONATE 环境变量

如果你的应用程序已经使用了 libcurl,你可以在运行时使用 LD_PRELOAD(仅限 Linux)替换现有库。然后,你可以设置 CURL_IMPERSONATE 环境变量。例如:

LD_PRELOAD=/path/to/libcurl-impersonate.so CURL_IMPERSONATE=chrome116 my_app

CURL_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 设置。请改用封装脚本。

关于依赖项的说明

如果你打算