Comment contourner reCAPTCHA v2 dans Nodejs#

logoNextCaptcha
March 15,2024

À propos de reCAPTCHA v2#

reCAPTCHA v2 est un système de code de vérification développé par Google pour aider les sites Web à faire la distinction entre les utilisateurs humains et les programmes automatisés (tels que les robots). Il vérifie l'identité humaine de l'utilisateur en lui demandant de cliquer sur une case à cocher avant d'effectuer une action telle que la soumission d'un formulaire ou la connexion. reCAPTCHA v2 détermine si l'utilisateur est un véritable humain en analysant des informations telles que le comportement de clic et les habitudes de navigation de l'utilisateur.

Types de reCAPTCHA v2#

  • Checkbox

Comme indiqué, la case à cocher « Je ne suis pas un robot » oblige l'utilisateur à cocher la case qui indique que l'utilisateur n'est pas un robot. Cela vérifiera immédiatement par l'utilisateur (sans captcha) ou le mettra au défi qu'il est humain

newCaptchaAnchor

  • Invisible

Comme indiqué, le badge reCAPTCHA invisible n'exige pas que l'utilisateur clique sur une case à cocher, mais est appelé directement lorsque l'utilisateur clique sur un bouton existant sur le site, ou peut être appelé via un appel d'API JavaScript. L'intégration nécessite un rappel JavaScript une fois la validation reCAPTCHA terminée. Par défaut, seul le trafic le plus suspect sera invité à résoudre un CAPTCHA

Untitled

Dans cet article, nous allons démystifier les CAPTCHA et parcourir le processus de création d'un simple solveur reCAPTCHA v2 à l'aide de nodejs.

Préparation environnementale#

Tout d’abord, assurez-vous que Nodejs est installé sur votre système. De plus, installez les bibliothèques requises :
npm install axios
npm install cheerio
Lorsque la page Web cible est une page statique, nous utilisons directement « axios » pour télécharger la page Web appropriée, puis utilisons « cheerio » pour analyser la page Web et extraire les données pertinentes nécessaires pour contourner reCAPTCHA v2. Avant de commencer le contournement officiel, nous devons enregistrer le site Web NextCaptcha. Après avoir enregistré un compte, vous pouvez obtenir une clé de compte en arrière-plan, qui est la clé client, et la sauvegarder pour une utilisation ultérieure. Après avoir obtenu la clé client correspondante, nous commençons officiellement le voyage pour contourner reCAPTCHA v2. Ici, nous utilisons la démo officielle comme exemple. L'URL est https://www.google.com/recaptcha/api2/demo

Récupérer le HTML d'une page 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');

Obtenir les paramètres liés à 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;
    }
}
 

Conçu pour contourner les requêtes 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;
    }
}

Obtenir les résultats des tâches de contournement 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;
    }
}

mets les ensemble#

La gRecaptchaResponse dans le « résultat » obtenu est le jeton résolu par reCAPTCHA v2. Nous pouvons utiliser cette clé pour le soumettre à l'interface appropriée du site 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()