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ğlılıkları yükleyin. NodeJS için sadece aşağıda verilen npm paketlerini kurun, Python için paketleri kurun ve bu sayfasından "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 içindedir. 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ı içinde yapılandırın. API anahtarınızı müşteri alanı içinde bulabilirsiniz. Bunun çalışmasını sağlamak için bir miktar artı bakiyeye ihtiyacınız olacaktır.

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. Sonraki adım biraz karmaşıktır. Bazı web formları, kullanıcıların Recaptcha çözdükten sonra bir gönder butonuna tıklamalarını gerektirir, diğerleri callback'ler kullanır ve bunları otomatik olarak gönderir. İlk olarak, Recaptcha çözüldükten hemen sonra gönder butonuna basmak istiyoruz. Bunu doğru zamanda yapmak için .antigate_solver.solved seçicisinin 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 atlatıldı');

İşte bu kadar, form dolduruldu, Recaptcha çözüldü ve atlatıldı. 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ği için 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