Menu

Обхід Recaptcha V2 за допомогою NodeJS і Puppeteer


Те, що ви збираєтеся навчитися

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

Налаштування NodeJS і Webstorm IDE в щойно встановленій ОС Ubuntu.

  • ОС Ubuntu: встановлення ОС Ubuntu є не вимогою, а рекомендацією. Запуск 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

Встановлення та імпорт модулів anticaptchaofficial та puppeteer npm.

Встановіть модулі anti-captcha та Puppeteer npm:

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 у фоновому режимі та переходить до сторінки.

Додайте наступний код, щоб спочатку розв’язати captcha, потім заповніть форму логіном і паролем, вставте маркер g-response у текстове поле з 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();

})();

Ви можете зауважити, що ми спочатку перевіряємо капчу, а лише потім переходимо на сторінку та вставляємо результат. Це працює для Recaptcha, оскільки ми вже знаємо ключ сайту та час життя токена становить 120 секунд.

Скріншот останньої сторінки зберігається у screenshot.png. Якщо ви хочете побачити, що відбувається в браузері, вимкніть безголовий режим:

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

Примітки щодо розширення ваших знань про Javascript ES6 та NodeJS.

Ви дізналися, як обійти форму за допомогою Recaptcha V2 найпростішим способом реалізації – за допомогою текстового поля «g-recaptcha-response» як частини форми. Ви можете розширити свої знання:

Github

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