Como ignorar o reCAPTCHA v2 em Nodejs#

logoNextCaptcha
March 15,2024

Sobre o reCAPTCHA v2#

reCAPTCHA v2 é um sistema de código de verificação desenvolvido pelo Google para ajudar os sites a distinguir entre usuários humanos e programas automatizados (como bots). Ele verifica a identidade humana do usuário, exigindo que ele clique em uma caixa de seleção antes de concluir uma ação, como envio de formulário ou login. O reCAPTCHA v2 determina se o usuário é um ser humano real, analisando informações como o comportamento de cliques do usuário e os padrões de navegação.

Tipos de reCAPTCHA v2#

  • Checkbox

Conforme mostrado, a caixa de seleção "Não sou um robô" exige que o usuário clique na caixa de seleção que indica que o usuário não é um robô. Isso irá verificar imediatamente pelo usuário (sem captcha) ou desafiá-lo de que ele é humano

newCaptchaAnchor

  • Invisible

Conforme mostrado, o emblema reCAPTCHA invisível não exige que o usuário clique em uma caixa de seleção, mas é chamado diretamente quando o usuário clica em um botão existente no site ou pode ser chamado por meio de uma chamada de API JavaScript. A integração requer um retorno de chamada JavaScript após a conclusão da validação do reCAPTCHA. Por padrão, apenas o tráfego mais suspeito será solicitado a resolver um CAPTCHA

Untitled

Neste artigo, desmistificaremos os CAPTCHAs e percorreremos o processo de construção de um solucionador reCAPTCHA v2 simples usando nodejs.

Preparação ambiental#

Primeiro, certifique-se de que o Nodejs esteja instalado em seu sistema. Além disso, instale as bibliotecas necessárias:
npm install axios
npm install cheerio
Quando a página da web de destino é uma página estática, usamos `axios` diretamente para baixar a página da web relevante e, em seguida, usamos `cheerio` para analisar a página da web e extrair os dados relevantes necessários para ignorar o reCAPTCHA v2 Antes de iniciarmos o bypass oficial, precisamos registrar o site NextCaptcha. Após registrar uma conta, você pode obter uma chave de conta em segundo plano, que é a clientKey, e salvá-la para uso posterior. Depois de obter a clientKey relevante, iniciamos oficialmente a jornada para contornar o reCAPTCHA v2. Aqui usamos a demonstração oficial como exemplo. O URL é https://www.google.com/recaptcha/api2/demo

Obtenha o HTML de uma página da web#

const axios = require('axios');
 
async function getPageData(url) {
    try {
	    const data = await axios.get(url)
	    return data.data;
    }  catch (e) {
        console.error('getPageData error', e.message);
        return null;
    }
}
 
getPageData('https://www.google.com/recaptcha/api2/demo');

Obtenha parâmetros relacionados ao reCAPTCHA#

const cheerio = require('cheerio');
 
function parserData(html) {
    try {
        const $ = cheerio.load(html);
 
        return $('[data-sitekey]').data('sitekey')
 
    } catch (e) {
        console.error('parserData error', e.message);
        return null;
    }
}
 

Construir para ignorar solicitações reCAPTCHA v2#

const axios = require('axios');
 
async function createCaptchaTask(url, siteKey, isInvisible) {
    try {
        const data = await axios.post('https://api.nextcaptcha.com/createTask', {
            "clientKey": "clientKey", // clientKey from NextCaptcha dashboard
            "task": {
                type: "RecaptchaV2TaskProxyless",
                websiteURL: url,
                websiteKey: siteKey,
                isInvisible
            }
        });
        return data.data;
    } catch (e) {
        console.error('createCaptchaTask error', e.message);
        return null;
    }
}

Obtenha resultados da tarefa de desvio do reCAPTCHA v2#

const axios = require('axios');
 
async function sleep(time = 500) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        }, time)
    })
}
async function getTaskResult(taskId) {
    try {
        const data = await axios.post('https://api.nextcaptcha.com/getTaskResult', {
            "clientKey": "clientKey", // clientKey from NextCaptcha
            taskId
        });
        if (data.data.status === 'processing') {
            await sleep();
            return getTaskResult(taskId)
        } else {
            console.error('createCaptchaTask errorCode', data.data.errorCode);
            console.error('createCaptchaTask errorDescription', data.data.errorDescription);
            return null;
        }
    } catch (e) {
        console.error('createCaptchaTask error', e.message);
        return null;
    }
}

coloque-os juntos#

O gRecaptchaResponse no `resultado` obtido é o token resolvido pelo reCAPTCHA v2. Podemos usar esta chave para enviá-lo à interface relevante do site.
const axios = require('axios');
const cheerio = require('cheerio');
 
async function getPageData(url) {
    try {
	    const data = await axios.get(url)
	    return data.data;
    }  catch (e) {
        console.error('getPageData error', e.message);
        return null;
    }
}
 
function parserData(html) {
    try {
        const $ = cheerio.load(html);
 
        return $('[data-sitekey]').data('sitekey')
 
    } catch (e) {
        console.error('parserData error', e.message);
        return null;
    }
}
 
async function createCaptchaTask(url, siteKey, isInvisible) {
    try {
        const data = await axios.post('https://api.nextcaptcha.com/createTask', {
            "clientKey": "clientKey", // clientKey from NextCaptcha dashboard
            "task": {
                type: "RecaptchaV2TaskProxyless",
                websiteURL: url,
                websiteKey: siteKey,
                isInvisible
            }
        });
        return data.data;
    } catch (e) {
        console.error('createCaptchaTask error', e.message);
        return null;
    }
}
 
async function sleep(time = 500) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        }, time)
    })
}
 
async function getTaskResult(taskId, tryTimes = 60) {
    try {
        const data = await axios.post('https://api.nextcaptcha.com/getTaskResult', {
            "clientKey": "clientKey", // clientKey from NextCaptcha
            taskId
        });
         if (data.data.status === 'ready') {
            return data.data;
        } else if (data.data.status === 'processing' && tryTimes >= 0) {
            await sleep();
            return getTaskResult(taskId)
        } else {
            if (tryTimes < 0) {
                console.error('getTaskResult out of time');
            } else {
                console.error('getTaskResult errorCode', data.data.errorCode);
                console.error('getTaskResult errorDescription', data.data.errorDescription);
            }
            return null;
        }
    } catch (e) {
        console.error('getTaskResult error', e.message);
        return null;
    }
}
 
async function mian() {
    const url = 'https://www.google.com/recaptcha/api2/demo'
    const html = await getPageData(url);
    const sitekey = parserData(html);
    console.log(sitekey)
    const task = await createCaptchaTask(url, sitekey, false);
    const result = await getTaskResult(task.taskId);
    console.log(result)
}
 
mian()