Menu

Ignorando o Recaptcha V2 com NodeJS e Puppeteer


O que você vai aprender

  • Configure NodeJS e Webstorm IDE em um Sistema Operacional Ubuntu recém-instalado.
  • Instale e importe os módulos npm anticaptchaofficial e puppeteer.
  • Você aprenderá como enviar o formulário isto com o script Recaptcha com NodeJS.
  • Aprenda como criar um script puppeteer que abre o Chromium no modo de plano de fundo e navega até a página.
  • Aprenda como tirar uma captura de tela de uma página e salvá-la no disco.
  • Aprenda como preencher um campos de texto de um formulário usando seletores CSS.
  • Aprenda como resolver Recaptcha v2, preencher textarea #g-recaptcha-response oculto e enviar o formulário.
  • Notas sobre a extensão do seu conhecimento sobre Javascript ES6 e NodeJS.
Source code

Configure NodeJS e Webstorm IDE em um Sistema Operacional Ubuntu recém-instalado.

  • Ubuntu OS: Instalar o Ubuntu OS não é um requisito, mas uma recomendação. A execução do NodeJS a partir do Windows também é possível, mas nosso código pode não ser compatível.
  • Node JS: baixe o NodeJS para seu sistema operacional aqui
  • Editor de código: recomendado VS Code ou Atom. Ambos são IDE gratuitos.

Instale curl e nodejs no Ubuntu:

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

Instale e importe os módulos npm anticaptchaofficial e puppeteer.

Instale os módulos npm anti-captcha e Puppeteer:

npm install @antiadmin/anticaptchaofficial puppeteer

Crie um novo arquivo index.js e adicione o seguinte. Substitua "YOUR_API_KEY" pela sua chave de Configurações da API:

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

Aprenda como criar um script puppeteer que abre o Chromium no modo de plano de fundo e navega até a página.

Adicione o seguinte código para primeiro resolver o captcha, preencha o formulário com login e senha, cole o token g-response na área de texto com id="g-recaptcha-response" e envie o formulário:

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

})();

Você pode notar que primeiro resolvemos o captcha e só então navegamos até a página e colamos o resultado. Funciona para o Recaptcha, pois já sabemos que a chave do site e a vida útil do token são de 120 segundos.

A captura de tela da página final é salva em screenshot.png. Se você deseja ver o que está acontecendo no navegador, desative o modo headless:

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

Notas sobre a extensão do seu conhecimento sobre Javascript ES6 e NodeJS.

Você aprendeu como ignorar um formulário com o Recaptcha V2 em sua maneira de implementação mais simples - com a área de texto "g-recaptcha-response" como parte do formulário. Você pode querer ampliar seu conhecimento:

Github

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