Cách vượt qua reCAPTCHA v2 trong Nodejs#

logoNextCaptcha
March 15,2024

Giới thiệu về reCAPTCHA v2#

reCAPTCHA v2 là hệ thống mã xác minh được Google phát triển để giúp các trang web phân biệt giữa người dùng con người và các chương trình tự động (chẳng hạn như bot). Nó xác minh danh tính con người của người dùng bằng cách yêu cầu họ nhấp vào hộp kiểm trước khi hoàn thành một hành động như gửi biểu mẫu hoặc đăng nhập. reCAPTCHA v2 xác định xem người dùng có phải là người thật hay không bằng cách phân tích thông tin như hành vi nhấp chuột và kiểu duyệt web của người dùng.

Các loại reCAPTCHA v2#

  • Checkbox

Như được hiển thị, hộp kiểm "Tôi không phải là robot" yêu cầu người dùng nhấp vào hộp kiểm cho biết người dùng không phải là robot. Điều này sẽ ngay lập tức được người dùng xác minh (không có hình ảnh xác thực) hoặc thách thức họ rằng họ là con người

newCaptchaAnchor

  • Invisible

Như được hiển thị, huy hiệu reCAPTCHA vô hình không yêu cầu người dùng nhấp vào hộp kiểm mà thay vào đó được gọi trực tiếp khi người dùng nhấp vào nút hiện có trên trang web hoặc có thể được gọi thông qua lệnh gọi API JavaScript. Việc tích hợp yêu cầu gọi lại JavaScript sau khi quá trình xác thực reCAPTCHA hoàn tất. Theo mặc định, chỉ những lưu lượng truy cập đáng ngờ nhất mới được nhắc giải CAPTCHA

Untitled

Trong bài viết này, chúng tôi sẽ làm sáng tỏ CAPTCHA và hướng dẫn quy trình xây dựng bộ giải reCAPTCHA v2 đơn giản bằng cách sử dụng nodejs.

Chuẩn bị môi trường#

Trước tiên, hãy đảm bảo Nodejs được cài đặt trên hệ thống của bạn. Ngoài ra, cài đặt các thư viện cần thiết:
npm install axios
npm install cheerio
Khi trang web mục tiêu là một trang tĩnh, chúng tôi trực tiếp sử dụng `axios` để tải xuống trang web có liên quan, sau đó sử dụng `cheerio` để phân tích trang web và trích xuất dữ liệu liên quan cần thiết để vượt qua reCAPTCHA v2 Trước khi bắt đầu bỏ qua chính thức, chúng ta cần đăng ký trang web NextCaptcha, sau khi đăng ký tài khoản, bạn có thể lấy khóa tài khoản ở chế độ nền, đó là clientKey và lưu nó để sử dụng sau. Sau khi có được clientKey liên quan, chúng tôi chính thức bắt đầu hành trình vượt qua reCAPTCHA v2. Ở đây chúng tôi sử dụng Demo chính thức làm ví dụ. URL là https://www.google.com/recaptcha/api2/demo

Lấy HTML của một trang 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');

Nhận các thông số liên quan đến 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;
    }
}
 

Xây dựng để bỏ qua các yêu cầu 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;
    }
}

Nhận kết quả nhiệm vụ bỏ qua 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;
    }
}

đặt chung lại vơi nhau#

gRecaptchaResponse trong `result` thu được là mã thông báo được giải quyết bằng reCAPTCHA v2. Chúng ta có thể sử dụng khóa này để gửi nó đến giao diện liên quan của trang 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()