Cloudflare Nasıl Atlanır
Bu makalede, NodeJS ve Playwright tarayıcı otomasyonu kullanarak Cloudflare'ın "Verifying you are human" sayfasını nasıl atlayacağınızı öğreneceksiniz.

Öncelikle Cloudflare'ın nasıl çalıştığını kısaca anlayalım. Cloudflare olmadan, web sitesi yöneticileri sayfalarını herkese açık bir IP adresine sahip bir sunucuda barındırır. Alan adları bu IP adresine yönlendirilir ve tarayıcınız doğrudan bu sunucuya bağlanır.
Cloudflare kullanıldığında, DNS yönetimi Cloudflare’a devredilir ve alan adları Cloudflare'ın kendi IP adreslerine yönlendirilir. Bu IP adreslerinde, gelen HTTP ve HTTPS isteklerini filtreleyen özel proxy sunucuları çalışır.
Yeni ziyaretçiler şu metni içeren tanıdık bir sayfa görür: "Verifying you are human. This may take a few seconds.". Bu doğrulama sırasında, bir captcha çözmeniz istenebilir. Daha önce reCAPTCHA kullanılıyordu, ancak artık kendi geliştirdikleri Turnstile captcha sistemi kullanılmaktadır.
Captcha doğrulaması başarıyla geçildikten sonra, tarayıcı cf_clearance adlı bir çerez içinde benzersiz bir jeton (token) alır. Tarayıcınız bu jetonu, web sitesinin sayfalarını Cloudflare proxy’si üzerinden talep etmek için kullanır. Eğer bu jetonun süresi dolarsa veya Cloudflare, jetonun bot gibi davrandığına karar verirse, jeton geçersiz hale gelir ve tekrar captcha doğrulama sayfası görüntülenir.
Yöntemimiz, bu jetonu otomatikleştirilmiş bir tarayıcı oturumu aracılığıyla almanıza yardımcı olur. Bu yöntemin, web sitesinin gerçek IP adresini ortaya çıkarmadığını unutmayın — bu bilgi yalnızca Cloudflare ve site yöneticileri tarafından bilinir. Ve bu, iyi bir şeydir!
NodeJS ve Playwright ile bunu şöyle yaparsınız:
// 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)
});
}
Kodumuzun yaptığı işlemler:
1. Bir tarayıcı penceresi açılır ve Cloudflare doğrulama sayfasına gidilir.
2. Turnstile’ın render fonksiyonu, başlatma parametrelerini ve captcha tamamlandığında çalışacak callback’i yakalayan bir proxy fonksiyon ile değiştirilir.
3. Başlatma parametreleri Anti-Captcha API’sine gönderilir. İnsan çalışanlar captcha’yı sizin için çözer ve bir jeton sağlar.
4. Önceden kaydedilen callback fonksiyonu, Turnstile jetonu ile çağrılır.
5. Cloudflare bu jetonu dahili olarak doğrular, tarayıcıya çerezi ayarlar ve sayfa yeniden yüklenir.
6. Bu cf_clearance ile tarayıcı, Cloudflare proxy’si üzerinden web sitesinin içeriğini alır.