Comment contourner Cloudflare
Dans cet article, vous apprendrez comment contourner la page "Verifying you are human" de Cloudflare en utilisant NodeJS avec l'automatisation de navigateur Playwright.

Commençons par comprendre brièvement comment fonctionne Cloudflare. Sans Cloudflare, les administrateurs de sites hébergent leurs pages sur un serveur avec une adresse IP publique. Leurs noms de domaine pointent vers cette adresse IP, et votre navigateur se connecte directement à leur serveur.
Lorsqu'ils utilisent Cloudflare, ils délèguent la gestion DNS à Cloudflare, qui commence à faire pointer les noms de domaine vers ses propres adresses IP. Sur ces adresses IP, ils exécutent des serveurs proxy spéciaux qui filtrent les requêtes HTTP et HTTPS entrantes.
Les nouveaux visiteurs voient la page bien connue avec le texte : « Verifying you are human. This may take a few seconds. ». Pendant cette vérification, il peut vous être demandé de résoudre un captcha. Auparavant, ils utilisaient reCAPTCHA, mais maintenant ils utilisent leur propre captcha Turnstile.
Une fois le captcha validé, le navigateur reçoit un jeton unique dans un cookie nommé cf_clearance. Votre navigateur utilisera ce jeton pour demander les pages du site via le proxy Cloudflare. Si ce jeton expire, ou si Cloudflare décide que son comportement ressemble à celui d’un bot, il sera invalidé et vous verrez à nouveau le captcha.
Notre méthode vous aidera à obtenir ce jeton en utilisant une session de navigateur automatisée. Notez que cette méthode ne révèle pas l'adresse IP réelle du site — cette information n’est connue que de Cloudflare et des administrateurs du site. Et c’est une bonne chose !
Voici comment faire avec NodeJS et 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)
});
}
Ce que notre code fait :
1. Ouvrir une fenêtre de navigateur et accéder à la page de vérification Cloudflare.
2. Remplacer la fonction render de Turnstile par notre fonction proxy, dans laquelle nous interceptons les paramètres d'initialisation ainsi que le callback de fin de captcha.
3. Envoyer les paramètres d'initialisation à l'API Anti-Captcha. Des travailleurs humains résolvent le captcha pour vous et vous renvoient un jeton.
4. Appeler la fonction callback sauvegardée avec le jeton Turnstile comme paramètre.
5. Cloudflare vérifie ce jeton en interne, place le cookie dans le navigateur et recharge la page.
6. Avec ce cf_clearance, le navigateur récupère le contenu du site via le proxy Cloudflare.