Cómo omitir reCAPTCHA v2 en Nodejs#

logoNextCaptcha
March 15,2024

Acerca de reCAPTCHA v2#

reCAPTCHA v2 es un sistema de código de verificación desarrollado por Google para ayudar a los sitios web a distinguir entre usuarios humanos y programas automatizados (como bots). Verifica la identidad humana del usuario solicitándole que haga clic en una casilla de verificación antes de completar una acción como enviar un formulario o iniciar sesión. reCAPTCHA v2 determina si el usuario es un ser humano real analizando información como el comportamiento de clic del usuario y sus patrones de navegación.

Tipos de reCAPTCHA v2#

  • Checkbox

Como se muestra, la casilla de verificación "No soy un robot" requiere que el usuario haga clic en la casilla que indica que el usuario no es un robot. Esto verificará inmediatamente por parte del usuario (sin un captcha) o lo desafiará de que es humano.

newCaptchaAnchor

  • Invisible

Como se muestra, la insignia invisible reCAPTCHA no requiere que el usuario haga clic en una casilla de verificación, sino que se llama directamente cuando el usuario hace clic en un botón existente en el sitio, o se puede llamar a través de una llamada API de JavaScript. La integración requiere una devolución de llamada de JavaScript después de que se complete la validación de reCAPTCHA. De forma predeterminada, solo se solicitará al tráfico más sospechoso que resuelva un CAPTCHA.

Untitled

En este artículo, desmitificaremos los CAPTCHA y recorreremos el proceso de creación de un solucionador reCAPTCHA v2 simple utilizando nodejs.

Preparación ambiental#

Primero, asegúrese de que Nodejs esté instalado en su sistema. Además, instale las bibliotecas necesarias:
npm install axios
npm install cheerio
Cuando la página web de destino es una página estática, usamos directamente `axios` para descargar la página web relevante y luego usamos `cheerio` para analizar la página web y extraer los datos relevantes necesarios para omitir reCAPTCHA v2. Antes de comenzar la omisión oficial, debemos registrar el sitio web NextCaptcha. Después de registrar una cuenta, puede obtener una clave de cuenta en segundo plano, que es la clave del cliente, y guardarla para su uso posterior. Después de obtener la clave de cliente correspondiente, comenzamos oficialmente el viaje para evitar reCAPTCHA v2. Aquí usamos la demostración oficial como ejemplo. La URL es https://www.google.com/recaptcha/api2/demo

Obtener el HTML de una página 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');

Obtener parámetros relacionados con 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;
    }
}
 

Compilación para evitar solicitudes 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;
    }
}

Obtenga los resultados de la tarea de omisión de 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;
    }
}

Póngalos juntos#

La gRecaptchaResponse en el "resultado" obtenido es el token resuelto por reCAPTCHA v2. Podemos usar esta clave para enviarlo a la interfaz correspondiente del sitio web.
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()