Hoe reCAPTCHA v2 in Nodejs te omzeilen#

logoNextCaptcha
March 15,2024

Over reCAPTCHA v2#

reCAPTCHA v2 is een verificatiecodesysteem ontwikkeld door Google om websites te helpen onderscheid te maken tussen menselijke gebruikers en geautomatiseerde programma's (zoals bots). Het verifieert de menselijke identiteit van de gebruiker door hem te verplichten een selectievakje aan te vinken voordat hij een actie voltooit, zoals het indienen van een formulier of inloggen. reCAPTCHA v2 bepaalt of de gebruiker een echt mens is door informatie zoals het klikgedrag en surfgedrag van de gebruiker te analyseren.

Soorten reCAPTCHA v2#

  • Checkbox

Zoals u ziet, vereist het selectievakje 'Ik ben geen robot' dat de gebruiker het selectievakje aanvinkt dat aangeeft dat de gebruiker geen robot is. Hierdoor wordt door de gebruiker onmiddellijk geverifieerd (zonder captcha) of wordt hij uitgedaagd dat hij een mens is

newCaptchaAnchor

  • Invisible

Zoals u ziet, hoeft de gebruiker voor de onzichtbare reCAPTCHA-badge niet op een selectievakje te klikken, maar wordt deze in plaats daarvan rechtstreeks aangeroepen wanneer de gebruiker op een bestaande knop op de site klikt, of kan deze worden opgeroepen via een JavaScript API-aanroep. Voor de integratie is een JavaScript-callback vereist nadat de reCAPTCHA-validatie is voltooid. Standaard wordt alleen het meest verdachte verkeer gevraagd een CAPTCHA op te lossen

Untitled

In dit artikel zullen we CAPTCHA's demystificeren en het proces doorlopen van het bouwen van een eenvoudige reCAPTCHA v2-oplosser met behulp van nodejs.

Milieuvoorbereiding#

Zorg er eerst voor dat Nodejs op uw systeem is geïnstalleerd. Installeer bovendien de vereiste bibliotheken:
npm install axios
npm install cheerio
Wanneer de doelwebpagina een statische pagina is, gebruiken we direct `axios` om de relevante webpagina te downloaden, en gebruiken we vervolgens `cheerio` om de webpagina te parseren en de relevante gegevens te extraheren die nodig zijn om reCAPTCHA v2 te omzeilen Voordat we met de officiële bypass beginnen, moeten we de website NextCaptcha registreren. Nadat u een account heeft geregistreerd, kunt u op de achtergrond een accountsleutel verkrijgen, de clientKey, en deze opslaan voor later gebruik. Nadat we de relevante clientKey hebben verkregen, beginnen we officieel aan de reis om reCAPTCHA v2 te omzeilen. Hier gebruiken we de officiële demo als voorbeeld. De URL is https://www.google.com/recaptcha/api2/demo

Haal de HTML van een webpagina op#

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

Ontvang reCAPTCHA-gerelateerde parameters#

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;
    }
}
 

Ontwikkeld om reCAPTCHA v2-verzoeken te omzeilen#

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;
    }
}

Ontvang reCAPTCHA v2-bypass-taakresultaten#

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;
    }
}

Voeg ze samen#

De gRecaptchaResponse in het verkregen `resultaat` is het token dat is opgelost door reCAPTCHA v2. Deze sleutel kunnen we gebruiken om deze in te dienen bij de relevante interface van de website.
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()