CAPSOLVER
Blog
Cách giải quyết CAPTCHA của AWS bằng NodeJS

Cách giải Captcha của AWS bằng NodeJS

Logo of CapSolver

Anh Tuan

Data Science Expert

03-Nov-2025

Trong môi trường web hiện đại, việc bảo vệ các tài nguyên trực tuyến khỏi các mối đe dọa tự động là rất quan trọng. AWS Web Application Firewall (WAF) là lớp bảo mật mạnh mẽ thường triển khai các thử thách hoặc captcha được quản lý để lọc các bot độc hại. Mặc dù hiệu quả đối với bảo mật, các cơ chế này tạo ra rào cản đáng kể cho các nhiệm vụ tự động hợp pháp, chẳng hạn như quét web, giám sát hoặc kiểm thử.

Hướng dẫn toàn diện này cung cấp một giải pháp tự động mạnh mẽ sử dụng Node.js và dịch vụ CapSolver. Chúng ta sẽ hướng dẫn bạn thiết lập môi trường, triển khai một đoạn mã Node.js có cấu trúc và sử dụng chức năng AntiAwsWafTask chuyên dụng của CapSolver để vượt qua cả tình huống WAF Challenge (HTTP 202) và WAF Captcha (HTTP 405). Đến cuối hướng dẫn này, bạn sẽ có một đoạn mã có thể sử dụng trong sản xuất, có khả năng lấy cookie aws-waf-token cần thiết để truy cập nội dung được bảo vệ.

⚙️ Yêu cầu trước

Trước khi bắt đầu, hãy đảm bảo bạn đã chuẩn bị đầy đủ môi trường và thông tin sau:

  1. Môi trường Node.js: Node.js đã được cài đặt trên hệ thống của bạn (phiên bản LTS được khuyến nghị).
  2. Khóa API CapSolver: Bạn cần tài khoản CapSolver và khóa API của mình.
  3. Proxy (Tùy chọn): Nếu trang web mục tiêu có hạn chế địa lý hoặc bạn cần ẩn địa chỉ IP thực của mình, hãy chuẩn bị proxy HTTP/HTTPS.

🛠️ Bước Một: Cài đặt Các Thư viện Cần Thiết

Trong thư mục dự án của bạn, thực hiện lệnh sau để cài đặt các module Node.js cần thiết:

bash Copy
npm install axios cheerio
  • axios: Được sử dụng để gửi các yêu cầu HTTP.
  • cheerio: Được sử dụng để phân tích nội dung HTML và trích xuất các tham số cần thiết cho thử thách WAF của AWS.

💻 Bước Hai: Triển Khai Mã Nguồn Node.js

Dưới đây là đoạn mã Node.js để giải các thử thách và captcha của AWS WAF. Đoạn mã này tự động phát hiện mã trạng thái được trả về bởi trang web và thực hiện nhiệm vụ CapSolver tương ứng khi cần thiết.

Hãy lưu đoạn mã sau dưới tên aws_waf_solver.js.

javascript Copy
const axios = require('axios');
const cheerio = require('cheerio');
const { URL } = require('url');

// ⚠️ Cấu hình: Vui lòng thay thế bằng giá trị thực tế của bạn
const CLIENT_KEY = "KHÓA_API_CAPSOLVER_CỦA_BẠN"; // Thay thế bằng khóa API CapSolver của bạn
const PAGE_URL = "https://norway-meetup.aws.wslab.no/"; // Thay thế bằng URL trang web mục tiêu
const PROXY = "ĐỊA CHỈ_PROXY_CỦA_BẠN"; // Thay thế bằng địa chỉ proxy của bạn (Định dạng: user:pass@ip:port hoặc ip:port)

// --- Hàm Hỗ trợ ---

/**
 * Tạm dừng thực thi trong một số miligiây nhất định
 * @param {number} ms Miligiây
 */
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

/**
 * Tạo một nhiệm vụ với CapSolver
 * @param {object} payload Dữ liệu nhiệm vụ
 * @returns {Promise<object>} Kết quả tạo nhiệm vụ
 */
