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.
npm install adm-zip puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
pip install selenium
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:
//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);
})();
import urllib.request
import zipfile
url = 'https://antcpt.com/anticaptcha-plugin.zip'
# Laden Sie das Plugin herunter
filehandle, _ = urllib.request.urlretrieve(url)
# entzippen
with zipfile.ZipFile(filehandle, "r") as f:
f.extractall("plugin")
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.
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
# Legen Sie den API-Schlüssel in der Konfigurationsdatei fest
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)))
# Zippen Sie das Plugin-Verzeichnis zurück zu 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. 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.
//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. 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.
(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);
})();
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. 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'.
// auf "solved" Selektor warten
await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
console.log('recaptcha gelöst');
// drücken Sie die Senden Taste
await Promise.all([
page.click('#submitButton'),
page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('Aufgabe abgeschlossen, Formular mit Recaptcha umgangen');
# auf "solved" Selektor warten
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))
# drücken Sie die Senden Taste
browser.find_element_by_css_selector('#submitButton').click()
Das war auch schon alles. Das Formular ist ausgefüllt, Recaptcha wurde gelöst und umgangen. Vollständige Code-Beispiele:
// 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('recaptcha gelöst');
// drücken Sie die Senden Taste
await Promise.all([
page.click('#submitButton'),
page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('recaptcha gelöst');
})();
import urllib.request
import zipfile
import os
from pathlib import Path
from selenium import webdriver
# Laden Sie das Plugin herunter
url = 'https://antcpt.com/anticaptcha-plugin.zip'
filehandle, _ = urllib.request.urlretrieve(url)
# entzippen
with zipfile.ZipFile(filehandle, "r") as f:
f.extractall("plugin")
# Legen Sie den API-Schlüssel in der Konfigurationsdatei fest
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)))
# Zippen Sie das Plugin-Verzeichnis zurück zu 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()
# Legen Sie die Browser-Startoptionen fest
options = webdriver.ChromeOptions()
options.add_extension('./plugin.zip')
# Legen Sie die Browser-Startoptionen fest
browser = webdriver.Chrome('./chromedriver', options=options)
# Navigieren Sie zur Ziel-Website
browser.get('https://anti-captcha.com/demo/?page=recaptcha_v2_textarea')
# Füllen Sie das Formular aus
browser.find_element_by_css_selector('#login').send_keys('Test login')
browser.find_element_by_css_selector('#password').send_keys('Test password')
# auf "solved" Selektor warten
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))
# drücken Sie die Senden Taste
browser.find_element_by_css_selector('#submitButton').click()
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