手册: 如何在 Puppeteer 中使用扩展解决 reCAPTCHA 问题
1. 安装组件
安装 Puppeteer 和其他所需软件包:
npm i puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
2. 设置扩展
下载带有扩展的 压缩包,并解压到项目根目录下的 ./2captcha-solver
文件夹中。
该扩展有许多设置,包括自动解决指定类型的验证码、支持 "代理 "以及其他设置。这些设置可在文件 ./common/config.js
中找到。要为自动重验证码 V2 解决方案添加设置,你需要打开文件 ./common/config.js
,并将 autoSolveRecaptchaV2
字段的值改为 true
。
接下来,您需要配置扩展:
在扩展设置文件
./common/config.js
中输入你的 API 密钥。您的密钥必须写入apiKey
字段的值。您可以在[页面](https://2captcha.com/setting)上查看并复制您的 API 密钥。示例: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');
const { executablePath } = require('puppeteer');
(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}`、
],
executablePath:executablePath()
});
const [page] = await browser.pages()
})();
3.1 打开页面
打开页面 reCAPTCHA demo 并发送验证码。
使用 page.goto()
进入 reCAPTCHA demo 页面。接下来,您需要发送验证码以获取解决方案,这可以手动或自动完成。
在我们的例子中,我们将手动发送验证码,为此,我们要等待带有 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="solving" | 验证码已成功解决。 |
data-state="error" | 收到回复时出错或验证码未成功解决。 |
在这一步,你需要等待验证码被解决,之后属性值将变为"solved"
,这将是验证码成功解决的信号。完成这一步后,就可以执行必要的操作了。
// By default, waitForSelector waits for 30 seconds, but this time is usually not enough, so we specify the timeout value manually with the second parameter. The timeout value is specified in "ms".
await page.waitForSelector(`.captcha-solver[data-state="solved"]`, {timeout: 180000})
4. 执行操作
破解验证码后,我们可以开始在页面上执行必要的操作。在我们的例子中,我们将点击 "检查 "按钮,检查收到的验证码解决方案是否正确。成功通过检查后,你会看到 "验证码已成功通过!"的信息。
// 点击 "检查 "按钮,检查验证码是否成功解决。
await page.click("button[type='submit']")
恭喜您,验证码已成功通过!示例的完整源代码。