Menu

Anti-Captcha eklentisi Puppeteer veya Selenium'da nasıl kullanılır

Puppeteer ve Selenium, tarayıcı otomasyonu için iki ana motordur ve eklentimiz bunlara sorunsuz bir şekilde entegre olur. Bu yazıda, sırasıyla NodeJS ve Python programlama dilleri için Puppeteer ve Selenium'da eklentimizi nasıl kullanılacağınızı göreceksiniz. İkisinden birini seçecekeniz, yerel ortam için NodeJS+Puppeteer'ı şiddetle tavsiye ederiz.

1. Bağımlılıkları yükleyin. NodeJS için aşağıda verilen npm paketlerini yükleyin, Python için paketleri yükleyin ve bu sayfadan "chromedriver" çalıştırılabilir dosyasını indirin. Sürücü sürümü, sisteminizde yüklü olan Chrome sürümüyle eşleşmelidir.

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

2. Eklentiyi Chrome için ZIP sürümünde indirin, proje klasörünüze açın. Gerçek sürümler burada bulunmaktadır. Bunu programlı olarak da yapabilirsiniz:

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 () => {
    // eklentiyi indirin
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // arşivden çıkarın
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);
})();

3. Daha sonra API anahtarınızı ./plugin/js/config_ac_api_key.js dosyasında yapılandırın. API anahtarınızı müşteri alanında bulabilirsiniz. Çalıştırmak için bir miktar pozitif dengeye ihtiyacınız olacak.

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. Tarayıcıyı eklenti ile başlatın. Puppeteer için, web otomasyonlu Chromium tarayıcısının tüm işaretlerini gizleyen 'puppeteer-extra' paketi için 'puppeteer-extra-plugin-stealth' eklentisini öneririz.

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. İstediğiniz bir sayfaya gidin ve gerekirse bir form doldurun. Eklenti, Recaptcha'yı otomatik olarak alır ve çözmeye başlar.

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);
    }
    // navigasyon zaman aşımı hatalarını devre dışı bırakın
    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. Sırada biraz zorlu bir kısım var. Bazı web formları, Recaptcha'yı çözdükten sonra kullanıcının gönder butonuna basmasını gerektirir, diğerleri callbackleri kullanır ve bunları otomatik olarak gönderir. İlk durumda Recaptcha çözüldükten hemen sonra gönder butonuna basmak istiyoruz. Bunu doğru zamanda yapmak için seçicinin .antigate_solver.solved gelmesini bekleyin ve ardından gönder butonuna basın.

Javascript
Python
// "çözüldü" selektörünün görünmesini bekleyin
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') }}');

// gönder butonuna basın
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('görev tamamlandı, recaptcha içeren form bypass edildi');

İşte hepsi bu, form dolduruldu, Recaptcha çözüldü ve bypass edildi. Tam kod örnekleri:

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 () => {
    // eklentiyi indirin
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // arşivden çıkarın
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);

    // konfigürasyon dosyasında API anahtarı belirleyin
    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();
        }
    });

    // tarayıcı başlatma seçeneklerini belirleyin
    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 {
        // tarayıcıyı eklenti ile başlatın
        const browser = await puppeteer.launch();
        page = await browser.newPage();
    } catch (e) {
        console.log('could not launch browser: '+e.toString())
        return;
    }

    // istenen sayfaya gidin
    try {
        await page.goto(url, {
            waitUntil: "networkidle0"
        });
    } catch (e) {
        console.error('err while loading the page: '+e);
    }

    // navigasyon zaman aşımı hatalarını devre dışı bırakın
    await page.setDefaultNavigationTimeout(0);

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

    // "çözüldü" selektörünün görünmesini bekleyin
    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') }}');

    // gönder butonuna basın
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('recaptcha çözüldü');

})();

Bonus: Chrome, eklentilerle tarayıcı otomasyonunu desteklemediğinden, eklentiyi başsız modda çalıştırmanın bir püf noktası var. Uygulamanız için sanal masaüstü sağlayan Xvfb adlı yardımcı programı kullanın.

# paketi kurun
apt-get install -y xvfb

# görüntüleme değişkenini belirleyin
export DISPLAY=:0

# Xvfb daemon'ı arkaplanda başlatın (sadece bir kez)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# görünmesi için biraz bekleyin (sadece bir kez)
sleep 5

# "node" veya "python" komut dizisine "xvfb-run" önekini ekleyin
xvfb-run node myscript.js
# veya
xvfb-run python myscript.py