Jak ominąć reCAPTCHA v2 w Nodejs#

logoNextCaptcha
March 15,2024

Informacje o reCAPTCHA v2#

reCAPTCHA v2 to system kodów weryfikacyjnych opracowany przez Google, aby pomóc witrynom internetowym odróżnić użytkowników od zautomatyzowanych programów (takich jak boty). Weryfikuje ludzką tożsamość użytkownika, wymagając od niego kliknięcia pola wyboru przed wykonaniem czynności, takiej jak przesłanie formularza lub logowanie. reCAPTCHA v2 określa, czy użytkownik jest prawdziwym człowiekiem, analizując takie informacje, jak zachowanie użytkownika podczas klikania i wzorce przeglądania.

Rodzaje reCAPTCHA v2#

  • Checkbox

Jak pokazano, pole wyboru „Nie jestem robotem” wymaga od użytkownika kliknięcia pola wyboru wskazującego, że użytkownik nie jest robotem. Spowoduje to natychmiastową weryfikację użytkownika (bez captcha) lub sprawdzenie go, czy jest człowiekiem

newCaptchaAnchor

  • Invisible

Jak pokazano, niewidoczna plakietka reCAPTCHA nie wymaga od użytkownika kliknięcia pola wyboru, lecz jest wywoływana bezpośrednio, gdy użytkownik kliknie istniejący przycisk w witrynie, lub może zostać wywołana poprzez wywołanie interfejsu API JavaScript. Integracja wymaga wywołania zwrotnego JavaScript po zakończeniu sprawdzania poprawności reCAPTCHA. Domyślnie tylko najbardziej podejrzany ruch zostanie poproszony o rozwiązanie CAPTCHA

Untitled

W tym artykule wyjaśnimy tajemnice CAPTCHA i omówimy proces budowania prostego solwera reCAPTCHA v2 przy użyciu nodejs.

Przygotowanie środowiska#

Najpierw upewnij się, że Nodejs jest zainstalowany w twoim systemie. Dodatkowo zainstaluj wymagane biblioteki:
npm install axios
npm install cheerio
Gdy docelowa strona internetowa jest stroną statyczną, bezpośrednio używamy `axios` do pobrania odpowiedniej strony internetowej, a następnie używamy `cheerio` do analizy strony internetowej i wyodrębnienia odpowiednich danych potrzebnych do ominięcia reCAPTCHA v2 Zanim przystąpimy do oficjalnego obejścia należy zarejestrować stronę NextCaptcha.Po zarejestrowaniu konta można w tle pobrać klucz do konta jakim jest ClientKey i zapisać go do późniejszego wykorzystania. Po uzyskaniu odpowiedniego klucza klienta oficjalnie rozpoczynamy podróż w celu ominięcia reCAPTCHA v2. Tutaj używamy oficjalnej wersji demonstracyjnej jako przykładu. Adres URL to https://www.google.com/recaptcha/api2/demo

Pobierz kod HTML strony internetowej#

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

Uzyskaj parametry powiązane z 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;
    }
}
 

Kompiluj, aby ominąć żądania 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;
    }
}

Uzyskaj wyniki zadania obejścia 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;
    }
}

umieścić je razem#

gRecaptchaResponse w otrzymanym „wyniku” to token rozwiązany przez reCAPTCHA v2. Za pomocą tego klucza możemy przesłać go do odpowiedniego interfejsu witryny.
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()