用NodeJS和Puppeteer绕过Recaptcha V2
你将会学到什么
- 在新安装的 Ubuntu 操作系统中设置 NodeJS 和 Webstorm IDE。
- 安装并导入 anticaptchaofficial 和 puppeteer npm 模块。
- 你将学习如何用NodeJS脚本提交带有Recaptcha的这个表单。
- 了解如何编写可在后台模式中打开 Chromium 并转到某个页面的 puppeteer 脚本。
- 了解如何截取页面屏幕截图并将其保存到磁盘中。
- 了解如何用 CSS 选择器填写窗体文本字段。
- 了解如何破解 Recaptcha v2 谜题,填写隐藏的 textarea #g-recaptcha-response 及提交窗体。
- 关于扩大 Javascript ES6 和 NodeJS 相关知识面的说明
在新安装的 Ubuntu 操作系统中设置 NodeJS 和 Webstorm IDE。
- 乌班图操作系统。安装Ubuntu操作系统并不是必须的,而是一种建议。从Windows运行NodeJS也是可以的,但我们的代码可能不兼容。
- Node JS:为你的操作系统下载NodeJS这里。
- 代码编辑器。推荐VS Code或Atom。两者都是免费的IDE。
在Ubuntu中安装curl和nodejs。
Bash
apt update
apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt install -y nodejs
安装并导入 anticaptchaofficial 和 puppeteer npm 模块。
安装anti-captcha和Puppeteer npm模块。
Bash
npm install @antiadmin/anticaptchaofficial puppeteer
创建一个新的文件index.js并添加以下内容。将 "YOUR_API_KEY "替换为你在API设置的密钥。
Javascript
const ac = require("@antiadmin/anticaptchaofficial");
const pup = require("puppeteer");
ac.setAPIKey('YOUR_API_KEY');
了解如何编写可在后台模式中打开 Chromium 并转到某个页面的 puppeteer 脚本。
添加以下代码,首先解决验证码,然后用登录和密码填写表格,将g-response令牌粘贴到id="g-recaptcha-response "的textarea中,并提交该表格。
Javascript
const login = 'mylogin';
const password = 'my strong password';
(async () => {
console.log('solving recaptcha ...');
let token = await ac.solveRecaptchaV2Proxyless('https://anti-captcha.com/demo?page=recaptcha_v2_textarea', '6LfydQgUAAAAAMuh1gRreQdKjAop7eGmi6TrNIzp');
if (!token) {
console.log('something went wrong');
return;
}
console.log('opening browser ..');
const browser = await pup.launch();
console.log('creating new tab ..');
const tab = await browser.newPage();
console.log('changing window size .. ');
await tab.setViewport({ width: 1360, height: 1000 });
console.log('opening target page ..');
await tab.goto('https://anti-captcha.com/demo?page=recaptcha_v2_textarea', { waitUntil: "networkidle0" });
console.log('filling login input ..');
await tab.$eval('#contentbox > form > div > div:nth-child(1) > span > input', (element, login) => {
element.value = login;
}, login);
console.log('filling password input');
await tab.$eval('#contentbox > form > div > div:nth-child(2) > span > input', (element, password) => {
element.value = password;
}, password);
console.log('setting recaptcha g-response ...');
await tab.$eval('#g-recaptcha-response', (element, token) => {
element.value = token;
}, token);
console.log('submitting form .. ');
await Promise.all([
tab.click('#contentbox > form > div > div.tac.padding20px > button'),
tab.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('making a screenshot ...');
await tab.screenshot({ path: 'screenshot.png' });
console.log('closing browser .. ');
await browser.close();
})();
你可能会注意到,我们首先解决验证码,然后才导航到页面并粘贴结果。这对Recaptcha有效,因为我们已经知道sitekey和token的寿命是120秒。
最终页面的截图被保存为screenshot.png。如果你希望看到浏览器中的情况,请关闭无头模式。
Javascript
console.log('opening browser ..');
//const browser = await pup.launch();
const browser = await pup.launch({ headless: false });
关于扩大 Javascript ES6 和 NodeJS 相关知识面的说明
你已经学会了如何用Recaptcha V2最简单的实现方式绕过一个表单--用 "g-recaptcha-response "文本区域作为表单的一部分。你可能想扩展你的知识。
- 使用NodeJS和Puppeteer学习带有回调函数的如何绕过Recaptcha V2表单。
- Maximilian Schwarzmüller推荐的NodeJS和Javascript ES6课程:NodeJS - The Complete Guide和Accelerated ES6 Javascript Training。