Menu

So verwenden Sie das Anti-Captcha Plugin in Puppeteer oder Selenium

Puppeteer und Selenium sind zwei wichtige Engines für die Browser-Automatisierung und unser Plugin lässt sich nahtlos in diese integrieren. In diesem Artikel zeigen wir Ihnen, wie man das Plugin in Puppeteer und Selenium für NodeJS bzw. Python Programmiersprachen verwendet. Wenn Sie sich für eine der beiden Sprachen entscheiden, empfehlen wir Ihnen aufgrund der nativen Umgebung NodeJS+Puppeteer.

1. Installieren Sie die Abhängigkeiten. Für NodeJS installieren Sie einfach die unten angegebenen npm-Pakete, für Python installieren Sie die Pakete und laden Sie die ausführbare "chromedriver" Datei von dieser Seite herunter. Die Driver-Version sollte mit der auf Ihrem System installierten Chrome-Version übereinstimmen.

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

2. Laden Sie das Plugin als ZIP-Version für Chrome herunter und entzippen Sie es in Ihrem Projektordner. Die aktuellen Versionen befinden sich hier. Dies ist auch programmgesteuert möglich:

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

3. Als nächstes konfigurieren Sie Ihren API-Schlüssel in der ./plugin/js/config_ac_api_key.js Datei. Sie finden Ihren API-Schlüssel im Kundenbereich. Sie benötigen ein positives Guthaben, damit es funktioniert.

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. Starten Sie den Browser mit dem Plugin. Für Puppeteer empfehlen wir das Plugin 'puppeteer-extra-plugin-stealth' für das Paket 'puppeteer-extra', das alle Anzeichen des web-automatisierten Chromium-Browsers verbirgt.

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. Navigieren Sie zu einer Zielseite und füllen Sie bei Bedarf ein Formular aus. Das Plugin erkennt Recaptcha automatisch und beginnt, es zu lösen.

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);
    }
    // Deaktivieren Sie Navigations-Timeout-Fehler
    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. Der nächste Teil ist ein wenig knifflig. Manche Webformulare erfordern, dass der Benutzer nach dem Lösen des Recaptcha einen Eingabe-Button drückt, andere nutzen Callbacks und senden sie automatisch. Im ersten Fall wollen wir den Eingabe-Button drücken, nachdem das Recaptcha gelöst wurde. Um dies zum richtigen Zeitpunkt zu tun, warten Sie einfach, bis der Selektor .antigate_solver.solved erscheint, und drücken Sie dann die Schaltfläche 'Senden'.

Javascript
Python
// auf "solved" Selektor warten
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') }}');

// drücken Sie die Senden Taste
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('Aufgabe abgeschlossen, Formular mit Recaptcha umgangen');

Das war auch schon alles. Das Formular ist ausgefüllt, Recaptcha wurde gelöst und umgangen. Vollständige Code-Beispiele:

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

    // Legen Sie den API-Schlüssel in der Konfigurationsdatei fest
    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();
        }
    });

    // Legen Sie die Browser-Startoptionen fest
    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 {
        // Starten Sie den Browser mit dem Plugin
        const browser = await puppeteer.launch();
        page = await browser.newPage();
    } catch (e) {
        console.log('could not launch browser: '+e.toString())
        return;
    }

    // Navigieren Sie zur Ziel-Website
    try {
        await page.goto(url, {
            waitUntil: "networkidle0"
        });
    } catch (e) {
        console.error('err while loading the page: '+e);
    }

    // Deaktivieren Sie Navigations-Timeout-Fehler
    await page.setDefaultNavigationTimeout(0);

    // Füllen Sie das Formular aus
    await page.$eval('#login', (element, login) => {
        element.value = login;
    }, login);
    await page.$eval('#password', (element, password) => {
        element.value = password;
    }, password);

    // auf "solved" Selektor warten
    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') }}');

    // drücken Sie die Senden Taste
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('recaptcha gelöst');

})();

Bonus: Es gibt einen Trick, um das Plugin in einem Headless-Modus auszuführen, da Chrome keine Browser-Automatisierung mit Plugins unterstützt. Verwenden Sie ein Programm namens Xvfb, das einen virtuellen Desktop für Ihre Anwendung bereitstellt.

# Installieren Sie das Paket
apt-get install -y xvfb

# Legen Sie die Anzeigevariable fest
export DISPLAY=:0

# Starten Sie den Xvfb-Daemon im Hintergrund (einmalig)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# warten Sie kurz, bis es erscheint (einmalig)
sleep 5

# Fügen Sie die Vorsilbe "xvfb-run" zum "node" oder "python" Script hinzu
xvfb-run node myscript.js
# oder
xvfb-run python myscript.py