Hur man kringgår Cloudflare
I den här artikeln får du lära dig hur du kringgår Cloudflares sida "Verifierar att du är människa" med hjälp av NodeJS och webbläsarautomatisering via Playwright.

Låt oss först kort förstå hur Cloudflare fungerar. Utan Cloudflare hostar webbplatsadministratörer sina sidor på en server med en publik IP-adress. Deras domännamn pekar till den IP-adressen, och din webbläsare ansluter direkt till deras server.
När de använder Cloudflare delegerar de DNS-hanteringen till Cloudflare, som börjar lösa domännamn till sina egna IP-adresser. På dessa adresser körs speciella proxyservrar som filtrerar inkommande HTTP- och HTTPS-förfrågningar.
Nya besökare ser den välkända sidan med texten: "Verifying you are human. This may take a few seconds.". Under denna verifiering kan du bli ombedd att lösa ett captcha. Tidigare använde de reCAPTCHA, men nu använder de sitt eget captcha-system som kallas Turnstile.
När captchat har verifierats får webbläsaren en unik token i en cookie som heter cf_clearance. Din webbläsare använder den här tokenn för att begära webbplatsens sidor via Cloudflares proxy. Om tokenn löper ut, eller om Cloudflare internt anser att den beter sig som en bot, ogiltigförklaras den och du ser verifieringssidan igen.
Vår metod hjälper dig att erhålla denna token genom en automatiserad webbläsarsession. Observera att metoden inte avslöjar webbplatsens verkliga IP-adress – den informationen är endast känd av Cloudflare och webbplatsens administratörer. Och det är bra!
Så här gör du med NodeJS och 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)
});
}
Det här gör vår kod:
1. Öppnar ett webbläsarfönster och går till Cloudflares verifieringssida.
2. Ersätter Turnstiles render-funktion med vår proxyfunktion, där vi fångar initieringsparametrar och callback för slutfört captcha.
3. Skickar initieringsparametrarna till Anti-Captcha API. Mänskliga arbetare löser captchat åt dig och returnerar en token.
4. Vi anropar den tidigare sparade callback-funktionen med Turnstile-token som parameter.
5. Cloudflare verifierar tokenn internt, sätter cookie i webbläsaren och laddar om sidan.
6. Med denna cf_clearance hämtar webbläsaren webbplatsens innehåll via Cloudflares proxy.