Puppeteer 验证码识别工具:适用于 Node.js 和 puppeteer-extra
保留 puppeteer-extra-plugin-recaptcha 原样不动,或者 await capskip npm 客户端,无头 Chrome 就能拿到 reCAPTCHA、Turnstile、极验(GeeTest)v3 或扭曲文字图片的答案,全部在你自己的电脑上识别,不按页面计量。
- 兼容 puppeteer-extra
- 基于 Promise 的 npm 客户端
- 无头运行不计量
- 打开 /signup
- 填写表单
- 识别验证码
- submit
4 项通过0 项被拦截当无头 Chrome 遇到 reCAPTCHA、Turnstile 验证框或扭曲的图片时,CapSkip 就是你 Node.js 爬虫旁边的 Puppeteer 验证码识别工具。它运行在同一台 Windows 电脑或 VPS 上,把答案交给脚本直接填入,而不是让标签页一直等到超时。Puppeteer 能在任何地方点击和输入,却无法自己生成有效的 token。这部分由 CapSkip 应用完成,采用统一授权、识别不限量,非常适合一次爬取就可能打开数百个标签页的浏览器。
集成做到多深由你决定。已经在用 puppeteer-extra-plugin-recaptcha 的项目可以原封不动,照样通过 2Captcha 模拟器由 CapSkip 作答。新写的代码可以 npm install capskip,直接 await solver.recaptcha() 或 solver.turnstile(),开箱即带 TypeScript 类型。
覆盖范围远超插件扫描的那些。支持 reCAPTCHA v2、v3 和 Enterprise,Turnstile 的小组件形式和整页挑战形式,以及极验 v3 滑块、CaptchaFox、Capy Puzzle、工作量证明类的 ALTCHA 和 Friendly Captcha,还有数千种图片验证码样式,每张约 0.1 秒读出。hCaptcha、极验 v4、FunCaptcha 和 AWS WAF 不在支持范围内。Stealth 插件仍然有用,能让验证挑战出现得更少;漏网的那些则交给 CapSkip 通过。
你的 puppeteer-extra 配置一字不改。 recaptcha 插件保留它的 2captcha provider 和 page.solveRecaptchas() 调用。只要在 CapSkip 应用中开启 2Captcha 模拟器并添加到 hosts 文件,这些调用就会由运行 Chrome 的那台机器作答,而不是消耗预付余额。 跟着设置指南一步步来
Puppeteer 验证码识别工具为无头 Chrome 带来什么
puppeteer-extra-plugin-recaptcha 即插即用
插件保留它的 provider id 和每一个 page.solveRecaptchas() 调用。在 hosts 文件模式下使用 2Captcha 模拟器,它的请求就止步于你自己的电脑,余额分文不耗。
每种验证码类型 await 一个方法
npm install capskip,创建一个客户端,然后 await recaptcha()、turnstile()、geetest() 或 normal()。每个方法都以 result.code 返回结果,包内自带 TypeScript 类型定义。
Turnstile 页面配上正确的 user agent
solver.turnstile() 既支持嵌入式小组件,也支持 Cloudflare 整页检查。对于整页检查,它还会返回该 token 所对应的 userAgent,你可以用 page.setUserAgent 应用它。
在你启动的 Chrome 中加载扩展
把 CapSkip 扩展加载到 Puppeteer 启动的 Chrome 实例中,无论是有窗口模式还是新版无头模式,小组件都会在页面内直接通过,一行 token 代码都不用写。
多标签页并行,无需排队识别
每个页面发起一次识别,再用 Promise.all 汇总。没有按密钥的速率限制,线程也不限量,吞吐量取决于你的 CPU 和内存,而不是服务商的套餐等级。
重试永远不会出现在账单上
青铜套餐每月 35 美元,一台机器,识别不限量。一次把页面重新加载十次的爬取,或通宵循环运行的测试套件,花费都完全一样。
把 CapSkip 接入 Puppeteer 的三种方式
const puppeteer = require('puppeteer');
const { CapSkip } = require('capskip');
const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com/login');
const sitekey = await page.$eval('.g-recaptcha', el => el.dataset.sitekey);
const { code } = await solver.recaptcha(sitekey, page.url());
await page.evaluate(t => {
document.getElementById('g-recaptcha-response').innerHTML = t;
}, code);
await page.click('button[type=submit]');
})();Puppeteer 读取 sitekey,capskip 包中的 solver.recaptcha() 返回 token,再由 page.evaluate 在点击提交前把它填入页面。
在启动的浏览器中使用扩展
应用运行时,把 CapSkip 扩展放进 Puppeteer 打开的浏览器,验证挑战会在你的脚本等待下一个选择器时自动通过。Chrome 和 Firefox 版本都有。
capskip npm 客户端
基于 Promise 的 Node.js 客户端,带 TypeScript 类型。每个页面 await 一个 token 或文字结果,再用 page.evaluate 写入。另有 Python、PHP 和 C# 客户端可用。
为旧代码模拟 2Captcha API
puppeteer-extra-plugin-recaptcha 和其他 2Captcha 风格的客户端照常发送相同的请求,本地 API 在你的机器上作答,因此现有 Node 代码无需任何修改。
在托管的 reCAPTCHA 页面上试一试
把一个测试用的 Puppeteer 脚本,或装了扩展的 Chrome,对准我们在线的 reCAPTCHA v2 演示页,先看着 token 返回,再把同样的代码用到真实目标上。
让你的 Puppeteer 项目准备好应对验证码
-
在 Chrome 旁边安装应用
在运行 Puppeteer 脚本的 Windows 机器或 VPS 上安装 CapSkip,并保持它开启。两者放在同一台机器上最简单,而 hosts 文件方式也要求如此。 下载安装程序
-
激活套餐或试用
选择月度套餐或免费试用(3 天内 500 次识别),然后用发到你邮箱的凭据登录 CapSkip。 比较各套餐
-
在 Puppeteer 代码中调用它
运行 npm install capskip 以直接调用,或在 hosts 文件模式下开启 2Captcha 模拟器,让 puppeteer-extra 照常工作,然后让脚本在真实页面上跑一遍。 查看 Node.js SDK
Puppeteer 验证码识别:本地运行还是按次计费
两种方案都能接入同一套 Puppeteer 代码。下表展示的是验证挑战离开你的脚本之后有哪些不同。
| 功能 | CapSkip | 2Captcha & API 服务 |
|---|---|---|
| 如何付费 | 每月 35 美元起,无开通费,从不统计识别次数 | 预付点数,按每千次识别定价,费用随页面数量增长 |
| 识别在哪里进行 | 在 CapSkip 内部,在运行你爬虫的那台电脑上 | 远程 API 或人工打码平台 |
| 接入 Node.js 的方式 | npm 客户端、浏览器扩展或本地 API | API 密钥,加上服务商客户端或 puppeteer-extra |
| puppeteer-extra-plugin-recaptcha | 照常工作,通过 2Captcha 模拟器在本地作答 | 能用,但每个 token 都要从付费余额中扣除 |
| 图片验证码返回时间 | 约 0.1 秒,在同一台机器上作答 | 每张图片都得经历上传、排队、轮询 |
| 并行标签页 | 不限线程,速度取决于你的硬件 | 并发上限,或更贵的套餐 |
| 挑战数据 | 始终留在运行 Chrome 的机器上 | 每次识别都会发送给第三方 |
想先试用一下?
开始 3 天免费试用,在你自己的目标上识别 500 个任意类型的验证码。
相关验证码识别工具与指南
如何在 Puppeteer 中识别 reCAPTCHA:插件方式还是 SDK 方式
在 Puppeteer 中用 CapSkip 识别 reCAPTCHA,有两种可靠的方式。插件方式原封不动地复用 puppeteer-extra-plugin-recaptcha。SDK 方式则由你自己调用 capskip npm 包,它还能处理 Turnstile、极验 v3 和图片验证码,而这些是插件从来不会去找的。
插件方式。打开 CapSkip 应用,开启 2Captcha 模拟器,然后点击 Add to hosts file。这只会在这一台电脑上把 2captcha.com 重定向到 CapSkip,因此运行 Puppeteer 的 Node 进程必须与应用位于同一台机器上。像以前一样注册插件,provider id 设为 2captcha,token 字段填入 CapSkip 设置中的密钥(关闭密钥验证时,任意文本都会被接受)。每次导航后,page.solveRecaptchas() 会找到小组件,把它们发给它仍以为是 2Captcha 的服务,并填入 CapSkip 返回的 token。
SDK 方式。执行 npm install capskip 后,创建一个指向 127.0.0.1、端口 8080 的客户端,全新安装的 CapSkip 就在这里监听。用 page.$eval 读取 sitekey,然后 await solver.recaptcha(sitekey, page.url())。隐形小组件需要传入 invisible: 1,reCAPTCHA v3 则需要 version v3 以及页面使用的 action。
请在两分钟内完成,因为 token 会过期。用 page.evaluate 把 result.code 写入 g-recaptcha-response 文本框,如果声明了小组件回调就触发它,然后提交。Turnstile 的做法完全相同,使用 solver.turnstile() 和 cf-turnstile-response 字段。对于图片验证码,把元素截图为 base64,再以 data:image/png;base64 字符串的形式传给 solver.normal()。
相关指南: Node.js 验证码识别 · 用 Node.js 识别 reCAPTCHA v2 · 2Captcha API 替代方案
在 Puppeteer 脚本中识别 reCAPTCHA 是什么样子?
puppeteer-extra-plugin-recaptcha 能把任务交给 CapSkip 吗?
插件还需要一个已充值的 2Captcha 账户吗?
为什么运行 page.solveRecaptchas() 之后还剩下一些验证挑战?
Puppeteer 能通过 Cloudflare 整页检查吗?
仅靠 puppeteer-extra-plugin-stealth 能避开验证码吗?
在 Puppeteer 中处理 reCAPTCHA v3 有什么不同?
CapSkip 扩展能在无头 Puppeteer 中运行吗?
让每次 Puppeteer 运行都能越过验证码
在你的 Node.js 项目旁边安装 CapSkip,保留现有插件或加上 npm 客户端,下一个验证挑战就只需一次 await 调用,而不是一个卡住的标签页,月费依旧不变。
