Menu

Cara menggunakan plugin Anti-Captcha di Puppeteer atau Selenium

Puppeteer dan Selenium adalah dua mesin utama untuk automasi peramban dan plugin kami terintegrasi mulus dengan keduanya. Dalam artikel ini, kami akan menunjukkan cara menggunakannya di Puppeteer dan Selenium secara berurutan untuk bahasa pemrograman NodeJS dan Python. Jika Anda memilih salah satu dari keduanya, kami sangat menyarankan NodeJS+Puppeteer untuk lingkungan aslinya.

1. Instal dependensi. Untuk NodeJS, cukup instal paket npm yang diberikan di bawah ini, untuk Python, instal paket dan unduh "chromedriver" yang dapat dieksekusi dari halaman ini. Versi driver ini harus cocok dengan versi Chrome yang diinstal di sistem Anda.

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

2. Unduh plugin dalam versi ZIP untuk Chrome, buka zip ke folder proyek Anda. Versi aktualnya ada di sini. Anda juga dapat melakukannya secara programmatikal:

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

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

3. Berikutnya, konfigurasikan kunci api Anda di file ./plugin/js/config_ac_api_key.js. Anda dapat menemukan kunci API di area pelanggan. Saldo positif diperlukan agar kunci bisa bekerja.

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. Jalankan peramban dengan plugin. Untuk Puppeteer, kami menyarankan plugin 'puppeteer-extra-plugin-stealth' untuk 'puppeteer-extra' package, yang menyembunyikan semua tanda dari peramban Chromium dengan automasi web.

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. Arahkan ke halaman target dan isi form bila perlu. Plugin akan mengambil Recaptcha secara otomatis dan mulai memecahkannya.

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. Berikut adalah bagian yang sedikit sulit. Beberapa form web mengharuskan pengguna untuk menekan tombol kirim setelah memecahkan Recaptcha, form lainnya menggunakan callback dan mengirimkannya secara otomatis. Dalam kasus pertama, kita perlu menekan tombol kirim segera setelah Recaptcha dipecahkan. Untuk melakukannya di waktu yang tepat, cukup tunggu selektor .antigate_solver.solved muncul, lalu tekan tombol kirim.

Node.js
Python
// tunggu selektor "solved" muncul
await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
console.log('recaptcha dipecahkan');

// tekan tombol kirim
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('tugas selesai, form dengan recaptcha dilewati ');
# tunggu selektor "solved" muncul
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()

Itu saja. Form terisi, Recaptcha dipecahkan dan dilewati. Sampel kode lengkap:

Node.js
Python

Cara mengintegrasikan ekstensi browser Anti-Captcha di 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 () => {
    // unduh plugin
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // buka zip
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);

    // atur kunci API dalam file konfigurasi
    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();
        }
    });

    // atur opsi peluncuran peramban
    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 {
        // luncurkan peramban dengan plugin
        const browser = await puppeteer.launch();
        page = await browser.newPage();
    } catch (e) {
        console.log('could not launch browser: '+e.toString())
        return;
    }

    // arahkan ke halaman target
    try {
        await page.goto(url, {
            waitUntil: "networkidle0"
        });
    } catch (e) {
        console.error('err while loading the page: '+e);
    }

    // nonaktifkan kesalahan timeout saat navigasi
    await page.setDefaultNavigationTimeout(0);

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

    // tunggu selektor "solved" muncul
    await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
    console.log('recaptcha dipecahkan');

    // tekan tombol kirim
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('recaptcha dipecahkan');

})();

Cara mengintegrasikan ekstensi browser Anti-Captcha di Python

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

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

# atur kunci API dalam file konfigurasi
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 direktori plugin kembali ke 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()

# atur opsi peluncuran peramban
options = webdriver.ChromeOptions()
options.add_extension('./plugin.zip')

# atur opsi peluncuran peramban
browser = webdriver.Chrome('./chromedriver', options=options)

# arahkan ke halaman target
browser.get('https://anti-captcha.com/demo/?page=recaptcha_v2_textarea')

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

# tunggu selektor "solved" muncul
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))

# tekan tombol kirim
browser.find_element_by_css_selector('#submitButton').click()

Bonus: ada trik untuk menjalankan plugin dalam mode headless, karena Chrome tidak mendukung automasi peramban dengan plugin. Gunakan utilitas yang dinamakan Xvfb yang menyediakan desktop virtual untuk aplikasi Anda.

Node.js
Python
# instal paket
apt-get install -y xvfb

# atur variabel tampilan
export DISPLAY=:0

# mulai daemon Xvfb di latar belakang (hanya sekali)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# tunggu sebentar untuk membiarkannya muncul (hanya sekali)
sleep 5

# tambahkan prefiks "xvfb-run" ke skrip "node" atau "python"
xvfb-run node myscript.js
# instal paket
apt-get install -y xvfb

# atur variabel tampilan
export DISPLAY=:0

# mulai daemon Xvfb di latar belakang (hanya sekali)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# tunggu sebentar untuk membiarkannya muncul (hanya sekali)
sleep 5

# tambahkan prefiks "xvfb-run" ke skrip "node" atau "python"
xvfb-run python myscript.py