Belgeler menüsü

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.

NodeJS
          npm install adm-zip puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
        
Python
          pip install selenium
        

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:

NodeJS
          //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);
})();
        
Python
          import urllib.request
import zipfile

url = 'https://antcpt.com/anticaptcha-plugin.zip'
# eklentiyi indirin
filehandle, _ = urllib.request.urlretrieve(url)
# arşivden çıkarın
with zipfile.ZipFile(filehandle, "r") as f:
    f.extractall("plugin")
        

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.

NodeJS
          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!')
}
        
Python
          from pathlib import Path
import zipfile

# konfigürasyon dosyasında API anahtarı belirleyin
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)))

# eklenti dizinini tekrar plugin.zip olarak arşivleyin
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. 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.

NodeJS
          //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();
})();
        
Python
          from selenium import webdriver

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

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

5. İstediğiniz bir sayfaya gidin ve gerekirse bir form doldurun. Eklenti, Recaptcha'yı otomatik olarak alır ve çözmeye başlar.

NodeJS
          (async () => {
    const url = 'https://anti-captcha.com/tutorials/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);

})();
        
Python
          browser.get('https://anti-captcha.com/tutorials/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. 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.

NodeJS
          // "çö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('recaptcha çözüldü');

// 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ı');
        
Python
          # "çözüldü" selektörünün görünmesini bekleyin
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))
# gönder butonuna basın
browser.find_element_by_css_selector('#submitButton').click()
        

İşte bu kadar, form dolduruldu, Recaptcha çözüldü ve atlatıldı. Tam kod örnekleri:

NodeJS
          // 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/tutorials/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('recaptcha çözüldü');

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

})();
        
Python
          import urllib.request
import zipfile
import os
from pathlib import Path
from selenium import webdriver

# eklentiyi indirin
url = 'https://antcpt.com/anticaptcha-plugin.zip'
filehandle, _ = urllib.request.urlretrieve(url)
# arşivden çıkarın
with zipfile.ZipFile(filehandle, "r") as f:
    f.extractall("plugin")

# konfigürasyon dosyasında API anahtarı belirleyin
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)))

# eklenti dizinini tekrar plugin.zip olarak arşivleyin
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()

# tarayıcı başlatma seçeneklerini belirleyin
options = webdriver.ChromeOptions()
options.add_extension('./plugin.zip')

# tarayıcı başlatma seçeneklerini belirleyin
browser = webdriver.Chrome('./chromedriver', options=options)

# istenen sayfaya gidin
browser.get('https://anti-captcha.com/tutorials/v2-textarea')

# formu doldurun
browser.find_element_by_css_selector('#login').send_keys('Test login')
browser.find_element_by_css_selector('#password').send_keys('Test password')

# "çözüldü" selektörünün görünmesini bekleyin
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))

# gönder butonuna basın
browser.find_element_by_css_selector('#submitButton').click()
        

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.

bash
          # 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