Menu

Cách sử dụng plugin Anti-Captcha trong Puppeteer hoặc Selenium

Puppeteer và Selenium là hai công cụ chính để tự động hóa trình duyệt. Plugin của chúng tôi tích hợp liền mạch vào hai công cụ này. Trong bài viết này, chúng tôi sẽ hướng dẫn cách sử dụng plugin của chúng tôi trong Puppeteer và Selenium đối với các ngôn ngữ lập trình NodeJS và Python tương ứng. Nếu bạn muốn chọn một trong hai, chúng tôi đặc biệt khuyến nghị bạn sử dụng NodeJS+Puppeteer cho môi trường gốc.

1. Cài đặt đối tượng phụ thuộc. Đối với NodeJS, bạn chỉ cần cài đặt các gói npm nhất định ở bên dưới. Đối với Python, hãy cài đặt các gói và tải xuống tập tin thực thi "chromedriver" từ trang này. Phiên bản trình điều khiển phải khớp với phiên bản Chrome được cài đặt trên hệ thống của bạn.

Javascript
Python
npm install adm-zip puppeteer puppeteer-extra puppeteer-extra-plugin-stealth

2. Tải xuống plugin ở phiên bản ZIP dành cho Chrome và giải nén vào thư mục dự án của bạn. Các phiên bản thực tế sẽ nằm ở tại đây. Bạn cũng có thể thực hiện theo chương trình:

Javascript
Python
//npm install adm-zip
const https = require('https')
const fs = require('fs');
const AdmZip = require("adm-zip");

const pluginURL = 'https://antcpt.com/anticaptcha-plugin.zip';

(async () => {
    // tải xuống plugin
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // giải nén tập tin zip đó
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);
})();

3. Tiếp theo, cấu hình khóa API của bạn trong tập tin ./plugin/js/config_ac_api_key.js. Bạn có thể tìm thấy khóa API của mình trong giao diện khách hàng. Bạn sẽ cần có số dư dương để kích hoạt plugin.

Javascript
Python
const apiKey = 'API_KEY_32_BYTES';
if (fs.existsSync('./plugin/js/config_ac_api_key.js')) {
    let confData = fs.readFileSync('./plugin/js/config_ac_api_key.js', 'utf8');
    confData = confData.replace(/antiCapthaPredefinedApiKey = ''/g, `antiCapthaPredefinedApiKey = '${apiKey}'`);
    fs.writeFileSync('./plugin/js/config_ac_api_key.js', confData, 'utf8');
} else {
    console.error('plugin configuration not found!')
}

4. Khởi tạo trình duyệt với plugin. Đối với Puppeteer, chúng tôi khuyến nghị sử dụng plugin 'puppeteer-extra-plugin-stealth' dành cho gói 'puppeteer-extra’. Plugin này sẽ giúp bạn ẩn tất cả các dấu hiệu của trình duyệt Chromium tự động trên web.

Javascript
Python
//npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

(async () => {
    const browser = await puppeteer.launch({
        headless: false,
        ignoreDefaultArgs: [
            "--disable-extensions",
            "--enable-automation"
        ],
        args: [
            '--disable-web-security',
            '--disable-features=IsolateOrigins,site-per-process',
            '--allow-running-insecure-content',
            '--disable-blink-features=AutomationControlled',
            '--no-sandbox',
            '--mute-audio',
            '--no-zygote',
            '--no-xshm',
            '--window-size=1920,1080',
            '--no-first-run',
            '--no-default-browser-check',
            '--disable-dev-shm-usage',
            '--disable-gpu',
            '--enable-webgl',
            '--ignore-certificate-errors',
            '--lang=en-US,en;q=0.9',
            '--password-store=basic',
            '--disable-gpu-sandbox',
            '--disable-software-rasterizer',
            '--disable-background-timer-throttling',
            '--disable-backgrounding-occluded-windows',
            '--disable-renderer-backgrounding',
            '--disable-infobars',
            '--disable-breakpad',
            '--disable-canvas-aa',
            '--disable-2d-canvas-clip-aa',
            '--disable-gl-drawing-for-tests',
            '--enable-low-end-device-mode',
            '--disable-extensions-except=./plugin',
            '--load-extension=./plugin'
        ]
    });
    const page = await browser.newPage();
})();

5. Điều hướng đến trang đích và điền biểu mẫu nếu cần. Plugin sẽ tự động nhận và bắt đầu giải Recaptcha.

Javascript
Python
(async () => {
    const url = 'https://anti-captcha.com/demo/?page=recaptcha_v2_textarea';
    const login = 'Test login';
    const password = 'Test password';

    try {
        await page.goto(url, {
            waitUntil: "networkidle0"
        });
    } catch (e) {
        console.error('err while loading the page: '+e);
    }
    // vô hiệu hóa lỗi hết thời gian chờ điều hướng
    await page.setDefaultNavigationTimeout(0);

    await page.$eval('#login', (element, login) => {
        element.value = login;
    }, login);
    await page.$eval('#password', (element, password) => {
        element.value = password;
    }, password);

})();

