Menu

Puppeteer یا Selenium میں Anti-Captcha پلگ ان استعمال کرنے کا طریقہ

Puppeteer اور Selenium براؤزر آٹومیشن کے دو اہم انجن ہیں اور ہمارا پلگ ان آسانی سے ان میں انضمام کرتا ہے۔ اس آرٹیکل میں ہم دکھائیں گے کہ اسے بالترتیب NodeJS اور Python پروگرامنگ زبانوں کے لیے Puppeteer اور Selenium میں کیسے استعمال کیا جائے۔ اگر آپ دونوں میں سے کسی ایک کا انتخاب کرتے ہیں تو ہم اس کے مقامی ماحول کے لحاظ سے NodeJS+Puppeteer کی بھرپور سفارش کرتے ہیں۔

1. ڈیپنڈنسیز انسٹال کریں۔ NodeJS کے لیے صرف ذیل میں دیئے گئے npm پیکجز کو انسٹال کریں، Python کے لیے پیکجز انسٹال کریں اور اس پیج سے ایگزیکیوٹ ایبل "chromedriver" ڈاؤن لوڈ کریں۔ ڈرائیور کا ورژن آپ کے سسٹم پر انسٹال Chrome ورژن سے میچ ہونا چاہیے۔

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

2. Chrome کے لیے ZIP ورژن میں پلگ ان ڈاؤن لوڈ کریں، اسے اپنے پروجیکٹ فولڈر میں ان زپ کریں۔ اصل ورژن یہاں موجود ہیں۔ آپ اسے پروگرامیٹیکلی بھی کر سکتے ہیں:

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 () => {
    // پلگ ان ڈاؤن لوڈ کریں
    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);
})();
import urllib.request
import zipfile

url = 'https://antcpt.com/anticaptcha-plugin.zip'
# پلگ ان ڈاؤن لوڈ کریں
filehandle, _ = urllib.request.urlretrieve(url)
# اسے ان زب کریں
with zipfile.ZipFile(filehandle, "r") as f:
    f.extractall("plugin")

3. اگلا، اپنی API کلید کو ./plugin/js/config_ac_api_key.js فائل میں کنفیگر کریں۔ آپ اپنی API کلید کسٹمرز کا علاقہ میں تلاش کر سکتے ہیں۔ اسے کام کرنے کے لیے آپ کو کچھ مثبت بیلنس کی ضرورت ہوگی۔

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. پلگ ان کے ساتھ براؤزر شروع کریں۔ Puppeteer کے لیے ہم 'puppeteer-extra' پیکیج کے لیے 'puppeteer-extra-plugin-stealth' پلگ ان تجویز کرتے ہیں جو کہ ویب آٹومیٹڈ Chromium براؤزر کی تمام نشانیوں کو چھپاتا ہے۔

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. مطلوبہ پیج پر جائیں اور اگر ضرورت ہو تو فارم پُر کریں۔ پلگ ان خود بخود Recaptcha دیکھ لے گا اور اسے حل کرنا شروع کر دے گا۔

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. اگلا تھوڑا مشکل حصہ ہے۔ کچھ ویب فارمز کے لیے صارف سے Recaptcha کو حل کرنے کے بعد جمع کروانے کا بٹن دبانے کی ضرورت ہوتی ہے، دیگر کال بیکس کا استعمال کرتے ہیں اور انہیں خودکار طور پر جمع کرواتے ہیں۔ پہلی صورت میں ہم Recaptcha کے حل ہونے کے فوراً بعد Submit بٹن کو دبانا چاہتے ہیں۔ اسے صحیح وقت پر کرنے کے لیے، بس سلیکٹر .antigate_solver.solved کے آنے کا انتظار کریں اور پھر جمع کروائیں بٹن کو دبائیں۔

Node.js
Python
// “حل ہو گیا” سلیکٹر کے آنے کا انتظار کریں
await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
console.log('recaptcha حل ہو گیا');