async function createTask(payload) {
    try {
        const res = await axios.post('https://api.capsolver.com/createTask', {
            clientKey: CLIENT_KEY,
            task: payload
        });
        if (res.data.errorId !== 0) {
            throw new Error(`Lỗi API CapSolver: ${res.data.errorDescription}`);
        }
        return res.data;
    } catch (error) {
        console.error("Không thể tạo nhiệm vụ CapSolver:", error.message);
        return null;
    }
}

/**
 * Lấy kết quả nhiệm vụ CapSolver cho đến khi nhiệm vụ hoàn tất
 * @param {string} taskId ID nhiệm vụ
 * @returns {Promise<object>} Kết quả nhiệm vụ
 */
async function getTaskResult(taskId) {
    if (!taskId) return null;
    console.log(`Đang chờ kết quả nhiệm vụ (ID: ${taskId})...`);
    try {
        let success = false;
        let result = null;
        while (!success) {
            await sleep(3000); // Kiểm tra mỗi 3 giây
            const res = await axios.post('https://api.capsolver.com/getTaskResult', {
                clientKey: CLIENT_KEY,
                taskId: taskId
            });

            if (res.data.errorId !== 0) {
                throw new Error(`Lỗi API CapSolver: ${res.data.errorDescription}`);
            }

            if (res.data.status === "ready") {
                success = true;
                result = res.data;
                console.log("Nhiệm vụ hoàn tất, giải pháp đã được thu thập.");
            } else if (res.data.status === "processing") {
                console.log("Nhiệm vụ vẫn đang được xử lý...");
            }
        }
        return result;
    } catch (error) {
        console.error("Không thể lấy kết quả nhiệm vụ CapSolver:", error.message);
        return null;
    }
}

// --- Hàm Giải Quyết Chính ---

/**
 * Giải thử thách AWS WAF (Mã trạng thái 202)
 * @param {string} awsChallengeJS URL JavaScript thử thách AWS
 * @returns {Promise<string|null>} Giá trị cookie AWS WAF đã giải
 */
async function solveAwsChallenge(awsChallengeJS) {
    console.log("Phát hiện thử thách AWS WAF (Mã trạng thái 202), bắt đầu giải...");
    const taskPayload = {
        type: "AntiAwsWafTask",
        websiteURL: PAGE_URL,
        awsChallengeJS,
        proxy: PROXY
    };
    const taskData = await createTask(taskPayload);
    if (!taskData) return null;

    const result = await getTaskResult(taskData.taskId);
    if (result && result.solution && result.solution.cookie) {
        return result.solution.cookie;
    }
    return null;
}

/**
 * Giải captcha + thử thách AWS WAF (Mã trạng thái 405)
 * @param {string} htmlContent Nội dung HTML chứa tham số captcha
 * @param {string} awsChallengeJS URL JavaScript thử thách AWS
 * @returns {Promise<string|null>} Giá trị cookie AWS WAF đã giải
 */
async function solveAwsCaptchaChallenge(htmlContent, awsChallengeJS) {
    console.log("Phát hiện captcha AWS WAF (Mã trạng thái 405), bắt đầu giải...");
    const $ = cheerio.load(htmlContent);
    const scriptContent = $("script[type='text/javascript']").last().html();

    if (!scriptContent) {
        console.error("Không thể tìm thấy nội dung script chứa tham số captcha.");
        return null;
    }

    // Sử dụng biểu thức chính quy để trích xuất các tham số chính
    const keyMatch = /"key":"(.*?)"/.exec(scriptContent);
    const ivMatch = /"iv":"(.*?)"/.exec(scriptContent);
    const contextMatch = /"context":"(.*?)"/.exec(scriptContent);

    const key = keyMatch ? keyMatch[1] : null;
    const iv = ivMatch ? ivMatch[1] : null;
    const context = contextMatch ? contextMatch[1] : null;

    if (!key || !iv || !context) {
        console.error("Không thể trích xuất tất cả các tham số captcha cần thiết (key, iv, context) từ script.");
        return null;
    }

    console.log(`Các tham số đã trích xuất: Key=${key}, IV=${iv}, Context=${context}`);

    const taskPayload = {
        type: "AntiAwsWafTask", // CapSolver sử dụng loại nhiệm vụ này cho tất cả các tình huống AWS WAF
        websiteURL: PAGE_URL,
        awsKey: key,
        awsIv: iv,
        awsContext: context,
        awsChallengeJS,
        proxy: PROXY
    };

    const taskData = await createTask(taskPayload);
    if (!taskData) return null;

    const result = await getTaskResult(taskData.taskId);
    if (result && result.solution && result.solution.cookie) {
        return result.solution.cookie;
    }
    return null;
}

