有亿点点写不动。


哪怕你是个写了几年爬虫的老司机,碰到 hCaptcha 大概率也得心里暗骂一句。
在现在的验证码圈子里,这货绝对算得上是“天花板”级别的钉子户。动态 JS 混淆、WASM 黑盒加密、再加上变态的浏览器指纹检测和每天更新的验证码图片,一套组合拳下来,直接把不少靠开源框架“一把梭”的脚本小子劝退了。
今天不整那些虚的理论,咱直接用大白话聊聊,这玩意儿到底恶心在哪?业内大佬们又是怎么把它玩弄于股掌之间的。
一、拆解这货的“老底”:它在后台偷偷干嘛?
平时咱们抓包看 hCaptcha,最核心的其实就三个接口。看懂了这三个,你就摸清了它的套路:
-
/checksiteconfig
这是它的“前哨站”。你一进页面,它先偷偷摸摸测一下你这个站点的配置,顺便给你搞个初筛。如果觉得你像个好人,可能就让你无感通过了;如果觉得你不对劲,对不起,准备做题吧(这里好像不太对,这是初始化配置)。
-
/getcaptcha
一旦决定考验你,这个接口就会去拉取题目。这时候最恶心的地方来了:你在发请求的同时,前端会打包一堆极度复杂的浏览器环境指纹传过去。要是被它发现你用了 Puppeteer 或者自动化工具有改写痕迹,你连题目长啥样都见不到。
-
/checkcaptcha
最后一步,提交你的答题结果。这里面除了你点图的坐标,还塞了一个用前端硬加密生成的参数(比如 n 值或者 motion-data 鼠标轨迹)。服务器看你顺眼了,才会把最终的 Token 赏给你。
二、聊聊它的几大“毒点”:为什么这么难啃?
很多新手喜欢用“老三样”——全局搜索、扣 JS 逆向 去硬怼,结果往往是进去就出不来。因为它设了三个非常阴险的坎:
1. 搞个 hsw.js 还不够,里面居然藏了 WASM,并且轨迹包含一个 vm_data 参数算是一个 VMP,特殊版本还藏着一个 VMP,在 103 大数组中
hCaptcha 的加密逻辑全都在动态加载的 hsw.js 里面。
最搞人心态的是,它不光代码混淆得亲妈不认,里面还塞了 WebAssembly (WASM)。这意味着最核心的加密算法(比如那个要命的 n 参数)是在一个编译好的“黑盒”里运行的。你想纯靠看 JS 逻辑去还原算法?基本属于自闭行为。
2. 堪称“反侦察机”的指纹检测
现在的爬虫指纹,它基本上全家桶式地扫一遍:
- 硬件渲染:Canvas、WebGL 特征。
- 声音特征:AudioContext 各种参数。
- 自动化痕迹:不光查
window.navigator.webdriver,连各种改写函数的细微马脚都能揪出来。
只要你露出一丝“非人类”的气息,直接送你进小黑屋。
3. 连你手抖不抖它都要管(motion-data)
你以为把图片认出来就完事了?
hCaptcha 会盯着你鼠标的移动速度、加速度、滑动的曲线。如果你用脚本画一条笔直的死线拉过去,或者点击的间隔精准得像个无情机器,那对不起,图片全对也得重来。
三、那么,业内都是怎么破局的?
被恶心了这么久,大牛们也摸索出了不同的解题思路。目前主流就这三个流派,大家各显神通:
-
流派一:RPC 远程调用(俗称“借鸡生蛋”)
怎么玩:直接在真浏览器里挂个油猴脚本或者扩展,当脚本需要加密参数时,直接让浏览器里的原版 hsw 函数帮你算,算完传回来。
大实话:属于降维打击。不用管指纹和算法,开发贼快。缺点是并发太低,很吃内存,没办法大规模跑。
-
流派二:Node.js 强行补环境(这个方案也可以,我第一个版本就是 Node 全通杀包括 Steam 嘎嘎无感,但是维护也麻烦,一两周维护一次,已废弃,不想维护了)
怎么玩:把 hsw.js 和 WASM 抠出来拿 Node 跑。既然它要查浏览器环境,那咱们就用 Proxy 疯狂伪造 window、document、navigator。
大实话:能跑并发,不用开浏览器。但缺点是太卷了。官方隔三差五加个指纹检测点,你就要跟着天天熬夜修补环境代码。
-
流派三:纯算法硬啃(天花板级别)(目前这个方案我觉得不太可行,复杂度太高,当前是 vm_data 更新频繁,hsw 更新频繁)
怎么玩:用 AST(抽象语法树)反混淆 JS,再把 WASM 吐成 C 语言硬看底层逻辑,纯手撕算法。
大实话:运行速度飞快,并发拉满。但开发成本和技术门槛极高,非顶级逆向大牛一般不轻易碰,性价比太低。
🚬 行业潜规则:
如果是商业项目赶进度,绝大多数团队根本不会花几个月去硬磕这个。大家都是直接对接第三方打码平台,花点小钱直接调 API 拿 Token,把精力留给核心业务。但是目前为止第三方也拉胯,但凡遇到检测强度高一些的。
四、写在最后
说白了,验证码攻防就是一场搞心态的成本博弈。防守方拼命拉高门槛让你知难而退,而爬虫则是在时间、高并发和防检测之间找平衡。
你在搞 hCaptcha 的时候,被哪一步卡得最难受?是 WASM 算法看不懂,还是鼠标轨迹总被识别?
五、实战案例
案例一:
https://store.steampowered.com/join/?redir=about%2F

案例二:
https://help.steampowered.com/zh-cn/wizard/HelpWithLoginInfo?issueid=406

案例三:
https://discord.com/login

案例四:
https://accounts.evernote.com/login-with-password

案例五:

|