Menu

نحوه استفاده از پلاگین آنتی کپچا در Puppeteer یا Seleniumm

Puppeteer و Selenium دو موتور اصلی برای اتوماسیون مرورگر هستند و پلاگین ما به شیوه‌ای بی‌نقص با آنها یکپارچه می‌شود. در این مقاله نشان خواهیم داد که چطور از پلاگین ما در Puppeteer و Selenium به ترتیب برای زبان‌های برنامه‌نویسی NodeJS و پایتون استفاده کنید. اگر باید بین این دو گزینه انتخاب کنید، ما شدیداً NodeJS+Puppeteer را به دلیل محیط بومی آن توصیه می‌کنیم.

۱. وابستگی‌ها را نصب کنید. در NodeJS فقط لازم است که بسته‌های npm مشخص شده در زیر را نصب کنید، در پایتون، بسته را نصب کنید و "chromedriver" قابل اجرا از صفحه این را دانلود کنید. نسخۀ درایور باید با نسخۀ کروم نصب شده در سیستم شما منطبق باشد.

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

۲. پلاگین را در نسخه زیپ برای کروم دانلود کنید، آن را در فولدر پروژه خودتان از حالت زیپ خارج کنید. نسخه‌های واقعی در اینجا قرار دارند. ضما می‌توانید این کار را با برنامه‌نویسی هم انجام دهید:

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 () => {
    // دانلود پلاگین
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // آن را از حالت زیپ خارج کنید
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);
})();

۳. سپس، کلید API خودتان در فایل ./plugin/js/config_ac_api_key.js را پیکربندی کنید. کلید API خودتان را می‌توانید در ناحیه مشتریان پیدا کنید. برای این که آن را به کار بیندازید باید موجودی حساب شما مثبت باشد.

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!')
}

۴. مرورگر را با پلاگین راه‌اندازی کنید. ما برای Puppeteer ، پلاگین 'puppeteer-extra-plugin-stealth' را برای بسته 'puppeteer-extra' توصیه می‌کنیم، که همه نشانه‌های مرورگر کرومیوم وب-خودکارشده را پنهان می‌کند.

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();
})();

۵. به صفحه هدف بروید و در صورت نیاز، فرم را پر کنید. پلاگین به‌صورت خودکار ریکپچا را انتخاب خواهد کرد و حل آن را شروع می‌کند.

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);
    }
    // غیرفعال کردن خطاهای تایم‌اوت پیمایش
    await page.setDefaultNavigationTimeout(0);

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

})();

۶. مرحله بعدی کمی نیاز به مهارت دارد. فرم‌های وب برخی نیاز به این دارند که کاربر، دکمه ارسال را بعد از حل ریکپچا بزند، سایرین از فراخوان‌ها استفاده می‌کند و آنها را به‌صورت خودکار ارسال می‌کند. در مورد اول ما می‌خواهیم دکمه ارسال را درست بعد از این که ریکپچا حل شد، فشار دهیم. برای انجام این کار در زمان صحیح، فقط منتظر سلکتور .antigate_solver.solved بمانید تا بالا بیاید و بعد دکمه ارسال را بزنید.

Javascript
Python
// منتظر بمانید تا سلکتور "solved" بالا بیاید
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') }}');

// دکمه ارسال را بزنید
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('وظیفه انجام شد، فرم دارای ریکپچا دور زده شد');

کل کار همین بود، فرم پر شد، ریکپچا حل و دور زده می‌شود. نمونه‌های کد کامل:

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 () => {
    // دانلود پلاگین
    await new Promise((resolve) => {
        https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
    })
    // آن را از حالت زیپ خارج کنید
    const zip = new AdmZip("./plugin.zip");
    await zip.extractAllTo("./plugin/", true);

    // کلید API را در فایل پیکربندی تنظیم کنید
    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();
        }
    });

    // گزینه‌های راه‌اندازی (لانچ) مرورگر را تنظیم کنید
    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 {
        // مرورگر را با پلاگین راه اندازی کنید
        const browser = await puppeteer.launch();
        page = await browser.newPage();
    } catch (e) {
        console.log('could not launch browser: '+e.toString())
        return;
    }

    // به صفحه هدف بروید
    try {
        await page.goto(url, {
            waitUntil: "networkidle0"
        });
    } catch (e) {
        console.error('err while loading the page: '+e);
    }

    // غیرفعال کردن خطاهای تایم‌اوت پیمایش
    await page.setDefaultNavigationTimeout(0);

    // فرم را پر کنید
    await page.$eval('#login', (element, login) => {
        element.value = login;
    }, login);
    await page.$eval('#password', (element, password) => {
        element.value = password;
    }, password);

    // منتظر بمانید تا سلکتور "solved" بالا بیاید
    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') }}');

    // دکمه ارسال را بزنید
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('ریکپچا حل شد');

})();

پاداش: یک ترفند برای اجرای پلاگین در حالت بدون سر (هدلس) وجود دارد، چون کروم از اتوماسیون مرورگر با پلاگین‌ها پشتیبانی نمی‌کند. از قابلیتی به نام Xvfb استفاده کنید که دسکتاپ مجازی را برای اپلیکیشن شما ارائه می‌کند.

# بسته را نصب کنید
apt-get install -y xvfb

# متغیر نمایش را تنظیم کنید
export DISPLAY=:0

# دامون Xvfb را در پس‌زمینه آغاز کنید (فقط یکبار)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# کمی منتظر بمانید تا بالا بیاید (فقط یکبار)
sleep 5

# پیشوند "xvfb-run" را به اسکریپت "node" یا "python" اضافه کنید
xvfb-run node myscript.js
# یا
xvfb-run python myscript.py