Come bypassare Cloudflare
In questo articolo imparerai come bypassare la pagina "Verifying you are human" di Cloudflare utilizzando NodeJS con l'automazione del browser Playwright.

Iniziamo comprendendo brevemente come funziona Cloudflare. Senza Cloudflare, gli amministratori dei siti web ospitano le loro pagine su un server con un indirizzo IP pubblico. I nomi di dominio vengono risolti verso quell'indirizzo IP e il tuo browser si connette direttamente al server.
Quando utilizzano Cloudflare, delegano la gestione del DNS a Cloudflare, che inizia a risolvere i nomi di dominio verso i propri indirizzi IP. Su questi IP, vengono eseguiti server proxy speciali che filtrano le richieste HTTP e HTTPS in entrata.
I nuovi visitatori vedono la famosa pagina con il testo: "Verifying you are human. This may take a few seconds.". Durante questa verifica, potrebbe esserti richiesto di risolvere un captcha. In precedenza veniva usato reCAPTCHA, ma ora viene utilizzato il captcha proprietario Turnstile.
Una volta superata la verifica captcha, il browser riceve un token univoco in un cookie chiamato cf_clearance. Il tuo browser userà questo token per richiedere le pagine del sito attraverso il proxy di Cloudflare. Se il token scade, o se Cloudflare decide internamente che il token si comporta come un bot, lo invaliderà e ti verrà mostrato nuovamente il captcha.
Il nostro metodo ti aiuterà a ottenere questo token utilizzando una sessione automatizzata del browser. Nota che questo metodo non rivela l'indirizzo IP reale del sito — tale informazione è nota solo a Cloudflare e agli amministratori del sito. E questo è un bene!
Ecco come farlo con NodeJS e 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)
});
}
Cosa fa il nostro codice:
1. Apre una finestra del browser e naviga verso la pagina di verifica di Cloudflare.
2. Sostituisce la funzione render di Turnstile con la nostra funzione proxy, nella quale intercettiamo i parametri di inizializzazione e la callback del captcha.
3. Invia i parametri di inizializzazione all'API di Anti-Captcha. Dei lavoratori umani risolvono il captcha per te e restituiscono un token.
4. Viene richiamata la funzione callback salvata in precedenza passando il token di Turnstile come parametro.
5. Cloudflare verifica internamente questo token, imposta il cookie nel browser e ricarica la pagina.
6. Con il cf_clearance, il browser recupera i contenuti del sito tramite il proxy di Cloudflare.