Меню документации

Как использовать плагин Anti-Captcha в Puppeteer или Selenium

Puppeteer и Selenium - два саммых главных движка для автоматизации браузеров, и наш плагин отлично интегрируется в них. В этой статье мы покажем как использовать его в Puppeteer и Selenium для соответствующих языков программирования NodeJS и Python. Если вы выбираете между двумя, мы настоятельно рекомендуем NodeJS+Puppeteer за его нативное окружение.

1. Установите зависимости. Для NodeJS просто установите указанные ниже пакеты npm, для Python установите пакеты и скачайте драйвер "chromedriver" с этой страницы. Версия драйвера должна совпадать с версией Хрома, установленного на вашей системе.

NodeJS
          npm install adm-zip puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
        
Python
          pip install selenium
        

2. Скачайте плагин в ZIP версии для Chrome, распакуйте его в директорию проекта. Актуальные версии находятся здесь. Вы также можете сделать это программно:

NodeJS
          //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);
})();
        
Python
          import urllib.request
import zipfile

url = 'https://antcpt.com/anticaptcha-plugin.zip'
# скачиваем плагин
filehandle, _ = urllib.request.urlretrieve(url)
# распаковываем его
with zipfile.ZipFile(filehandle, "r") as f:
    f.extractall("plugin")
        

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

NodeJS
          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!')
}
        
Python
          from pathlib import Path
import zipfile

# установить ключ API в файле конфигурации
api_key = "API_KEY_32_BYTES"
file = Path('./plugin/js/config_ac_api_key.js')
file.write_text(file.read_text().replace("antiCapthaPredefinedApiKey = ''", "antiCapthaPredefinedApiKey = '{}'".format(api_key)))

# запакуйте директорию плагина обратно в plugin.zip
zip_file = zipfile.ZipFile('./plugin.zip', 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk("./plugin"):
        for file in files:
            path = os.path.join(root, file)
            zip_file.write(path, arcname=path.replace("./plugin/", ""))
zip_file.close()
        

4. Инициализируйте браузер с плагином. Для Puppeteer мы рекомендуем плагин 'puppeteer-extra-plugin-stealth' для пакет 'puppeteer-extra', который скрывает все признаки веб-автоматизации браузера Chromium.

NodeJS
          //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();
})();
        
Python
          from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_extension('./plugin.zip')

browser = webdriver.Chrome('./chromedriver', options=options)
        

5. Перейдите на целевую страницу и заполните форму если требуется. Плагин определит рекапчу автоматически и начнет ее распознавать.

NodeJS
          (async () => {
    const url = 'https://anti-captcha.com/tutorials/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);

})();
        
Python
          browser.get('https://anti-captcha.com/tutorials/v2-textarea')

# filling form
browser.find_element_by_css_selector('#login').send_keys('Test login')
browser.find_element_by_css_selector('#password').send_keys('Test password')

        

6. Далее чуть сложнее. Некоторые веб-формы требуют от пользователя нажать кнопку после решения рекапчи, другие используют колбэки и сабмитят их автоматически. В первом случае мы хотим нажать кнопку сабмита сразу же после окончания решения рекапчи. Чтобы сделать это в правильное время, просто ожидайте появления селектора .antigate_solver.solved на странице, и после этого нажимайте кнопку "отправить".

NodeJS
          // ожилаем появления селектора "solved"
await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
console.log('рекапча решена');

// нажимаем кнопку самбита
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('задача выполнена, форма с рекапчей пройдена');
        
Python
          # ожилаем появления селектора "solved"
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))
# нажимаем кнопку самбита
browser.find_element_by_css_selector('#submitButton').click()
        

На этом всё, форма заполнена, рекапча решена и пройдена. Полные примеры кода:

NodeJS
          // 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/tutorials/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);

    // ожилаем появления селектора "solved"
    await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
    console.log('рекапча решена');

    // нажимаем кнопку самбита
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('рекапча решена');

})();
        
Python
          import urllib.request
import zipfile
import os
from pathlib import Path
from selenium import webdriver

# скачиваем плагин
url = 'https://antcpt.com/anticaptcha-plugin.zip'
filehandle, _ = urllib.request.urlretrieve(url)
# распаковываем его
with zipfile.ZipFile(filehandle, "r") as f:
    f.extractall("plugin")

# установить ключ API в файле конфигурации
api_key = "YOUR_API_KEY_HERE!"
file = Path('./plugin/js/config_ac_api_key.js')
file.write_text(file.read_text().replace("antiCapthaPredefinedApiKey = ''", "antiCapthaPredefinedApiKey = '{}'".format(api_key)))

# запакуйте директорию плагина обратно в plugin.zip
zip_file = zipfile.ZipFile('./plugin.zip', 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk("./plugin"):
        for file in files:
            path = os.path.join(root, file)
            zip_file.write(path, arcname=path.replace("./plugin/", ""))
zip_file.close()

# устанавливаем опции запуска браузера
options = webdriver.ChromeOptions()
options.add_extension('./plugin.zip')

# устанавливаем опции запуска браузера
browser = webdriver.Chrome('./chromedriver', options=options)

# переходим на целевую страницу
browser.get('https://anti-captcha.com/tutorials/v2-textarea')

# заполняем форму
browser.find_element_by_css_selector('#login').send_keys('Test login')
browser.find_element_by_css_selector('#password').send_keys('Test password')

# ожилаем появления селектора "solved"
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))

# нажимаем кнопку самбита
browser.find_element_by_css_selector('#submitButton').click()
        

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

bash
          # устанавливаем пакет
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