在本文中,我们将描述如何搭配 Puppeteer 使用 2captcha-solver 插件。Puppeteer 是一个节点库,可帮助您启动浏览器并在其中执行各种操作。您可在此处查看使用示例。Puppeteer 库非常适用于各种自动化功能,可用于编写解析器和其他需要在浏览器中实现自动化的任务。Puppeteer 的优势在于其简单性和在 headless 模式下工作的能力。Puppeteer 提供了现成的解决方案,可让您将自动化隐藏在幕后。在开发解析器时对自动化功能进行隐藏非常重要,因为这将允许浏览器看起来更像是真人,从而避免暴露。
在本文中,我们将使用 Puppeteer、puppeteer-extra 和 puppeteer-extra-plugin-stealth。puppeteer-extra 是 Puppeteer 的一个轻量包,puppeteer-extra-plugin-stealth 则是 puppeteer-extra 的补充功能,其目的是隐藏自动化的痕迹。
在下方的分步描述中,我们将对 cn.2captcha.com/demo/recapt… 页面上的验证码进行解算。
1. 安装组件****
安装 Puppeteer 及其他必要的包:
npm i puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
2. 设置插件****
使用插件下载档案库,然后将其解压缩至项目根目录内的“/2captcha-solver”文件夹中。
此插件提供了多种设置项,包括对指定类型的验证码进行自动解算、代理支持以及更多其他设置。您可在/common/config.js文件中找到所有可用设置。如需添加自动 reCAPTCHA V2 解决方案设置,您需要打开 /common/config.js 文件,并将 autoSolveRecaptchaV2 字段的值改为 true。
下一步是对插件进行配置:
- 在插件设置文件
./common/config.js中输入API Key。您的 Key 必须写入 apiKey 字段。可在本页复制 API Key。
示例:apiKey: "8080629c1221fdd82m8080000ff0c99c"
- 禁用安装后打开扩展设置页面。可在
./manifest.json”删除以下行以实现该功能:
"options_ui": {
"page": "options/options.html",
"open_in_tab": true
},
3. 浏览器自动化****
在 Puppeteer 中启动并初始化插件:
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
(async () => {
const pathToExtension = require('path').join(__dirname, '2captcha-solver');
puppeteer.use(StealthPlugin())
const browser = await puppeteer.launch({
headless: false,
args: [
`--disable-extensions-except=${pathToExtension}`,
`--load-extension=${pathToExtension}`,
],
});
const [page] = await browser.pages()
});
3.1 打开页面****
打开页面 cn.2captcha.com/demo/recapt… 并发送验证码。
我们可以使用 page.goto() 前往页面 cn.2captcha.com/demo/recapt…。接下来是发送验证码以进行解算,这一步骤可手动进行,也可自动完成。
在我们的示例中将手动发送验证码,为此我们将等待带有 CSS 选择器.captcha-solver的插件按钮处于可用状态,然后再点击此按钮。点击按钮后,验证码将被发送至服务进行解算。
// 打开页面
await page.goto('https://2captcha.com/demo/recaptcha-v2')
// 等待带有 CSS 选择器“.captcha-solver”的元素处于可用状态
await page.waitForSelector('.captcha-solver')
// 点击带有特定选择器的元素
await page.click('.captcha-solver')
3.2 检查验证码状态****
在从服务接收到相应之后,插件按钮.captcha-solver会对数据属性data-state的值进行更改。通过观察data-state属性的值,我们可对插件的状况进行监测。在完成验证码的解算之后,该属性的值将被更改为solved。
“data-state”属性值说明:
| 属性**** | 说明**** |
|---|---|
data-state="ready" | 插件已做好对验证码进行解算的准备。如需发送验证码,请点击按钮。 |
data-state="solving" | 正在解算验证码。 |
data-state="solved" | 验证码已成功解算 |
data-state="error" | 接收响应时出错或验证码未能成功得到解算。 |
在这一步骤中,您需要等待验证码完成解算,然后属性值或被更改为solved。这就表明验证码的解算工作已成功完成。您可在这一步骤中进行必要操作。
// 默认情况下 waitForSelector 会等待 30 秒时间,但这点时间通常是不够的,所以我们会使用第二个参数来指定超时值。超时值需要以“ms”为单位进行声明。
await page.waitForSelector(`.captcha-solver[data-state="solved"]`, {timeout: 180000})
4. 进行操作****
在完成验证码的解算工作后,我们就可在页面上执行必要的操作了。本示例中将点击“Check”按钮以检查收到的验证码解算结果的正确性。成功通过检查后,您将看到“验证码已成功通过!”的消息。
// 点击“Check”按钮以检查验证码解算是否成功。
await page.click("button[type='submit']")
祝贺,现在已成功通过了验证码验证!示例的完整代码可在此处查看。
实用信息:****
- 本插件提供了许多设置,例如:自动对指定类型的验证码进行解算、代理支持等。这些设置都可在
/common/config.js中进行使用,其位于已解压插件的文件夹中。如需自动发送 reCAPTCHA V2,可在/common/config.js文件中将autoSolveRecaptchaV2字段的值设置为true。 - 您可使用沙盒模式以进行测试。在沙盒模式中,已发送的验证码将被发送给您。您可阅读此处的信息以进一步了解有关沙盒的内容。
- 运行于
headless模式的 Puppeteer 将不支持对插件进行加载。您可使用 xvfb 来解决此问题。
实用链接:****
- 示例的完整代码可在此处查看。
- 2captcha-solver(源代码)
- 2captcha-solver(Chrome 应用商店)
- 开发人员 2captcha 服务 FAQ:cn.2captcha.com/support/faq…
- puppeteer
- puppeteer-extra
- puppeteer-extra-plugin-stealth
- xvfb