// جمع کروائیں کا بٹن دبائیں
await Promise.all([
    page.click('#submitButton'),
    page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('ٹاسک مکمل ہو گیا، recaptcha والا فارم بائی پاس ہو گیا ');
# “حل ہو گیا” سلیکٹر کے آنے کا انتظار کریں
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()

بس، فارم مکمل گیا، Recaptcha حل اور بائی پاس ہو جاتا ہے۔ مکمل کوڈ کے نمونے:

Node.js
Python

Node.js میں Anti-Captcha براؤزر ایکسٹینشن کو کیسے ضم کریں

// 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);

    // “حل ہو گیا” سلیکٹر کے آنے کا انتظار کریں
    await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
    console.log('recaptcha حل ہو گیا');

    // جمع کروائیں کا بٹن دبائیں
    await Promise.all([
        page.click('#submitButton'),
        page.waitForNavigation({ waitUntil: "networkidle0" })
    ]);
    console.log('recaptcha حل ہو گیا');

})();

Python میں Anti-Captcha براؤزر ایکسٹینشن کو کیسے ضم کریں

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

# پلگ ان ڈاؤن لوڈ کریں
url = 'https://antcpt.com/anticaptcha-plugin.zip'
filehandle, _ = urllib.request.urlretrieve(url)
# اسے ان زب کریں
with zipfile.ZipFile(filehandle, "r") as f:
    f.extractall("plugin")

# کنفگریشن فائل میں API کلید سیٹ کریں
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)))

# پلگ ان ڈائیریکٹری کو واپس 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()

# براؤزر لانچ کرنے کی آپشنز سیٹ کریں
options = webdriver.ChromeOptions()
options.add_extension('./plugin.zip')

# براؤزر لانچ کرنے کی آپشنز سیٹ کریں
browser = webdriver.Chrome('./chromedriver', options=options)

# مطلوبہ پیج تک نیویگیٹ کریں

browser.get('https://anti-captcha.com/demo/?page=recaptcha_v2_textarea')

# فارم پُر کریں
browser.find_element_by_css_selector('#login').send_keys('Test login')
browser.find_element_by_css_selector('#password').send_keys('Test password')

# “حل ہو گیا” سلیکٹر کے آنے کا انتظار کریں
webdriver.support.wait.WebDriverWait(browser, 120).until(lambda x: x.find_element_by_css_selector('.antigate_solver.solved'))

# جمع کروائیں کا بٹن دبائیں
browser.find_element_by_css_selector('#submitButton').click()

بونس: پلگ ان کو ہیڈ لیس موڈ میں چلانے کا ایک نُسخہ موجود ہے، کیونکہ Chrome پلگ انز کے ساتھ براؤزر آٹومیشن کو سپورٹ نہیں کرتا ہے۔ Xvfb نامی یوٹیلیٹی استعمال کریں جو آپ کی ایپلیکیشن کے لیے ورچوئل ڈیسک ٹاپ فراہم کرتی ہے۔

Node.js
Python
# پیکیج انسٹال کریں
apt-get install -y xvfb

# ڈسپلے کا متغیر (ویری ایبل) سیٹ کریں
export DISPLAY=:0

# پس منظر میں Xvfb ڈیمون اسٹارٹ کریں (صرف ایک مرتبہ)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# اس کے آنے کے لیے تھوڑا سا انتظار کریں (صرف ایک مرتبہ)
sleep 5

# “node” یا “python” اسکرپٹ میں سابقہ (پری فِکس) “xvfb-run” شامل کریں
xvfb-run node myscript.js
# پیکیج انسٹال کریں
apt-get install -y xvfb

# ڈسپلے کا متغیر (ویری ایبل) سیٹ کریں
export DISPLAY=:0

# پس منظر میں Xvfb ڈیمون اسٹارٹ کریں (صرف ایک مرتبہ)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &

# اس کے آنے کے لیے تھوڑا سا انتظار کریں (صرف ایک مرتبہ)
sleep 5

# “node” یا “python” اسکرپٹ میں سابقہ (پری فِکس) “xvfb-run” شامل کریں
xvfb-run python myscript.py