Menu

Обход рекапчи V2 с помощью NodeJS и Puppeteer


Чему вы научитесь за урок

  • Настройка NodeJS и Webstorm IDE в свежеустановленной Ubuntu OS.
  • Установка и импорт npm модулей anticaptchaofficial и puppeteer.
  • Вы научитесь отправлять эту форму с рекапчей с помощью скрипта NodeJS.
  • Узнайте как написать скрипт для puppeteer, который открывает Chromium в фоновом режиме и переходит на страницу.
  • Узнайте как сделать скриншот страницы и сохранить его на диск.
  • Узнайте как заполнить форму используя CSS селекторы.
  • Узнайте как решить Recaptcha v2, заполнить скрытое поле #g-recaptcha-response и отправить форму.
  • Примечания о расширении ваших знаний о Javascript ES6 и NodeJS.
Source code

Настройка NodeJS и Webstorm IDE в свежеустановленной Ubuntu OS.

  • Ubuntu OS: Установка Ubuntu OS не требуется, но рекомендуется. Запуск NodeJS в Windows также возможен, но наш код может не сработать.
  • Node JS: Скачайте NodeJS для вашей операционной системы здесь
  • Тестовый редактор: Рекомендуем VS Code или Atom. Оба являются бесплатными IDE.

Установите curl и nodejs в Ubuntu:

apt update
apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt install -y nodejs

Установка и импорт npm модулей anticaptchaofficial и puppeteer.

Установите npm модули anti-captcha и Puppeteer:

npm install @antiadmin/anticaptchaofficial puppeteer

Создайте новый файл index.js и добавьте в него следующее. Замените "YOUR_API_KEY" на ваш ключ из настроек API :

const ac = require("@antiadmin/anticaptchaofficial");
      const pup = require("puppeteer");
      ac.setAPIKey('YOUR_API_KEY');

Узнайте как написать скрипт для puppeteer, который открывает Chromium в фоновом режиме и переходит на страницу.

Добавьте этот код чтобы сначала решить капчу, затем заполнить поля формы с логин и паролем, вставить токен g-response в textarea с id="g-recaptcha-response" и отправить форму:

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();

})();

Вы могли заметить, что мы сначала решили капчу и только потом перешли на страницу и вставили результат решения. Это работает для рекапчи так как мы уже знаем значение sitekey и время жизни токена равно 120 секундам.

Скриншот последней страницы был сохранен в файл screenshot.png. Если вы хотите увидеть, что происходит в браузере, выключите headless режим:

console.log('opening browser ..');
//const browser = await pup.launch();
const browser = await pup.launch({ headless: false });

Примечания о расширении ваших знаний о Javascript ES6 и NodeJS.

Вы научились обходить форму с рекапчей V2 в ее самой простой имплементации - с textarea id "g-recaptcha-response", которая является частью формы. Вы также можете расширить свои знания:

Github

https://github.com/anti-captcha/solving-captcha-concepts/blob/master/tutorial1.js