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.

Node.js
Python
npm install adm-zip puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
pip3 install selenium

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:

Node.js
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);
})();
import urllib.request
import zipfile

url = 'https://antcpt.com/anticaptcha-plugin.zip'
# download de plugin
filehandle, _ = urllib.request.urlretrieve(url)
# uitpakken
with zipfile.ZipFile(filehandle, "r") as f:
    f.extractall("plugin")

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.

Node.js
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!')
}
from pathlib import Path
import zipfile

# `+t('articles.how-to-integrate.code-comments.set-api-key')+`
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)))

# `+t('articles.how-to-integrate.code-comments.zip-back')+`
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. 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.

Node.js
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();
})();
from selenium import webdriver

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

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

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.

Node.js
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);
    }
    // `+t('articles.how-to-integrate.code-comments.disable-timeouts')+`
    await page.setDefaultNavigationTimeout(0);

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

})();
browser.get('https://anti-captcha.com/demo/?page=recaptcha_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. 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.

Node.js
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('recaptcha opgelost');

// druk op de verzendknop
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('taak voltooid, formulier met recaptcha omzeild ');
# wacht tot de selector "opgelost" verschijnt
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))
# articles.how-to-integrate.code-comments.press-submit
browser.find_element_by_css_selector('#submitButton').click()

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

Node.js
Python

Hoe je de Anti-Captcha-browserextensie integreert in Node.js

// 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('recaptcha opgelost');

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

})();

Hoe je de Anti-Captcha-browserextensie integreert in Python

import urllib.request
import zipfile
import os
from pathlib import Path
from selenium import webdriver

# download de plugin
url = 'https://antcpt.com/anticaptcha-plugin.zip'
filehandle, _ = urllib.request.urlretrieve(url)
# uitpakken
with zipfile.ZipFile(filehandle, "r") as f:
    f.extractall("plugin")

# stel API-sleutel in het configuratiebestand in
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)))

# zip plugin directory terug naar 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()

# stel de browser opstartopties in
options = webdriver.ChromeOptions()
options.add_extension('./plugin.zip')

# stel de browser opstartopties in
browser = webdriver.Chrome('./chromedriver', options=options)

# navigeer naar de doelpagina
browser.get('https://anti-captcha.com/demo/?page=recaptcha_v2_textarea')

# vul het formulier in
browser.find_element_by_css_selector('#login').send_keys('Test login')
browser.find_element_by_css_selector('#password').send_keys('Test password')

# wacht tot de selector "opgelost" verschijnt
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))

# druk op de verzendknop
browser.find_element_by_css_selector('#submitButton').click()

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.

Node.js
Python
# 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
# 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 python myscript.py