分享到微信

当前解读页的微信分享二维码

用微信扫一扫打开,点击右上角「···」分享给朋友或朋友圈。

手机上可截屏后,在微信扫一扫中从相册识别二维码。

chris124567/cfsolve

安全

用 Rust 在没有无头浏览器的情况下求解 Cloudflare Turnstile 组件和挑战页。

229
28
Rust
MIT
创建于 5 天前

cfsolve 是一个 Rust 库兼命令行工具,目标是 Cloudflare 的 Turnstile 组件和拦截式挑战页,产出 Turnstile token 或 cf_clearance cookie。它不驱动真实浏览器,而是重放一份录制的浏览器身份,因此最终拿到的是你自己后续要复用的凭证。

产出什么、怎么做到

求解 Turnstile 组件时,提供页面 URL、sitekey,可选提供页面 HTML,得到 token。处理挑战页时,它抓取(或接收)页面,返回 Clearance,其中包含 cf_clearance cookie、该页全部 cookie 以及受保护页面的 HTML。不确定 URL 是哪种情况时,合并的 solve 调用两种都能处理。

关键机制是通过 profile 文件模拟浏览器。自带 profiles/safari-26-ios.json(iPhone 上的 Safari),其中引用若干录制的、对 Cloudflare 浏览器检测的响应目录。README 说明仅支持 Safari 和 Chrome(ium) 两类 profile,制作新的 profile 数据需要人工投入,不过可以用 capture proxy 从真实浏览器录制载荷。这意味着自带 profile 只是起点,不是万能身份。

使用方式

命令行需要一个页面 URL、一个存放全部请求/响应的输出目录(必须为空或不存在),以及 --fingerprint 指定的 profile。同页有多个组件时可用 sitekey 选择,若站点设置了 action 和 cData 也需一并给出;--blank-page 覆盖只有 sitekey 的情况。代理支持 HTTP、HTTPS、SOCKS5、SOCKS5H 地址。

库以 path 依赖方式引入;default-features = false 只编译求解器;需把 [patch] 段复制到你的顶层 Cargo.toml,指向 vendor 中的 btls-sys、wreq 和 http2。Browser 加载一次并共享即可,并发操作各有自己的连接和 cookie。构建需要 rust-toolchain.toml 指定的 Rust 版本,以及 CMake、C/C++ 编译器、libclang 和 Git。

决定是否适用的条件

  • 返回的 cf_clearance cookie 必须用与 profile 相同的 IP 和 user agent 发送,否则 Cloudflare 会拒绝。换代理即失效。
  • 错误分类型且部分可重试:Rejected、Challenged、Network 标为可重试;Blocked、NotChallenged、Config、Unsupported 不可重试。Unsupported 涵盖新的挑战版本或页面无组件,这正是失效时的典型形态。
  • 作者在 HN 评论中称,有用户反馈欧洲代理失败而美国代理可用,怀疑不同地区下发不同版本,并表示会修复;作者也指出 Cloudflare 一直在变。应把它视为持续的对抗维护,而非固定能力。
  • 许可证为 MIT,但 vendor/ 中打过补丁的依赖各自保留原有许可证。

HotRepo 点评

在 2026-10-31 的单次观察中,项目累计 177 星、位列新项目榜第 27;HN 帖子获 121 分、31 条评论。评论中有对规模的质疑:有人称单次绕过不难,难的是持续大规模运行,因为 Cloudflare 会分析整个网络的行为模式。这是观点而非测量结果,但与作者自述的地区性失败相呼应。

项目源码与说明

本文由 AI 根据项目 README 生成,更新于 2026年10月31日,以项目官方文档为准。

Hacker News 讨论

Cloudflare Turnstile solver library (no headless browser required)
▲ 121 · 31 条评论 · 2026年10月28日