/**
 * Hàm thực thi chính
 */
async function main() {
    let awsWafCookie = null;
    let initialResponse = null;

    // 1. Yêu cầu ban đầu đến trang đích
    try {
        console.log(`Yêu cầu trang đích: ${PAGE_URL}`);
        initialResponse = await axios.get(PAGE_URL, {
            headers: {
                // Gửi các tiêu đề yêu cầu giống trình duyệt
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
                "Accept-Encoding": "gzip, deflate, br",
                "Accept-Language": "en-US,en;q=0.9",
                "Cache-Control": "max-age=0",
                "Upgrade-Insecure-Requests": "1"
            },
            // Cho phép xử lý các mã trạng thái 2xx, 3xx, 4xx
            validateStatus: (status) => status >= 200 && status < 500
        });
        console.log(`Mã trạng thái phản hồi ban đầu: ${initialResponse.status}`);
    } catch (error) {
        console.error(`Yêu cầu ban đầu thất bại: ${error.message}`);
        return;
    }

    const $ = cheerio.load(initialResponse.data);
    const scriptTags = $('script[src*="token.awswaf.com"]');
    const awsChallengeJS = scriptTags.attr('src');

    if (!awsChallengeJS) {
        console.log("Không phát hiện script thử thách AWS WAF. Trang web có thể không được bảo vệ hoặc đã vượt qua.");
        // Nếu không có script thử thách, sử dụng phản hồi ban đầu trực tiếp
        if (initialResponse.status === 200) {
            console.log("Trang web đã được tải thành công.");
            // console.log(initialResponse.data); // In nội dung cuối cùng
            return;
        }
    } else {
        console.log(`Phát hiện URL script thử thách AWS WAF: ${awsChallengeJS}`);
    }


    // 2. Xác định và giải thử thách/captcha dựa trên mã trạng thái
    if (initialResponse.status === 202) {
        // Chỉ có thử thách AWS WAF
        awsWafCookie = await solveAwsChallenge(awsChallengeJS);
    } else if (initialResponse.status === 405) {
        // AWS WAF Captcha + Challenge
        awsWafCookie = await solveAwsCaptchaChallenge(initialResponse.data, awsChallengeJS);
    } else if (initialResponse.status === 200) {
        console.log("Trang web đã được tải thành công, không cần giải captcha.");
        // console.log(initialResponse.data); // In nội dung cuối cùng
        return;
    } else {
        console.log(`Gặp mã trạng thái không được xử lý: ${initialResponse.status}.`);
        return;
    }

    // 3. Yêu cầu lại trang đích bằng cookie đã nhận
    if (awsWafCookie) {
        try {
            console.log("\n--- Yêu cầu Thứ Hai: Sử dụng Cookie AWS WAF ---");
            console.log(`Cookie được sử dụng: ${awsWafCookie}`);

            const finalResponse = await axios.get(PAGE_URL, {
                headers: {
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
                    "Cookie": `aws-waf-token=${awsWafCookie}`
                },
                validateStatus: (status) => status === 200 // Mong đợi kết quả thành công cuối cùng
            });

            console.log(`Mã trạng thái phản hồi cuối cùng: ${finalResponse.status}`);
            console.log("Nội dung trang web đã được truy xuất thành công!");
            // console.log(finalResponse.data); // In nội dung cuối cùng
        } catch (error) {
            console.error(`Yêu cầu cuối cùng thất bại: ${error.message}`);
        }
    } else {
        console.log("Không thể nhận được Cookie AWS WAF, không thể thực hiện yêu cầu thứ hai.");
    }
}

