close menu
সমর্থিত টাস্ক ধরণ
API পদ্ধতিসমূহ
নিবন্ধ
GitHub icon
GitHub
Menu

কিভাবে Cloudflare বাইপাস করবেন

এই প্রবন্ধে আপনি শিখবেন কিভাবে NodeJS ও Playwright ব্রাউজার অটোমেশন ব্যবহার করে Cloudflare এর "Verifying you are human" পৃষ্ঠা বাইপাস করতে হয়।

প্রথমে সংক্ষেপে বোঝার চেষ্টা করি Cloudflare কীভাবে কাজ করে। Cloudflare ছাড়া, ওয়েবসাইট অ্যাডমিনরা তাদের পেজ একটি পাবলিক IP ঠিকানাযুক্ত সার্ভারে হোস্ট করেন। তাদের ডোমেইন নাম সেই IP তে রিসলভ করে এবং আপনার ব্রাউজার সরাসরি সার্ভারে সংযুক্ত হয়।

Cloudflare ব্যবহারের সময়, তারা DNS ম্যানেজমেন্ট Cloudflare কে ডেলিগেট করে, যা ডোমেইন নামগুলিকে Cloudflare এর নিজস্ব IP ঠিকানাগুলিতে রিসলভ করতে শুরু করে। এই IP গুলিতে তারা বিশেষ প্রক্সি সার্ভার চালায় যা ইনকামিং HTTP ও HTTPS রিকোয়েস্ট ফিল্টার করে।

নতুন ভিজিটররা একটি পরিচিত পৃষ্ঠা দেখে যাতে লেখা থাকে: "Verifying you are human. This may take a few seconds." এই যাচাইকরণ চলাকালে আপনাকে একটি ক্যাপচা সমাধান করতে হতে পারে। আগে তারা reCAPTCHA ব্যবহার করত, এখন তারা নিজেদের Turnstile ক্যাপচা ব্যবহার করে।

ক্যাপচা যাচাইকরণ সফল হলে, ব্রাউজার একটি ইউনিক টোকেন পায় cf_clearance নামক কুকিতে। আপনার ব্রাউজার এই টোকেন ব্যবহার করে Cloudflare প্রক্সি থেকে ওয়েবসাইটের পেজ রিকোয়েস্ট করে। যদি এই টোকেনের মেয়াদ শেষ হয়ে যায়, অথবা Cloudflare অভ্যন্তরীণভাবে বুঝতে পারে যে টোকেনটি বটের মত আচরণ করছে, তাহলে এটি টোকেনটি অকার্যকর করে এবং আপনাকে আবার ক্যাপচা দেখানো হয়।

আমাদের পদ্ধতিটি একটি স্বয়ংক্রিয় ব্রাউজার সেশন ব্যবহার করে এই টোকেনটি পাওয়ার উপায় প্রদান করে। মনে রাখবেন, এই পদ্ধতিটি ওয়েবসাইটের প্রকৃত IP ঠিকানা প্রকাশ করে না — সেই তথ্য কেবলমাত্র Cloudflare এবং ওয়েবসাইট অ্যাডমিনদের কাছে থাকে। আর এটি একটি ভাল বিষয়!

NodeJS ও Playwright দিয়ে এটি কিভাবে করবেন:

// Install packages
// npx install playwright @antiadmin/anticaptchaofficial
import { chromium } from "playwright";
import ac from "@antiadmin/anticaptchaofficial";

// Specify the target website address
const websiteBehindCloudFlare = 'https://yourwebsite.com';

// Set your Anti-Captcha API key here:
ac.setAPIKey('API_KEY_HERE');
ac.setSoftId(0);

let browser = null;
let page = null;


(async () => {

    // Opening the browser
    try {
        console.log('Opening browser ..');
        browser = await chromium.launch({ headless: false });
        console.log('Creating new page ..');
        page = await browser.newPage();
    } catch (e) {
        console.log("Could not open browser: "+e.toString());
        return;
    }


    let params = null;

    try {

        // Doing several attempts to inject our code
        while (!params) {

            console.log('Navigating to the page')
            await page.goto(websiteBehindCloudFlare);

            console.log('Injecting our proxy code to replace window.turnstile');
            await page.evaluate(() => {
                window.turnstile = new Proxy(window.turnstile, {
                  get(target, prop) {
                    if (prop === "render") {
                      return function (a, b) {
                        const p = {
                          websiteURL: window.location.href,
                          websiteKey: b.sitekey,
                          action: b.action,
                          cData: b.cData,
                          chlPageData: b.chlPageData,
                          userAgent: navigator.userAgent,
                        };

                        // saving params in window.params
                        window.params = p;

                        // assigning callback to a variable
                        window.cfCallback = b.callback

                        // calling original render function
                        return target.render.apply(this, arguments);
                      };
                    }
                    return target[prop];
                  },
                });
            });

          console.log('Getting params');
          params = await page.evaluate(() => {
            return new Promise((resolve) => {
              setTimeout(() => resolve(window.params || null), 5000);
            });
          });

          if (!params) {
            console.log('Retrying..');
            await delay(3000);
          }
        }

        console.log("Extracted Turnstile Params:", params);

        console.log('Solving Turnstile captcha with Anti-Captcha')
        const token = await ac.solveTurnstileProxyless(websiteBehindCloudFlare, params.websiteKey, params.action, params.cData, params.chlPageData);

        // Running Cloudflare's callback function we previously assigned to window.cfCallback
        await page.evaluate((token) => {
            window.cfCallback(token)
        }, token);

        console.log('Waiting for redirects to finish')
        await delay(5000);

        // Get all cookies for current page
        const cookies = await page.context().cookies();
        // Find cf_clearance
        const cf_clearance = cookies.filter(c => c.name === 'cf_clearance');

        // Output cookies
        console.log('Cookies:', cookies);
        console.log('cf_clearance:', cf_clearance);



    } catch (e) {
      console.error('Could not inject proxy code:', e);
    }

    // close browser when needed
    // await browser.close();


})();

function delay(time) {
   return new Promise(function(resolve) {
       setTimeout(resolve, time)
   });
}

আমাদের কোডে যা করা হচ্ছে:

1. ব্রাউজার উইন্ডো খুলে Cloudflare যাচাইকরণ পৃষ্ঠায় যাওয়া।
2. Turnstile এর render ফাংশনটি আমাদের প্রক্সি ফাংশন দ্বারা প্রতিস্থাপন করা, যেখানে আমরা ইনিশিয়ালাইজেশন প্যারামিটার ও ক্যাপচা কমপ্লিশন কলব্যাক ক্যাচ করি।
3. ইনিশিয়ালাইজেশন প্যারামিটারগুলি Anti-Captcha API তে পাঠানো। মানুষ এই ক্যাপচাটি আপনার জন্য সমাধান করে এবং একটি টোকেন প্রদান করে।
4. আমরা পূর্বে সংরক্ষিত কলব্যাক ফাংশনটি Turnstile টোকেন প্যারামিটার হিসেবে দিয়ে কল করি।
5. Cloudflare অভ্যন্তরীণভাবে টোকেন যাচাই করে, আমাদের ব্রাউজারে কুকি সেট করে এবং পৃষ্ঠা পুনরায় লোড করে।
6. এই cf_clearance কুকি সহ ব্রাউজার Cloudflare প্রক্সি থেকে ওয়েবসাইটের কনটেন্ট ফেচ করে।