Как обойти reCAPTCHA v2 в Nodejs#

logoNextCaptcha
March 15,2024

О reCAPTCHA v2#

reCAPTCHA v2 — это система проверочных кодов, разработанная Google, чтобы помочь веб-сайтам различать пользователей-людей и автоматизированные программы (например, ботов). Он проверяет человеческую личность пользователя, требуя от него установить флажок перед выполнением такого действия, как отправка формы или вход в систему. reCAPTCHA v2 определяет, является ли пользователь реальным человеком, анализируя такую ​​информацию, как поведение пользователя при нажатии и шаблоны просмотра.

Типы reCAPTCHA v2#

  • Checkbox

Как показано, флажок «Я не робот» требует от пользователя установить флажок, указывающий, что пользователь не является роботом. Это немедленно проверит пользователя (без капчи) или бросит ему вызов, что он человек.

newCaptchaAnchor

  • Invisible

Как показано, невидимый значок reCAPTCHA не требует от пользователя установки флажка, а вместо этого вызывается непосредственно, когда пользователь нажимает существующую кнопку на сайте, или может быть вызван через вызов API JavaScript. Для интеграции требуется обратный вызов JavaScript после завершения проверки reCAPTCHA. По умолчанию только самый подозрительный трафик будет предлагаться пройти CAPTCHA.

Untitled

В этой статье мы раскроем тайны CAPTCHA и рассмотрим процесс создания простого решателя reCAPTCHA v2 с использованием nodejs.

Экологическая подготовка#

Сначала убедитесь, что в вашей системе установлен Nodejs. Дополнительно установите необходимые библиотеки:
npm install axios
npm install cheerio
Когда целевая веб-страница является статической, мы напрямую используем «axios» для загрузки соответствующей веб-страницы, а затем используем «cheerio» для анализа веб-страницы и извлечения соответствующих данных, необходимых для обхода reCAPTCHA v2. Прежде чем мы начнем официальный обход, нам необходимо зарегистрировать сайт NextCaptcha.После регистрации учетной записи вы можете получить ключ учетной записи в фоновом режиме, который является clientKey, и сохранить его для дальнейшего использования. После получения соответствующего clientKey мы официально начинаем путь к обходу reCAPTCHA v2. Здесь в качестве примера мы используем официальную демо-версию. URL-адрес: https://www.google.com/recaptcha/api2/demo.

Получить HTML-код веб-страницы#

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

Получить параметры, связанные с 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;
    }
}
 

Сборка для обхода запросов 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;
    }
}

Получите результаты задачи обхода 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;
    }
}

соединить их вместе#

gRecaptchaResponse в полученном «результате» — это токен, решенный reCAPTCHA v2. Мы можем использовать этот ключ, чтобы отправить его в соответствующий интерфейс веб-сайта.
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()