Menu

دور زدن Recaptcha V2 با NodeJS و Puppeteer


چیزی که قرار است یاد بگیرید

  • تنظیم NodeJS و Webstorm IDE در Ubuntu OS که تازه نصب شده است.
  • نصب و ایمپورت کردن ماژول‌های anticaptchaofficial و puppeteer npm.
  • شما یاد خواهید گرفت که چگونه فرم این را با Recaptcha با اسکریپت NodeJS ارسال کنید.
  • نحوه نوشتن یک اسکریپت puppeteer که کرومیوم را در حالت پس‌زمینه باز می‌کند و به آن صفحه حرکت می‌کند را بیاموزید.
  • نحوه گرفتن اسکرین‌شات از صفحه و ذخیره آن روی دیسک را بیاموزید.
  • نحوه پرکردن فیلدهای متنی فرم با استفاده از سلکتورهای CSS را بیاموزید.
  • نحوه حل کردن Recaptcha v2، پرکردن ناحیه متنی مخفی، #g-recaptcha-response و ارسال فرم را بیاموزید.
  • نکاتی درباره افزایش دانشتان درباره Javascript ES6 و NodeJS.
Source code

تنظیم NodeJS و Webstorm IDE در Ubuntu OS که تازه نصب شده است.

  • سیستم عامل اوبونتو: نصب سیستم عامل اوبونتو یک الزام نیست، بلکه یک توصیه است. اجرای NodeJS از ویندوز نیز امکان پذیر است، اما ممکن است کد ما سازگار نباشد.
  • Node JS: دانلود NodeJS برای سیستم عامل خود اینجا
  • ویرایشگر کد: VS Code یا Atom توصیه می شود. هر دو IDE رایگان هستند.

Curl و nodejs را در اوبونتو نصب کنید:

apt update
apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt install -y nodejs

نصب و ایمپورت کردن ماژول‌های anticaptchaofficial و puppeteer npm.

ماژول های anti-captcha و Puppeteer npm را نصب کنید:

npm install @antiadmin/anticaptchaofficial puppeteer

یک فایل جدید index.js ایجاد کنید و موارد زیر را اضافه کنید. کلید خود را از تنظیمات API جایگزین «YOUR_API_KEY» کنید:

const ac = require("@antiadmin/anticaptchaofficial");
      const pup = require("puppeteer");
      ac.setAPIKey('YOUR_API_KEY');

نحوه نوشتن یک اسکریپت puppeteer که کرومیوم را در حالت پس‌زمینه باز می‌کند و به آن صفحه حرکت می‌کند را بیاموزید.

ابتدا کد زیر را برای حل کپچا اضافه کنید، سپس فرم را با لاگین و رمز عبور پر کنید، توکن g-response را با id="g-recaptcha-response" در textarea قرار دهید و فرم را ارسال کنید:

const login = 'mylogin';
const password = 'my strong password';

(async () => {

    console.log('solving recaptcha ...');
    let token = await ac.solveRecaptchaV2Proxyless('https://anti-captcha.com/demo?page=recaptcha_v2_textarea', '6LfydQgUAAAAAMuh1gRreQdKjAop7eGmi6TrNIzp');
    if (!token) {
        console.log('something went wrong');
        return;
    }

    console.log('opening browser ..');
    const browser = await pup.launch();

    console.log('creating new tab ..');
    const tab = await browser.newPage();

    console.log('changing window size .. ');
    await tab.setViewport({ width: 1360, height: 1000 });

    console.log('opening target page ..');
    await tab.goto('https://anti-captcha.com/demo?page=recaptcha_v2_textarea', { waitUntil: "networkidle0" });

    console.log('filling login input ..');
    await tab.$eval('#contentbox > form > div > div:nth-child(1) > span > input', (element, login) => {
        element.value = login;
    }, login);

    console.log('filling password input');
    await tab.$eval('#contentbox > form > div > div:nth-child(2) > span > input', (element, password) => {
        element.value = password;
    }, password);

    console.log('setting recaptcha g-response ...');
    await tab.$eval('#g-recaptcha-response', (element, token) => {
        element.value = token;
    }, token);

    console.log('submitting form .. ');
    await Promise.all([
        tab.click('#contentbox > form > div > div.tac.padding20px > button'),
        tab.waitForNavigation({ waitUntil: "networkidle0" })
    ]);

    console.log('making a screenshot ...');
    await tab.screenshot({ path: 'screenshot.png' });

    console.log('closing browser .. ');
    await browser.close();

})();

ممکن است توجه داشته باشید که ما ابتدا کپچا را حل می کنیم و تنها پس از آن به صفحه پیمایش می کنیم و نتیجه را پیست می کنیم. این برای Recaptcha کار می کند، زیرا می دانیم که سایت کلید و طول عمر توکن 120 ثانیه است.

اسکرین شات صفحه نهایی در screenshot.png ذخیره می شود. اگر می‌خواهید ببینید در مرورگر چه اتفاقی می‌افتد، حالت هدلس را خاموش کنید:

console.log('opening browser ..');
//const browser = await pup.launch();
const browser = await pup.launch({ headless: false });

نکاتی درباره افزایش دانشتان درباره Javascript ES6 و NodeJS.

شما یاد گرفته‌اید که چگونه یک فرم را با Recaptcha V2 به ساده‌ترین روش پیاده‌سازی دور بزنید - با استفاده از ناحیه متنی "g-recaptcha-response" به عنوان بخشی از فرم. ممکن است بخواهید دانش خود را گسترش دهید:

Github

https://github.com/anti-captcha/solving-captcha-concepts/blob/master/tutorial1.js