6. Phần tiếp theo sẽ phức tạp hơn một chút. Biểu mẫu trên web Một số yêu cầu người dùng nhấn nút gửi sau khi giải Recaptcha, khác sử dụng lệnh gọi lại và tự động gửi chúng. Trong trường hợp đầu tiên, chúng tôi sẽ nhấn nút gửi ngay sau khi giải Recaptcha. Để thực hiện đúng lúc, bạn chỉ cần đợi bộ chọn .antigate_solver.solved xuất hiện rồi nhấn nút gửi.

Javascript
Python
// chờ bộ chọn "đã giải" xuất hiện
await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
console.log('{{ $t('articles.how-to-integrate.code-comments.recaptcha-solved') }}');

// nhấn nút gửi
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('tác vụ hoàn tất, biểu mẫu có recaptcha đã được bỏ qua');

Vậy là xong, biểu mẫu đã được điền, Recaptcha đã được giải và bỏ qua. Ví dụ về mã đầy đủ:

Javascript
Python
// first run the following to install required npm packages:
//
// npm install adm-zip follow-redirects puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
//
//
const https = require('follow-redirects').https;
const fs = require('fs');
const AdmZip = require("adm-zip");

const apiKey = 'YOUR_API_KEY_HERE!';
const pluginURL = 'https://antcpt.com/anticaptcha-plugin.zip';
const url = 'https://anti-captcha.com/demo/?page=recaptcha_v2_textarea';
const login = 'Test login';
const password = 'Test password';
let page = null;


const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

(async () => {
    // tải xuống plugin
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // giải nén tập tin zip đó
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);

    // đặt khóa API trong tập tin cấu hình
    await new Promise((resolve, reject) => {
        if (fs.existsSync('./plugin/js/config_ac_api_key.js')) {
            let confData = fs.readFileSync('./plugin/js/config_ac_api_key.js', 'utf8');
            confData = confData.replace(/antiCapthaPredefinedApiKey = ''/g, `antiCapthaPredefinedApiKey = '${apiKey}'`);
            fs.writeFileSync('./plugin/js/config_ac_api_key.js', confData, 'utf8');
            resolve();
        } else {
            console.error('plugin configuration not found!')
            reject();
        }
    });

    // đặt các tùy chọn khởi chạy trình duyệt
    const options = {
        headless: false,
        ignoreDefaultArgs: [
            "--disable-extensions",
            "--enable-automation"
        ],
        args: [
            '--disable-web-security',
            '--disable-features=IsolateOrigins,site-per-process',
            '--allow-running-insecure-content',
            '--disable-blink-features=AutomationControlled',
            '--no-sandbox',
            '--mute-audio',
            '--no-zygote',
            '--no-xshm',
            '--window-size=1920,1080',
            '--no-first-run',
            '--no-default-browser-check',
            '--disable-dev-shm-usage',
            '--disable-gpu',
            '--enable-webgl',
            '--ignore-certificate-errors',
            '--lang=en-US,en;q=0.9',
            '--password-store=basic',
            '--disable-gpu-sandbox',
            '--disable-software-rasterizer',
            '--disable-background-timer-throttling',
            '--disable-backgrounding-occluded-windows',
            '--disable-renderer-backgrounding',
            '--disable-infobars',
            '--disable-breakpad',
            '--disable-canvas-aa',
            '--disable-2d-canvas-clip-aa',
            '--disable-gl-drawing-for-tests',
            '--enable-low-end-device-mode',
            '--disable-extensions-except=./plugin',
            '--load-extension=./plugin'
        ]
    }

    try {
        // khởi chạy trình duyệt với plugin
        const browser = await puppeteer.launch();
        page = await browser.newPage();
    } catch (e) {
        console.log('could not launch browser: '+e.toString())
        return;
    }

    // điều hướng đến trang đích
    try {
        await page.goto(url, {
            waitUntil: "networkidle0"
        });
    } catch (e) {
        console.error('err while loading the page: '+e);
    }

    // vô hiệu hóa lỗi hết thời gian chờ điều hướng
    await page.setDefaultNavigationTimeout(0);

    // điền vào biểu mẫu
    await page.$eval('#login', (element, login) => {
        element.value = login;
    }, login);
    await page.$eval('#password', (element, password) => {
        element.value = password;
    }, password);

    // chờ bộ chọn "đã giải" xuất hiện
    await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
    console.log('{{ $t('articles.how-to-integrate.code-comments.recaptcha-solved') }}');

    // nhấn nút gửi
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('mã recaptcha đã được giải');

})();

Ghi chú thêm: có một mẹo để chạy plugin ở chế độ không có giao diện người dùng vì Chrome không hỗ trợ tự động hóa trình duyệt bằng plugin. Sử dụng tiện ích Xvfb để cung cấp màn hình ảo cho ứng dụng của bạn.

# cài đặt gói
apt-get install -y xvfb

# đặt các biến hiển thị
export DISPLAY=:0

# khởi chạy Xvfb daemon dưới nền (chỉ một lần)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# chờ một chút để bộ chọn đó xuất hiện (chỉ một lần)
sleep 5

# thêm tiền tố "xvfb-run" vào "node” hoặc tập lệnh "python"
xvfb-run node myscript.js
# hoặc
xvfb-run python myscript.py