main();

💡 Tóm Tắt Các Điểm Chính

Điểm chính Vấn đề trong mã gốc Cải tiến tối ưu hóa
Cài đặt Thư viện Thiếu cheerio, sử dụng định dạng ghi chú Python sai. Rõ ràng nêu rõ nhu cầu cài đặt axioscheerio, sử dụng định dạng ghi chú bash đúng.
Loại Nhiệm Vụ Sử dụng lẫn lộn FunCaptchaTaskProxylessAntiAwsWafTask. Sử dụng thống nhất loại nhiệm vụ được khuyến nghị chính thức của CapSolver là AntiAwsWafTask cho tất cả các tình huống AWS WAF.
Trích xuất Tham Số Logic trích xuất awsChallengeJS trong logic 405 không đầy đủ, không trích xuất trong logic 202. Trích xuất awsChallengeJS thống nhất sau yêu cầu ban đầu trong hàm main, và gọi các hàm giải quyết khác nhau dựa trên mã trạng thái (202 hoặc 405).
Xử Lý Lỗi Xử lý lỗi đơn giản, thiếu kiểm tra lỗi API và thông báo trạng thái. Thêm kiểm tra lỗi API (errorId !== 0) trong createTaskgetTaskResult, và cung cấp thông báo trạng thái trong quá trình xử lý nhiệm vụ.
Cấu Trúc Mã Nguồn Tất cả logic được tập trung trong hàm main, dẫn đến khả năng đọc kém. Tách biệt thành các hàm hỗ trợ rõ ràng (sleep, createTask, getTaskResult) và các hàm giải quyết chính (solveAwsChallenge, solveAwsCaptchaChallenge), giúp logic rõ ràng hơn.
Tiêu Đề Yêu Cầu Tiêu đề ban đầu thừa thãi và không đầy đủ. Đơn giản hóa và sử dụng tiêu đề yêu cầu mô phỏng trình duyệt tiêu chuẩn hơn.

❓ Câu Hỏi Thường Gặp (FAQ)

Câu hỏi: Tại sao tôi cần xử lý cả mã trạng thái HTTP 202 và HTTP 405?

Trả lời: AWS WAF sử dụng các biện pháp bảo mật khác nhau dẫn đến các mã trạng thái HTTP khác nhau:

  • HTTP 202 (Được chấp nhận): Thường chỉ ra rằng thử thách WAF được yêu cầu. Đây là kiểm tra bảo mật nhẹ, thường bao gồm việc chạy đoạn mã JavaScript.
  • HTTP 405 (Phương thức không được phép): Thường chỉ ra rằng captcha WAF được yêu cầu, là kiểm tra phức tạp hơn bao gồm việc giải các bài toán hình ảnh hoặc tương tác, cùng với các tham số thử thách. Đoạn mã của chúng tôi được thiết kế để tự động phát hiện và xử lý cả hai tình huống.

Câu hỏi: Tôi có thể sử dụng đoạn mã này mà không cần proxy không?

Trả lời: Có, bạn có thể. Biến PROXY là tùy chọn. Nếu bạn không cần proxy, bạn có thể đặt const PROXY = ""; trong cấu hình. Tuy nhiên, việc sử dụng proxy chất lượng cao là rất được khuyến khích cho các nhiệm vụ quét web và tự động hóa để tránh bị chặn IP và đảm bảo truy cập liên tục.

Câu hỏi: AntiAwsWafTask là gì?

Trả lời: AntiAwsWafTask là một loại nhiệm vụ chuyên dụng do CapSolver cung cấp, được thiết kế đặc biệt để xử lý cơ chế bảo mật AWS WAF. Nó xử lý thông minh các tham số thử thách (bao gồm awsKey, awsIv, awsContext, và awsChallengeJS) được trích xuất từ trang được bảo vệ và trả về cookie aws-waf-token hợp lệ cần thiết để vượt qua bảo vệ.

📚 Thông Tin Thêm

✅ Kết Luận

