Menu

Cara Melewati Cloudflare

Dalam artikel ini, kamu akan belajar cara melewati halaman "Verifying you are human" dari Cloudflare menggunakan NodeJS dengan otomatisasi browser Playwright.

Mari kita pahami dulu secara singkat bagaimana cara kerja Cloudflare. Tanpa Cloudflare, administrator situs web meng-host halaman mereka di server dengan alamat IP publik. Nama domain mereka diarahkan ke alamat IP tersebut, dan browser kamu langsung terhubung ke server mereka.

Ketika mereka menggunakan Cloudflare, mereka menyerahkan pengelolaan DNS ke Cloudflare, yang kemudian mulai mengarahkan nama domain ke alamat IP miliknya sendiri. Pada alamat-alamat IP ini, mereka menjalankan server proxy khusus yang menyaring permintaan HTTP dan HTTPS yang masuk.

Pengunjung baru akan melihat halaman terkenal dengan teks: "Verifying you are human. This may take a few seconds.". Selama proses verifikasi ini, kamu mungkin diminta untuk menyelesaikan captcha. Sebelumnya mereka menggunakan reCAPTCHA, tapi sekarang mereka menggunakan captcha buatan sendiri yang bernama Turnstile.

Setelah captcha berhasil diselesaikan, browser akan menerima token unik di dalam cookie bernama cf_clearance. Browser kamu akan menggunakan token ini untuk meminta halaman situs web melalui proxy Cloudflare. Jika token ini kedaluwarsa, atau Cloudflare secara internal memutuskan bahwa token ini berperilaku seperti bot, maka token akan dibatalkan dan kamu akan melihat halaman captcha lagi.

Metode kami akan membantu kamu mendapatkan token ini dengan sesi browser otomatis. Perlu dicatat bahwa metode ini tidak mengungkapkan alamat IP asli dari situs web — informasi tersebut hanya diketahui oleh Cloudflare dan administrator situs. Dan itu adalah hal yang baik!

Berikut cara melakukannya dengan NodeJS dan 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)
   });
}

Apa yang dilakukan oleh kode kami:

1. Membuka jendela browser dan membuka halaman verifikasi Cloudflare.
2. Mengganti fungsi render milik Turnstile dengan fungsi proxy kami, di mana kami menangkap parameter inisialisasi dan callback penyelesaian captcha.
3. Mengirim parameter inisialisasi ke API Anti-Captcha. Pekerja manusia akan menyelesaikan captcha untukmu dan memberikan token.
4. Memanggil fungsi callback yang telah disimpan sebelumnya dengan token Turnstile sebagai parameter.
5. Cloudflare secara internal memverifikasi token ini, menetapkan cookie di browser, dan memuat ulang halaman.
6. Dengan cf_clearance tersebut, browser mengambil konten situs dari proxy Cloudflare.