close menu
Підтримувані типи завдань
Методи API
Статті
GitHub icon
GitHub
Menu

Як використовувати плагін Anti-Captcha у Puppeteer або Selenium

Puppeteer та Selenium — два основні движки для автоматизації браузерів, і наш плагін легко інтегрується в них. У цій статті ми покажемо, як його використовувати в Puppeteer та Selenium для мов програмування NodeJS та Python відповідно. Якщо ви обираєте між двома, ми настійно рекомендуємо NodeJS+Puppeteer за його нативне середовище.

1. Встановіть залежності. Для NodeJS просто встановіть зазначені нижче пакети npm, для Python встановіть пакети і завантажте драйвер "chromedriver" з цієї сторінки. Версія драйвера повинна відповідати версії Chrome, встановленій у вашій системі.

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

2. Завантажте плагін у ZIP -версії для Chrome, розпакуйте його в директорію проекту. Актуальні версії знаходяться тут. Ви також можете зробити це програмно:

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 () => {
    // завантажте плагін
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // розпакуйте його
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);
})();

3. Далі налаштуйте ключ API у файлі ./plugin/js/config_ac_api_key.js. Ви можете знайти свій ключ API у клієнтській області. Для того, щоб все запрацювало, вам знадобиться позитивний баланс.

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. Ініціалізуйте браузер за допомогою плагіна. Для Puppeteer ми рекомендуємо плагін 'puppeteer-extra-plugin-stealth' для пакета 'puppeteer-extra', який приховує всі ознаки веб-автоматизованого браузера Chromium.

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. Перейдіть на цільову сторінку і заповніть форму, якщо потрібно. Плагін автоматично визначить 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);
    }
    // вимкніть помилки тайм-ауту навігації
    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. Далі трохи складніше. Деякі веб-форми вимагають від користувача натиснути кнопку після вирішення Recaptcha, інші використовують зворотні дзвінки та надсилают їх автоматично. У першому випадку ми хочемо натиснути кнопку Надіслати відразу після того, як Recaptcha була вирішена. Щоб зробити це в потрібний час, просто зачекайте, поки з’явиться селектор .antigate_solver.solved, а потім натисніть кнопку Надіслати.

Javascript
Python
// дочекайтеся появи селектора "вирішено"
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') }}');

// натисніть кнопку надіслати
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('завдання виконано, форму з recaptcha обійдено');

На цьому все, форма заповнена, Recaptcha вирішена і пройдена. Повні приклади коду:

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 () => {
    // завантажте плагін
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // розпакуйте його
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);

    // встановіть ключ API у файлі конфігурації
    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();
        }
    });

    // встановіть параметри запуску браузера
    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 {
        // запустіть браузер з плагіном
        const browser = await puppeteer.launch();
        page = await browser.newPage();
    } catch (e) {
        console.log('could not launch browser: '+e.toString())
        return;
    }

    // перейдіть до цільової сторінки
    try {
        await page.goto(url, {
            waitUntil: "networkidle0"
        });
    } catch (e) {
        console.error('err while loading the page: '+e);
    }

    // вимкніть помилки тайм-ауту навігації
    await page.setDefaultNavigationTimeout(0);

    // заповніть форму
    await page.$eval('#login', (element, login) => {
        element.value = login;
    }, login);
    await page.$eval('#password', (element, password) => {
        element.value = password;
    }, password);

    // дочекайтеся появи селектора "вирішено"
    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') }}');

    // натисніть кнопку надіслати
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('recaptcha вирішено');

})();

Бонус: є спосіб запуску плагіна в режимі headless, оскільки Chrome не підтримує автоматизацію браузера за допомогою плагінів. Використовуйте утиліту Xvfb, яка надає віртуальний робочий стіл для вашої програми.

# встановіть пакет
apt-get install -y xvfb

# встановіть змінну дисплея
export DISPLAY=:0

# запустіть демон Xvfb у фоновому режимі (лише один раз)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# почекайте трохи, щоб він з'явився (лише один раз)
sleep 5

# додайте префікс "xvfb-run" до скрипту "node" або "python"
xvfb-run node myscript.js
# або
xvfb-run python myscript.py