chris124567/cfsolve
安全用 Rust 在没有无头浏览器的情况下求解 Cloudflare Turnstile 组件和挑战页。
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_clearancecookie 必须用与 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日,以项目官方文档为准。