Menu

Evitar Recaptcha V2 con NodeJS y Puppeteer


Lo que vas a aprender

  • Configura el NodeJS y Webstorm IDE en un recién instalado Sistema Ubuntu.
  • Instala e importa los módulos npm anticaptchaofficial y puppeteer.
  • Aprenderás a enviar este formulario con Recaptcha con el script NodeJS.
  • Aprende a codificar un script de puppeteer que abra Chromium en segundo plano y entre a una página.
  • Aprende cómo tomar una captura de pantalla de una página y la guarde en un disco.
  • Aprende cómo llenar campos de texto de los formularios usando selectores CSS.
  • Aprende cómo resolver Recaptchas v2, completar el campo de texto oculto #g-recaptcha-response y enviar el formulario.
  • Notas sobre cómo extender tu conocimiento sobre Javascript ES6 y NodeJS.
Source code

Configura el NodeJS y Webstorm IDE en un recién instalado Sistema Ubuntu.

  • Ubuntu OS: Instalar el sistema operativo Ubuntu no es un requisito, sino una recomendación. Ejecutar NodeJS desde Windows también es posible, pero nuestro código puede no ser compatible.
  • Node JS: Descargue NodeJS para su sistema operativo aquí
  • Editor de código: Recomendado VS Code o Atom. Ambos son IDE gratuitos.

Instalar curl y nodejs en Ubuntu:

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

Instala e importa los módulos npm anticaptchaofficial y puppeteer.

Instalar los módulos npm anti-captcha y Puppeteer:

npm install @antiadmin/anticaptchaofficial puppeteer

Crea un nuevo archivo index.js y añade lo siguiente. Sustituye "YOUR_API_KEY" por tu clave de Configuración de la API :

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

Aprende a codificar un script de puppeteer que abra Chromium en segundo plano y entre a una página.

Añade el siguiente código para resolver primero el captcha, luego rellena el formulario con el login y la contraseña, pega el token g-response en el textarea con id="g-recaptcha-response" y envía el formulario:

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

})();

Puedes notar que primero resolvemos el captcha y sólo después navegamos a la página y pegamos el resultado. Funciona para el Recaptcha ya que conocemos la sitekey y el tiempo de vida del token es de 120 segundos.

La captura de pantalla de la página final se guarda en screenshot.png. Si quieres ver lo que pasa en el navegador, desactiva el modo headless:

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

Notas sobre cómo extender tu conocimiento sobre Javascript ES6 y NodeJS.

Has aprendido cómo evitar un formulario con Recaptcha V2 en su forma de implementación más simple - con el textarea "g-recaptcha-response" como parte del formulario. Puede que quieras ampliar tus conocimientos:

Github

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