ڈاکومنٹیشن مینو

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

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

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

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

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

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 () => {
    // پلگ ان ڈاؤن لوڈ کریں
    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);
})();
        
Python
          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 کلید کسٹمرز کا علاقہ میں تلاش کر سکتے ہیں۔ اس کے کام کرنے کے لیے آپ کو کچھ مثبت بیلنس درکار ہوگا۔

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

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

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

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

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

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

NodeJS
          // “\حل ہو گیا”\ سلیکٹر کے آنے کا انتظار کریں
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
          # “\حل ہو گیا”\ سلیکٹر کے آنے کا انتظار کریں
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()
        

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

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 () => {
    // پلگ ان ڈاؤن لوڈ کریں
    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
          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/tutorials/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 نامی یوٹیلیٹی استعمال کریں جو آپ کی ایپلیکیشن کے لیے ورچوئل ڈیسک ٹاپ مہیا کرتی ہے۔

bash
          # پیکیج انسٹال کریں
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
# یا
xvfb-run python myscript.py