在现代互联网环境中,很多网站会基于客户端的 TLS 和 HTTP 指纹,限制特定类型的请求,或者干脆提供不同的内容展示。这种现象导致互联网变得越来越封闭,也让开发者在自动化测试和数据抓取中遇到了不小的麻烦。而这篇文章将向你介绍一款强大的工具------curl-impersonate,它能帮助你绕过这些限制,以主流浏览器的身份畅行网络。
为什么需要 curl-impersonate?
我们平时用的 curl 或大多数 HTTP 客户端在发起请求时,会经历两个重要的握手过程:
- TLS 握手:客户端通过 TLS 握手与服务器建立安全通信。
- HTTP/2 握手:如果服务器支持 HTTP/2,还会进行额外的协议配置。
这些握手中包含的信息,比如 Client Hello 报文、HTTP/2 设置帧,往往会暴露客户端的"身份"。一些网站正是通过这些信息对客户端进行指纹识别,并针对特定客户端限制访问或返回不同的内容。
传统的 curl 和大多数 HTTP 客户端的握手方式与真实浏览器有显著差异,这使得它们很容易被"认出来"。而 curl-impersonate 则通过模拟主流浏览器(如 Chrome、Edge 和 Safari)的握手行为,让请求看起来和真实的浏览器一模一样,从而绕过这些限制。
curl-impersonate 能做什么?
curl-impersonate 是经过特殊改造的 curl,它的功能可以分为两部分:
-
模拟浏览器行为
它能模拟主流浏览器(如 Chrome、Edge、Safari 和 Firefox)的 TLS 和 HTTP/2 握手行为,让请求看起来与真实浏览器没有差别。
-
适配不同版本的浏览器
curl-impersonate 提供了一系列封装脚本,支持模拟不同版本的浏览器,比如 Chrome 123、Safari 17.2 等。以下是支持的部分浏览器版本:
浏览器 | 版本号 | 操作系统 | 脚本名称 |
---|---|---|---|
Chrome | 123 | macOS Sonoma | curl_chrome123 |
Edge | 101 | Windows 10 | curl_edge101 |
Safari | 17.2 | iOS 17.2 | curl_safari17_2_ios |
如何使用 curl-impersonate?
curl-impersonate 的使用方式与普通 curl 类似,但你需要用它提供的封装脚本来启动。例如:
bash
curl_chrome116 https://www.wikipedia.org
如果你需要自定义请求参数,比如添加特定的 HTTP 头,可以直接附加到命令后:
bash
curl_chrome123 https://www.wikipedia.org -H "User-Agent: my-custom-agent"
注意:一些参数可能会改变 curl 的 TLS 签名,导致模拟失效,因此修改时需谨慎。
原理解析:curl-impersonate 如何实现浏览器模拟?
为了让请求行为逼近真实浏览器,curl-impersonate 对 curl 进行了以下改造:
-
使用 BoringSSL
BoringSSL 是谷歌维护的 TLS 库,被 Chrome 和 Safari 使用。curl-impersonate 将 curl 的底层 TLS 库替换为 BoringSSL,从而支持最新的 TLS 扩展。
-
修改 TLS 扩展和选项
- 支持新型 TLS 扩展(如 Encrypted Client Hello)。
- 修改 HTTP/2 设置帧的默认值和顺序,匹配浏览器行为。
-
新增 API 和环境变量支持
curl-impersonate 提供了
curl_easy_impersonate
API 和CURL_IMPERSONATE
环境变量,方便用户在代码中集成该功能。
以下是调用 curl_easy_impersonate
的代码示例:
c
#include <curl/curl.h>
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_impersonate(curl, "chrome123", 1);
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
安装 curl-impersonate
你可以通过以下方式安装 curl-impersonate:
-
使用预编译二进制文件
项目提供了适用于 Windows、Linux 和 macOS 的预编译文件,你可以从 GitHub Releases 页面 下载。
示例安装命令(以 Ubuntu 为例):
bashsudo apt install ca-certificates zstd libzstd-dev wget https://github.com/lexiforest/curl-impersonate/releases/download/v0.8.2/curl-impersonate-chrome.deb sudo dpkg -i curl-impersonate-chrome.deb
-
从源码构建
项目同时提供了详细的构建文档(见
INSTALL.md
),支持定制化编译。 -
使用 Docker 镜像
如果你想快速体验,可以直接拉取官方提供的 Docker 镜像:
bashdocker pull lwthiker/curl-impersonate:0.5-chrome docker run --rm lwthiker/curl-impersonate:0.5-chrome curl_chrome123 https://www.wikipedia.org
同类工具对比:curl-impersonate VS 常见选项
以下是 curl-impersonate 与其他常见 HTTP 客户端工具的对比:
工具 | 模拟浏览器能力 | TLS 指纹配置复杂度 | 操作简便性 |
---|---|---|---|
curl-impersonate | 高 | 中 | 简单 |
mitmproxy | 中 | 高 | 中等 |
Puppeteer | 高 | 无需配置 | 较简单 |
普通 curl | 低 | 无 | 简单 |
可以看出,curl-impersonate 在模拟能力和使用便捷性上具有明显优势,特别适合有浏览器指纹绕过需求的开发者。