So umgehen Sie reCAPTCHA v2 in Nodejs#

logoNextCaptcha
March 15,2024

Über reCAPTCHA v2#

reCAPTCHA v2 ist ein von Google entwickeltes Verifizierungscodesystem, das Websites dabei hilft, zwischen menschlichen Benutzern und automatisierten Programmen (z. B. Bots) zu unterscheiden. Es überprüft die menschliche Identität des Benutzers, indem es ihn auffordert, ein Kontrollkästchen anzuklicken, bevor er eine Aktion wie das Absenden eines Formulars oder die Anmeldung abschließt. reCAPTCHA v2 ermittelt, ob der Benutzer ein echter Mensch ist, indem es Informationen wie das Klickverhalten und das Surfverhalten des Benutzers analysiert.

Arten von reCAPTCHA v2#

  • Checkbox

Wie gezeigt, erfordert das Kontrollkästchen „Ich bin kein Roboter“, dass der Benutzer das Kontrollkästchen anklickt, das angibt, dass der Benutzer kein Roboter ist. Dadurch wird der Benutzer sofort (ohne Captcha) verifizieren oder ihm mitteilen, dass es sich um einen Menschen handelt

newCaptchaAnchor

  • Invisible

Wie gezeigt, erfordert das unsichtbare reCAPTCHA-Badge nicht, dass der Benutzer auf ein Kontrollkästchen klickt, sondern wird stattdessen direkt aufgerufen, wenn der Benutzer auf eine vorhandene Schaltfläche auf der Website klickt, oder kann über einen JavaScript-API-Aufruf aufgerufen werden. Die Integration erfordert einen JavaScript-Rückruf, nachdem die reCAPTCHA-Validierung abgeschlossen ist. Standardmäßig wird nur der verdächtigste Datenverkehr aufgefordert, ein CAPTCHA zu lösen

Untitled

In diesem Artikel entmystifizieren wir CAPTCHAs und gehen durch den Prozess der Erstellung eines einfachen reCAPTCHA v2-Lösers mithilfe von NodeJS.

Umweltvorbereitung#

Stellen Sie zunächst sicher, dass Nodejs auf Ihrem System installiert ist. Installieren Sie außerdem die erforderlichen Bibliotheken:
npm install axios
npm install cheerio
Wenn es sich bei der Zielwebseite um eine statische Seite handelt, verwenden wir „axios“ direkt, um die entsprechende Webseite herunterzuladen, und verwenden dann „cheerio“, um die Webseite zu analysieren und die relevanten Daten zu extrahieren, die zur Umgehung von reCAPTCHA v2 erforderlich sind Bevor wir mit der offiziellen Umgehung beginnen, müssen wir die Website NextCaptcha registrieren. Nach der Registrierung eines Kontos können Sie im Hintergrund einen Kontoschlüssel, den clientKey, abrufen und für die spätere Verwendung speichern. Nachdem wir den entsprechenden ClientKey erhalten haben, beginnen wir offiziell mit der Umgehung von reCAPTCHA v2. Hier verwenden wir die offizielle Demo als Beispiel. Die URL lautet https://www.google.com/recaptcha/api2/demo

Holen Sie sich den HTML-Code einer Webseite#

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

Rufen Sie reCAPTCHA-bezogene Parameter ab#

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

Entwickelt, um reCAPTCHA v2-Anfragen zu umgehen#

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

Erhalten Sie die Ergebnisse der reCAPTCHA v2-Umgehungsaufgabe#

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

füge sie zusammen#

Die gRecaptchaResponse im erhaltenen „Ergebnis“ ist das von reCAPTCHA v2 gelöste Token. Mit diesem Schlüssel können wir es an die entsprechende Schnittstelle der Website übermitteln.
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()