كيفية تجاوز Cloudflare
ستتعلم في هذه المقالة كيفية تجاوز صفحة "التحقق من أنك إنسان" الخاصة بـ Cloudflare في NodeJS باستخدام أتمتة متصفح Playwright.

لنفهم أولاً بإيجاز كيف تعمل Cloudflare. بدون Cloudflare، يستضيف مديرو المواقع الإلكترونية صفحاتهم على خادم بعنوان IP عام. يتم حل أسماء النطاقات الخاصة بهم إلى عنوان IP هذا، ويتصل متصفحك بخادمهم مباشرة.
عندما يستخدمون Cloudflare، فإنهم يفوضون إدارة DNS إلى Cloudflare، والتي تبدأ في حل أسماء النطاقات إلى عناوين IP الخاصة بـ Cloudflare. على عناوين IP هذه، يقومون بتشغيل خوادم بروكسي خاصة تقوم بتصفية طلبات HTTP و HTTPS الواردة.
يرى الزائرون الجدد الصفحة المعروفة بالنص "Verifying you are human. This may take a few seconds." أثناء هذا التحقق، قد يُطلب منك حل كلمة التحقق. في السابق، كانوا يستخدمون reCAPTCHA، لكنهم الآن يستخدمون كلمة التحقق الخاصة بهم.
بمجرد اجتياز التحقق من captcha، يتلقى المتصفح رمزًا مميزًا فريدًا في ملف تعريف ارتباط باسم cf_clearance. سيستخدم المتصفح هذا الرمز المميز لطلب صفحات الموقع الإلكتروني من وكيل Cloudflare. إذا انتهت صلاحية هذا الرمز المميز، أو إذا قررت Cloudflare داخليًا أن الرمز المميز يتصرف مثل الرمز الذي تستخدمه عادةً الروبوتات، فسوف يبطل الرمز المميز وسترى رمز التحقق مرة أخرى.
ستساعدك طريقتنا في الحصول على هذا الرمز المميز باستخدام جلسة متصفح آلية. لاحظ أن هذه الطريقة لا تكشف عن عنوان IP الحقيقي لموقع الويب - هذه المعلومات معروفة فقط لـ Cloudflare ومسؤولي الموقع الإلكتروني. وهذا أمر جيد!
إليك كيفية القيام بذلك باستخدام NodeJS و 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)
});
}
ما نقوم به في كودنا
1. افتح نافذة المتصفح وانتقل إلى صفحة التحقق من Cloudflare.
2. استبدل دالة التصيير الخاصة بـ Turnstile بدالة الوكيل الخاصة بنا، حيث نلتقط معلمات التهيئة بالإضافة إلى رد نداء إكمال اختبار CAPTCHA.
3. إرسال معلمات التهيئة إلى واجهة برمجة تطبيقات Anti-Captcha. يقوم العاملون البشريون بحل هذه الكابتشا نيابةً عنك وتزويدك برمز مميز.
4. نقوم باستدعاء دالة رد النداء المحفوظة مسبقًا باستخدام رمز الباب الدوار كمعامل.
5. تتحقّق Cloudflare داخليًا من هذا الرمز المميز، وتعيّن ملف تعريف الارتباط للمتصفح وتعيد تحميل الصفحة.
6. وبهذا يقوم متصفح cf_clearance بجلب محتويات الموقع الإلكتروني من وكيل Cloudflare.