Hướng dẫn này đã trình bày một phương pháp mạnh mẽ và hiệu quả để giải quyết các thách thức và Captcha của AWS WAF một cách lập trình bằng Node.jsCapSolver. Bằng cách triển khai script mô-đun và tận dụng loại nhiệm vụ chuyên biệt của CapSolver, bạn có thể tích hợp liền mạch giải pháp này vào quy trình tự động hóa của mình. Chìa khóa thành công nằm ở việc xác định chính xác mã trạng thái WAF (202 hoặc 405), trích xuất các tham số cần thiết và sử dụng cookie aws-waf-token kết quả cho các yêu cầu tiếp theo. Cách tiếp cận này đảm bảo các nhiệm vụ tự động hóa của bạn có thể truy cập nội dung được bảo vệ bởi AWS WAF một cách đáng tin cậy.

Tuyên bố Tuân thủ: Thông tin được cung cấp trên blog này chỉ mang tính chất tham khảo. CapSolver cam kết tuân thủ tất cả các luật và quy định hiện hành. Việc sử dụng mạng lưới CapSolver cho các hoạt động bất hợp pháp, gian lận hoặc lạm dụng là hoàn toàn bị cấm và sẽ bị điều tra. Các giải pháp giải captcha của chúng tôi nâng cao trải nghiệm người dùng trong khi đảm bảo tuân thủ 100% trong việc giúp giải quyết các khó khăn về captcha trong quá trình thu thập dữ liệu công khai. Chúng tôi khuyến khích việc sử dụng dịch vụ của chúng tôi một cách có trách nhiệm. Để biết thêm thông tin, vui lòng truy cập Điều khoản Dịch vụ và Chính sách Quyền riêng tư.

Thêm

Cách giải CAPTCHA của AWS bằng NodeJS
Cách giải Captcha của AWS bằng NodeJS

Trong bài viết này, chúng tôi sẽ chỉ cho bạn cách giải quyết Captcha / Thách thức AWS bằng Node.JS.

aws waf
Logo of CapSolver

Anh Tuan

03-Nov-2025

Gỡ dữ liệu web so với API
So sánh Web Scraping và API: Thu thập dữ liệu bằng web scraping và API

Học cách phân biệt giữa web scraping và API, các ưu điểm và nhược điểm của chúng, và phương pháp nào hiệu quả nhất để thu thập dữ liệu web có cấu trúc hoặc không có cấu trúc.

aws waf
Logo of CapSolver

Anh Tuan

29-Oct-2025

Công cụ giải CAPTCHA cho Tường lửa ứng dụng web AWS
Giải CAPTCHA AWS WAF: Giải pháp Token & Hình ảnh cho Người quét trang web

Học cách giải quyết các thách thức CAPTCHA của AWS WAF cho việc quét web và tự động hóa. Hướng dẫn thực tế về các giải pháp dựa trên token và hình ảnh, so sánh giữa API và tích hợp trình duyệt, cũng như các nguyên tắc tốt nhất.

aws waf
Logo of CapSolver

Anh Tuan

28-Oct-2025

Cách giải quyết AWS WAF trong Crawl4AI với tích hợp CapSolver
Cách giải quyết AWS WAF trong Crawl4AI với tích hợp CapSolver

Học cách giải quyết các biện pháp bảo vệ AWS WAF trong Crawl4AI bằng cách sử dụng API của CapSolver và phương pháp tích hợp phần mở rộng trình duyệt. Hướng dẫn này cung cấp các ví dụ mã code để quét web mượt mà.

aws waf
Logo of CapSolver

Anh Tuan

21-Oct-2025

Người giải CAPTCHA tốt nhất cho AWS WAF dành cho tự động hóa và trích xuất dữ liệu
Giải CAPTCHA AWS WAF tốt nhất cho Tự động hóa và Quét dữ liệu

Khám phá giải pháp CAPTCHA cho AWS WAF tốt nhất. Giải pháp dựa trên AI của CapSolver vượt qua các thách thức WAF ngay lập tức, đảm bảo việc quét web và tự động hóa không gián đoạn trên quy mô lớn.

aws waf
Logo of CapSolver

Anh Tuan

17-Oct-2025