Project Icon

curl-impersonate

精确模拟主流浏览器网络行为的curl增强版

curl-impersonate是curl的增强版本,能精确模仿Chrome、Edge、Safari和Firefox的TLS及HTTP握手过程。它既可作为命令行工具使用,也可作为库集成到其他项目中。通过修改TLS配置和HTTP/2设置,curl-impersonate使网络请求与真实浏览器表现一致,有效避开基于TLS和HTTP/2指纹的检测。该工具为开发者提供了一种绕过网站反爬虫机制的有效方法。

curl-impersonate Chrome Edge Firefox Safari

构建和测试 Docker镜像

这是curl的一个特殊版本,能够模仿四大主流浏览器:Chrome、Edge、Safari和Firefox。curl-impersonate能够执行与真实浏览器完全相同的TLS和HTTP握手。

curl-impersonate可以作为命令行工具使用,类似于常规的curl,也可以作为一个库集成使用,替代常规的libcurl。详见下方使用方法

为什么要这样做?

当你使用HTTP客户端访问TLS网站时,它首先会进行TLS握手。该握手的第一条消息称为Client Hello。大多数HTTP客户端和库产生的Client Hello消息与真实浏览器的差异很大。

如果服务器使用HTTP/2,除了TLS握手外,还会进行HTTP/2握手,交换各种设置。大多数HTTP客户端和库使用的设置也与任何真实浏览器的设置不同。

因此,一些网络服务使用TLS和HTTP握手来识别访问它们的客户端,然后为不同的客户端呈现不同的内容。这些方法分别被称为TLS指纹识别HTTP/2指纹识别。它们的广泛使用导致网络变得不那么开放、不那么私密,对特定的网络客户端也变得更加限制。

使用本仓库中修改后的curl,TLS和HTTP握手看起来完全像真实浏览器。

如何实现?

为了实现这一目标,对curl进行了大量修改以模仿浏览器。具体来说,需要进行以下修改:

  • 使用Firefox使用的TLS库nss编译curl,而不是OpenSSL。对于Chrome版本,则使用Google的TLS库BoringSSL进行编译。
  • 修改curl配置各种TLS扩展和SSL选项的方式。
  • 添加对新TLS扩展的支持。
  • 更改curl用于HTTP/2连接的设置。
  • 使用一些非默认标志运行curl,例如--ciphers--curves和一些-H头。

从网络角度来看,修改后的curl与真实浏览器完全相同。

完整的技术描述请参阅博客文章:第一部分第二部分

支持的浏览器

以下浏览器可以被模拟:

浏览器版本构建操作系统目标名称包装脚本
Chrome9999.0.4844.51Windows 10chrome99curl_chrome99
Chrome100100.0.4896.75Windows 10chrome100curl_chrome100
Chrome101101.0.4951.67Windows 10chrome101curl_chrome101
Chrome104104.0.5112.81Windows 10chrome104curl_chrome104
Chrome107107.0.5304.107Windows 10chrome107curl_chrome107
Chrome110110.0.5481.177Windows 10chrome110curl_chrome110
Chrome116116.0.5845.180Windows 10chrome116curl_chrome116
Chrome9999.0.4844.73Android 12chrome99_androidcurl_chrome99_android
Edge9999.0.1150.30Windows 10edge99curl_edge99
Edge101101.0.1210.47Windows 10edge101curl_edge101
Firefox91 ESR91.6.0esrWindows 10ff91esrcurl_ff91esr
Firefox9595.0.2Windows 10ff95curl_ff95
Firefox9898.0Windows 10ff98curl_ff98
Firefox100100.0Windows 10ff100curl_ff100
Firefox102102.0Windows 10ff102curl_ff102
Firefox109109.0Windows 10ff109curl_ff109
Firefox117117.0.1Windows 10ff117curl_ff117
Safari15.316612.4.9.1.8MacOS Big Sursafari15_3curl_safari15_3
Safari15.517613.2.7.1.8MacOS Montereysafari15_5curl_safari15_5

此列表也可在browsers.json文件中找到。

基本用法

对于每个支持的浏览器,都有一个包装脚本,可以使用所有必需的头部和标志来启动 curl-impersonate。例如:

curl_chrome116 https://www.wikipedia.org

您可以添加命令行标志,它们会被传递给 curl。但是,某些标志会改变 curl 的 TLS 签名,可能导致被检测到。

请注意,包装脚本使用默认的 HTTP 头部集。如果您想更改这些头部,可能需要修改包装脚本以适应您自己的目的。

有关更多选项,请参阅高级用法,包括将 libcurl-impersonate 作为库使用。

文档

更多文档可在 docs/ 目录中找到。

安装

由于技术原因,curl-impersonate 有两个版本。chrome 版本用于模仿 Chrome、Edge 和 Safari。firefox 版本用于模仿 Firefox。

预编译二进制文件

Linux 和 macOS(Intel)的预编译二进制文件可在 GitHub 发布页面 获取。 在使用它们之前,您需要安装 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

另外,请务必阅读依赖项说明

从源代码构建

请参阅 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

发行版包

Archlinux 用户可以使用 AUR 包:

Mac 的非官方 Homebrew 配方(仅限 Chrome)可在这里获取:

brew tap shakacode/brew
brew install curl-impersonate

高级用法

libcurl-impersonate

libcurl-impersonate.so 是使用与命令行 curl-impersonate 相同的更改编译的 libcurl。 它有一个额外的 API 函数:

CURLcode curl_easy_impersonate(struct Curl_easy *data, const char *target,
                               int default_headers);

您可以使用目标名称调用它,例如 chrome116,它会在内部设置所有选项和头部,这些选项和头部通常由包装脚本设置。 如果 default_headers 设置为 0,则不会设置内置的 HTTP 头部列表,而是期望用户使用常规的 CURLOPT_HTTPHEADER libcurl 选项提供它们。

调用上述函数会设置以下 libcurl 选项:

  • CURLOPT_HTTP_VERSION
  • CURLOPT_SSLVERSIONCURLOPT_SSL_CIPHER_LISTCURLOPT_SSL_EC_CURVESCURLOPT_SSL_ENABLE_NPNCURLOPT_SSL_ENABLE_ALPN
  • 如果 default_headers 非零,则设置 CURLOPT_HTTPBASEHEADER(这是为本项目创建的非标准 HTTP 选项)。
  • CURLOPT_HTTP2_PSEUDO_HEADERS_ORDERCURLOPT_HTTP2_NO_SERVER_PUSH(为本项目创建的非标准 HTTP/2 选项)。
  • CURLOPT_SSL_ENABLE_ALPSCURLOPT_SSL_SIG_HASH_ALGSCURLOPT_SSL_CERT_COMPRESSIONCURLOPT_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 设置。请改用包装脚本。

依赖项说明

如果您打算将自编译的工件复制到另一个系统,或使用项目提供的预编译二进制文件,请确保目标系统上也满足所有额外的依赖项。 特别是,请参阅关于 Firefox 版本的说明

内容

此仓库包含两个主要文件夹:

  • chrome - 用于构建 curl-impersonate Chrome 版本的脚本和补丁。
  • firefox - 用于构建 curl-impersonate Firefox 版本的脚本和补丁。

两者的布局相似。例如,Firefox 目录包含:

  • Dockerfile - 用于构建包含所有依赖项的 curl-impersonate
  • curl_ff91esrcurl_ff95curl_ff98 - 使用正确标志启动 curl-impersonate 的包装脚本。
  • curl-impersonate.patch - 主要补丁,使 curl 使用与 Firefox 相同的 TLS 扩展。还使 curl 与 libnghttp2 和 libnss 静态编译。

其他值得关注的文件:

贡献

如果你想提供帮助,请查看未解决的问题。你可以提交一个包含你的更改的拉取请求。

这个仓库包含 curl-impersonate 的构建过程。对 curl 的实际补丁维护在一个单独的仓库中,该仓库从上游 curl 分叉而来。这些更改维护在 impersonate-firefoximpersonate-chrome 分支中。

赞助商

赞助商帮助保持这个项目开放和维护。如果你想成为赞助商,请直接联系我:lwt at lwthiker dot com。

Logo
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号