Menu

Hoe u de Anti-Captcha plugin in Puppeteer of Selenium kunt gebruiken

Puppeteer en Selenium zijn de twee belangrijke engines voor browser automatisering en onze plugin integreert daarin naadloos. In dit artikel laten we zien hoe u het kunt gebruiken in Puppeteer en Selenium voor NodeJS en Python programmeertalen. Als u tussen deze twee kiest, adviseren we ten zeerste NodeJS+Puppeteer vanwege zijn native omgeving.

1. Installeer de afhankelijkheden. Voor NodeJS installeert u de npm-pakketten, voor Python installeert u de pakketten en downloadt u de uitvoerbare versie van "chromedriver" vanaf deze pagina. De driver-versie moet overeenkomen met de Chrome-versie die op uw systeem is geïnstalleerd.

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

2. Download de plugin in ZIP-versie voor Chrome en pak deze uit in uw projectmap. De echte versie vind u hier. U kunt het ook programmatisch doen:

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 () => {
    // download de plugin
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // uitpakken
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);
})();

3. Configureer volvolgens uw API-sleutel in het ./plugin/js/config_ac_api_key.js bestand. U kunt uw API-sleutel vinden in de klantgedeelte. U heeft een positief saldo nodig om het te laten werken.

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. Initialiseer de browser met de plugin. Voor Puppeteer raden we de plugin 'puppeteer-extra-plugin-stealth' aan voor het 'puppeteer-extra' pakket, die alle tekenen van web-geautomatiseerde Chromium browser verbergt.

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. Navigeer naar de doelpagina en vul het formulier in indien dit nodig is. De plugin zal meteen Recaptcha automatisch oppakken en beginnen met oplossen.

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);
    }
    // schakel navigatie timeout fouten uit
    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. Het volgende is een beetje lastig. Sommige webformulieren vereisen dat de gebruiker op een verzendknop drukt na het oplossen van de Recaptcha, anderen gebruiken callbacks en verzenden ze automatisch. In het eerste geval willen we op de verzendknop drukken direct nadat de Recaptcha is opgelost. Om dat op het juiste moment te doen, wacht u gewoon tot selector .antigate_solver.solved verschijnt en drukt u op de verzendknop.

Javascript
Python
// wacht tot de selector "opgelost" verschijnt
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') }}');

// druk op de verzendknop
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('taak voltooid, formulier met recaptcha omzeild');

Dat is het, het formulier is ingevuld, de Recaptcha is opgelost en omzeild. Voorbeelden van volledige code:

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 () => {
    // download de plugin
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // uitpakken
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);

    // stel API-sleutel in het configuratiebestand in
    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();
        }
    });

    // stel de browser opstartopties in
    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 {
        // start de browser met de plugin
        const browser = await puppeteer.launch();
        page = await browser.newPage();
    } catch (e) {
        console.log('could not launch browser: '+e.toString())
        return;
    }

    // navigeer naar de doelpagina
    try {
        await page.goto(url, {
            waitUntil: "networkidle0"
        });
    } catch (e) {
        console.error('err while loading the page: '+e);
    }

    // schakel navigatie timeout fouten uit
    await page.setDefaultNavigationTimeout(0);

    // vul het formulier in
    await page.$eval('#login', (element, login) => {
        element.value = login;
    }, login);
    await page.$eval('#password', (element, password) => {
        element.value = password;
    }, password);

    // wacht tot de selector "opgelost" verschijnt
    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') }}');

    // druk op de verzendknop
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('recaptcha opgelost');

})();

Bonus: er is een trucje om de plugin in een headless-modus uit te voeren, omdat Chrome geen browserautomatisering met plugins ondersteunt. Gebruik het hulpprogramma Xvfb dat een virtueel desktop biedt voor uw toepassing.

# installeer het pakket
apt-get install -y xvfb

# stel weergavevariabele in
export DISPLAY=:0

# start de Xvfb-daemon in de achtergrond (eenmalig)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# wacht even tot het verschijnt (eenmalig)
sleep 5

# voorvoegsel "xvfb-run" toevoegen aan "node" of "python" script
xvfb-run node myscript.js
# of
xvfb-run python myscript.py