Come bypassare reCAPTCHA v2 in Nodejs#

logoNextCaptcha
March 15,2024

Informazioni su reCAPTCHA v2#

reCAPTCHA v2 è un sistema di codice di verifica sviluppato da Google per aiutare i siti Web a distinguere tra utenti umani e programmi automatizzati (come i bot). Verifica l'identità umana dell'utente richiedendogli di fare clic su una casella di controllo prima di completare un'azione come l'invio di un modulo o l'accesso. reCAPTCHA v2 determina se l'utente è un vero essere umano analizzando informazioni come il comportamento di clic dell'utente e i modelli di navigazione.

Tipi di reCAPTCHA v2#

  • Checkbox

Come mostrato, la casella di controllo "Non sono un robot" richiede che l'utente faccia clic sulla casella di controllo che indica che l'utente non è un robot. Ciò verificherà immediatamente da parte dell'utente (senza captcha) o gli sfiderà che sia umano

newCaptchaAnchor

  • Invisible

Come mostrato, il badge reCAPTCHA invisibile non richiede all'utente di fare clic su una casella di controllo, ma viene invece richiamato direttamente quando l'utente fa clic su un pulsante esistente sul sito oppure può essere richiamato tramite una chiamata API JavaScript. L'integrazione richiede un callback JavaScript al termine della convalida reCAPTCHA. Per impostazione predefinita, solo al traffico più sospetto verrà richiesto di risolvere un CAPTCHA

Untitled

In questo articolo, demistificheremo i CAPTCHA e analizzeremo il processo di creazione di un semplice risolutore reCAPTCHA v2 utilizzando nodejs.

Preparazione ambientale#

Innanzitutto, assicurati che Nodejs sia installato sul tuo sistema. Inoltre, installa le librerie richieste:
npm install axios
npm install cheerio
Quando la pagina Web di destinazione è una pagina statica, utilizziamo direttamente "axios" per scaricare la pagina Web pertinente, quindi utilizziamo "cheerio" per analizzare la pagina Web ed estrarre i dati rilevanti necessari per bypassare reCAPTCHA v2 Prima di iniziare il bypass ufficiale, dobbiamo registrare il sito NextCaptcha. Dopo aver registrato un account, puoi ottenere una chiave dell'account in background, che è la clientKey, e salvarla per un uso successivo. Dopo aver ottenuto la relativa clientKey, iniziamo ufficialmente il viaggio per bypassare reCAPTCHA v2. Qui utilizziamo come esempio la demo ufficiale. L'URL è https://www.google.com/recaptcha/api2/demo

Ottieni l'HTML di una pagina 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');

Ottieni i parametri relativi a 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;
    }
}
 

Crea per ignorare le richieste 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;
    }
}

Ottieni i risultati dell'attività di bypass 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;
    }
}

Mettili insieme#

Il gRecaptchaResponse nel "risultato" ottenuto è il token risolto da reCAPTCHA v2. Possiamo utilizzare questa chiave per inviarlo all'interfaccia pertinente del sito 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()