حين يصطدم سكربت الأتمتة بصفحة تحقق من Cloudflare، فالسؤال الأول عمليًا هو: هل هذا التحدي المُدار (تكيّفي، يمرّ غالبًا دون أداة مرئية، ويعيد رمز 503) أم التحدي التفاعلي (مرئي دائمًا، ويعيد رمز 403)؟ والجواب يحدد طريقتك في CaptchaAI: للتحدي المُدار ابدأ بطريقة turnstile ثم عُد إلى cloudflare_challenge عند اللزوم، وللتفاعلي استخدم turnstile مباشرة.
الفرق الجوهري في جملة: التحدي المُدار يقرّر الصعوبة لكل زائر، فيمرّ معظم الزوار بلا احتكاك ويُعرض المرئي على قلّة منهم؛ أما التفاعلي فيفرض أداة تحقق مرئية على الجميع دون استثناء.
قرار سريع: أي تحدي تواجه الآن؟
استخدم الجدول التالي لتحديد وجهتك من العَرَض الظاهر أمامك مباشرة:
| العَرَض الذي تلاحظه | النوع الأرجح | أول خطوة تتخذها |
|---|---|---|
رمز 503 مع صفحة تحقق، وبعض الجلسات تمرّ دون أداة مرئية |
Managed Challenge | جرّب turnstile أولًا ثم انتقل إلى cloudflare_challenge عند الحاجة |
رمز 403 وأداة تحقق مرئية في كل مرة تقريبًا |
Interactive Challenge | عامل الصفحة كـ Turnstile مرئي مباشر |
| جلسات تمرّ أحيانًا وتتعثر أحيانًا على المسار نفسه | Managed Challenge متكيّف | خزّن نوع التحدي لكل جلسة بدل افتراض نمط ثابت |
التحدي المُدار: النهج التكيّفي الحديث
التحدي المُدار هو الإجراء الذي توصي به Cloudflare افتراضيًا، ويعتمد على إطار قرار يختار أقل تحدٍّ إزعاجًا لكل زائر:
كيف يتخذ Cloudflare قرار التحدي
WAF rule triggers Managed Challenge
↓
Cloudflare evaluates visitor signals:
├─ Browser fingerprint quality
├─ IP reputation score
├─ TLS fingerprint (JA3/JA4)
├─ Request history
├─ Behavioral signals
└─ Device capabilities
↓
Risk assessment → Challenge level selected:
├─ LOW risk → Invisible pass (no visible UI)
├─ MEDIUM risk → Non-interactive Turnstile (background PoW)
├─ HIGH risk → Interactive Turnstile (checkbox/widget)
└─ VERY HIGH risk → JavaScript challenge page (5s wait)
↓
Challenge completed
↓
cf_clearance cookie issued
يترجم هذا الإطار قرار Cloudflare إلى أربعة مستويات خطورة، من الأخف إلى الأثقل:
- خطورة منخفضة: مرور غير مرئي تمامًا دون أي واجهة (نحو 90% من الزوار).
- خطورة متوسطة: أداة Turnstile غير تفاعلية تعمل في الخلفية بإثبات عمل صامت.
- خطورة مرتفعة: أداة Turnstile تفاعلية بخانة اختيار تتطلب نقرة واحدة.
- خطورة مرتفعة جدًا: صفحة تحدي JavaScript كاملة مع انتظار قصير قبل المتابعة.
شكل صفحة التحدي في HTML
<!-- Managed Challenge page (when visible) -->
<body>
<div id="challenge-stage">
<div id="challenge-body-text">
Verifying you are human. This may take a few seconds.
</div>
<!-- Turnstile widget (when rendered) -->
<div class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg">
</div>
</div>
<!-- Challenge platform script -->
<script src="/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=...">
</script>
</body>
ماذا يرى الزائر فعليًا
يتوزّع ما يظهر للزائر بحسب تقييم المخاطر تقريبًا:
- متصفح عادي وعنوان IP جيّد: لا شيء ومرور غير مرئي (~90%).
- متصفح جديد وعنوان IP محايد: مؤشر تحميل قصير (~5%).
- إشارات مشبوهة: خانة اختيار Turnstile (~4%).
- إشارات عالية المخاطر: صفحة "جارٍ التحقق من متصفحك…" (~1%).
التحدي التفاعلي: الخيار القديم دائم الظهور
التحدي التفاعلي يعرض دائمًا اختبار CAPTCHA مرئيًا على كل زائر دون استثناء؛ فلا مرور غير مرئي هنا، وكل زائر ملزم بإكمال التحدي بنفسه.
تُميّز التحدي التفاعلي عن المُدار ثلاث علامات ثابتة تظهر في كل طلب:
- يظهر اختبار CAPTCHA في كل مرة دون استثناء، بلا أي مرور غير مرئي.
- يعيد الخادم رمز
403لا503. - تبقى الأداة حاضرة في شيفرة HTML دائمًا، فلا تختفي بين جلسة وأخرى.
آلية العمل خطوة بخطوة
WAF rule triggers Interactive Challenge
↓
Full-page CAPTCHA served (HTTP 403)
↓
Visitor must interact with CAPTCHA widget
↓
CAPTCHA solved
↓
cf_clearance cookie issued
ماذا يرى الزائر
يواجه كل زائر تحديًا بصفحة كاملة يحمل أداة تشبه Turnstile:
<!-- Interactive Challenge page -->
<body>
<div id="challenge-running">
<div class="main-wrapper">
<h2>Please verify you are human</h2>
<!-- Always-visible challenge widget -->
<div class="challenge-widget">
<!-- Checkbox + verification -->
</div>
</div>
</div>
</body>
لماذا تنصح Cloudflare بتجنّبه
تبتعد Cloudflare عن التحدي التفاعلي لأسباب عملية:
- مرئي دائمًا: 100% من الزوار يرون التحدي بلا استثناء.
- احتكاك أعلى: كل زائر مضطر للتفاعل يدويًا.
- معدل ارتداد أعلى: يغادر كثير من المستخدمين بدل إكمال التحدي.
- لا تكيّف مع المخاطر: حتى الزوار الموثوقون يواجهون التحدي نفسه.
- قيود إمكانية الوصول: لا مسار تلقائي لمن يصعب عليه إكمال التفاعل.
الجدول المرجعي: التحدي المُدار مقابل التفاعلي جنبًا إلى جنب
| الميزة | التحدي المُدار | التحدي التفاعلي |
|---|---|---|
| سنة الإطلاق | 2021 | إرث (ما قبل 2021) |
| متكيّف؟ | نعم (يقرّر Cloudflare لكل زائر) | لا (تفاعلي دائمًا) |
| إمكان المرور غير المرئي | نعم (~90% من الزوار يمرّون بلا أداة) | لا (يظهر اختبار CAPTCHA دائمًا) |
| أنواع التحدي المستخدمة | غير مرئي ← Turnstile ← JS | اختبار CAPTCHA مرئي دائمًا |
| موصى به من Cloudflare؟ | نعم (افتراضي للقواعد الجديدة) | لا (يُحتفظ به للتوافق مع الإصدارات السابقة) |
| احتكاك المستخدم | منخفض (معظمهم يمرّون دون رؤية شيء) | عالٍ (يتطلب التفاعل دائمًا) |
| حالة HTTP | 503 | 403 |
| طريقة CaptchaAI | turnstile أو cloudflare_challenge |
turnstile |
كيف تحدّد نوع تحدي Cloudflare الذي يعترض سكربتك
أدق طريقة للتمييز هي فحص رمز الحالة ومحتوى الصفحة معًا عبر ثلاث خطوات تؤتمتها الدالة التالية وتقترح طريقة الحل:
- اقرأ رمز الحالة:
503يرجّح المُدار أو تحدي JS، و403يرجّح التفاعلي أو حظر WAF. - افحص وجود
challenge-platformومسارmanagedفي شيفرة HTML. - تحقّق من ظهور أداة
cf-turnstile؛ فغيابها مع503يعني اللجوء إلى طريقةcloudflare_challenge.
import requests
import re
def identify_challenge_type(url):
"""Determine if a URL uses Managed or Interactive Challenge."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
"Accept": "text/html,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
}
response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
html = response.text
status = response.status_code
result = {
"url": url,
"status": status,
"challenge_type": None,
"cf_ray": response.headers.get("cf-ray", ""),
"solve_method": None,
}
if status == 200:
# Check for inline Turnstile widget (not a challenge page)
if "cf-turnstile" in html:
result["challenge_type"] = "turnstile_widget"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "none"
return result
if status == 503:
# 503 indicates Managed Challenge or IUAM
if "managed" in html or "challenge-platform" in html:
result["challenge_type"] = "managed_challenge"
result["solve_method"] = "turnstile" # Managed renders as Turnstile
elif "jschl" in html:
result["challenge_type"] = "iuam_js_challenge"
result["solve_method"] = "cloudflare_challenge"
else:
result["challenge_type"] = "unknown_503"
return result
if status == 403:
if "challenge" in html.lower():
result["challenge_type"] = "interactive_challenge"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "waf_block"
result["solve_method"] = None # Hard block, not solvable
return result
return result
# Usage
info = identify_challenge_type("https://protected-site.com/login")
print(f"Challenge: {info['challenge_type']}")
print(f"Solve with: {info['solve_method']}")
جدول إشارات التمييز
| الإشارة | التحدي المُدار | التحدي التفاعلي | IUAM | حظر WAF |
|---|---|---|---|---|
| حالة HTTP | 503 | 403 | 503 | 403 |
challenge-platform في HTML |
✅ | ✅ | ❌ | ❌ |
مسار managed في السكربت |
✅ | ❌ | ❌ | ❌ |
jschl في HTML |
❌ | ❌ | ✅ | ❌ |
| ظهور الأداة دائمًا | ❌ | ✅ | ❌ | ❌ |
| إمكان المرور غير المرئي | ✅ | ❌ | ❌ | ❌ |
حلّ كل نوع عبر CaptchaAI
حلّ التحدي المُدار
يُعرض التحدي المُدار عادةً على هيئة أداة Turnstile؛ استخدم طريقة turnstile:
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_managed_challenge(url, sitekey=None):
"""Solve Cloudflare Managed Challenge."""
# If sitekey not provided, extract from page
if not sitekey:
import re
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
}
page = requests.get(url, headers=headers, timeout=15)
match = re.search(
r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', page.text
)
sitekey = match.group(1) if match else None
if not sitekey:
# No visible Turnstile — try cloudflare_challenge method
return solve_js_challenge(url)
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if result.get("status") == 1:
return result["request"]
raise TimeoutError("Solve timed out")
def solve_js_challenge(url):
"""Fallback to cloudflare_challenge method."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "cloudflare_challenge",
"sitekey": "managed",
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if result.get("status") == 1:
return result["request"]
raise TimeoutError("Solve timed out")
حلّ التحدي التفاعلي
يُظهر التحدي التفاعلي أداة مرئية في كل مرة. استخدم طريقة turnstile نفسها:
def solve_interactive_challenge(url, sitekey):
"""Solve Cloudflare Interactive Challenge (legacy)."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if result.get("status") == 1:
return result["request"]
raise TimeoutError("Solve timed out")
التنفيذ في Node.js لكلا النوعين
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveCloudflareChallenge(url, type = "managed") {
const method = type === "js_challenge" ? "cloudflare_challenge" : "turnstile";
const sitekey =
type === "js_challenge" ? "managed" : await extractSitekey(url);
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: API_KEY,
method,
sitekey: sitekey || "managed",
pageurl: url,
json: 1,
},
});
const taskId = submit.data.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId, json: 1 },
});
if (result.data.status === 1) {
return result.data.request;
}
}
throw new Error("Solve timed out");
}
async function extractSitekey(url) {
try {
const response = await axios.get(url, {
headers: { "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0" },
validateStatus: () => true,
});
const match = response.data.match(
/data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/
);
return match ? match[1] : null;
} catch {
return null;
}
}
متى تستخدم كل طريقة
اختصر القرار في قاعدة واحدة:
turnstile: لأغلب الحالات — التحدي المُدار الظاهر كـ Turnstile والتفاعلي المرئي.cloudflare_challenge: حين يعيد الخادم503بصفحة "جارٍ التحقق من متصفحك" دون أداةcf-turnstileظاهرة.
سيناريو واقعي: بوابة حجوزات إقليمية تبدّل قاعدة WAF
تخيّل أنك تشرف على سكربت لمراقبة أسعار الرحلات يعمل مقابل بوابة حجوزات إقليمية في منطقة الخليج. لأشهر كانت البوابة تعيد رمز 403 مع أداة تحقق مرئية على مسار البحث، فتعالجها بطريقة turnstile وينجح الحل. ثم صار نحو 90% من الطلبات فجأة يعيد رمز 503 بلا أداة مرئية في HTML، فتوقّف السكربت عن استخراج مفتاح الموقع وبدأ يفشل.
ما حدث ليس عطلًا في سكربتك، بل انتقال البوابة من التفاعلي إلى المُدار — وهو تحوّل شائع مع تحديث القواعد. والإصلاح عملي عبر ثلاث خطوات:
- افحص رمز الحالة أولًا قبل محاولة استخراج مفتاح الموقع.
- إذا كان
503ولا توجد أداةcf-turnstileفي الصفحة، فارجع إلى طريقةcloudflare_challengeبمعرّف الموقعmanaged. - إذا ظهرت أداة Turnstile، فاستمر على طريقة
turnstileكالمعتاد.
بهذا يتعامل السكربت مع الحالتين دون تدخّل يدوي، ويبقى التعامل مع ملف cf_clearance كما هو لأن النوعين يُنتجان الملف ذاته.
عند الانتقال من التفاعلي إلى المُدار
قد يبدّل الموقع قاعدته من تفاعلي إلى مُدار في أي وقت، عملًا بتوصية Cloudflare. وهذه أبرز التغييرات التي يتحملها سكربتك:
- من تفاعلي إلى مُدار: قد يبدأ المرور غير المرئي لأغلب الطلبات (احتمال ~90%).
- من HTTP 403 إلى 503: حدّث عمليات التحقق من رمز الحالة في السكربت.
- من مرئي دائمًا إلى تكيّفي: قد تغيب أداة التحقق عن HTML بين جلسة وأخرى.
- مفتاح الموقع نفسه: يبقى كود الحل في CaptchaAI دون تغيير.
- ملف
cf_clearanceنفسه: يبقى التعامل مع ملفات تعريف الارتباط كما هو.
معالجة المشكلات الشائعة
| العَرَض | السبب | الحل |
|---|---|---|
503 بلا أداة مرئية |
مرّ التحدي المُدار بشكل غير مرئي | لا حاجة لإجراء، فقد نجح الطلب |
503 مع "جارٍ التحقق من متصفحك" |
ارتقى التحدي المُدار إلى تحدي JS | استخدم طريقة cloudflare_challenge |
403 مع اختبار CAPTCHA مرئي |
تحدٍّ تفاعلي (إرث) | استخدم طريقة turnstile |
403 بلا تحدٍّ |
حظر WAF لا تحدٍّ | غيّر عنوان IP أو نمط الطلب |
| نوع التحدي يتغيّر عشوائيًا | التحدي المُدار يتكيّف مع الإشارات | عالج تحدي Turnstile وتحدي JS معًا |
رفض cf_clearance من نوع لآخر |
تدفّقات تحدٍّ مختلفة على المجال نفسه | حُلّ أيّ تحدٍّ يُعرض عليك فعليًا |
الأسئلة الشائعة
هل يدعم CaptchaAI حل تحدي Cloudflare المُدار فعليًا؟
نعم. تدعم CaptchaAI Cloudflare Turnstile وCloudflare Challenge بشكل عام (GA). استخدم turnstile لأغلب الحالات وcloudflare_challenge عند ظهور صفحة تحدي JavaScript.
كيف أميّز نوع التحدي بسرعة دون قراءة كل كود الصفحة؟
ابدأ من رمز الحالة ثم أكّد بإشارتين في شيفرة HTML، فتصل إلى النوع خلال ثوانٍ:
503مع مرور بعض الجلسات دون أداة مرئية: تحدٍّ مُدار (أو تحدي JS).403مع أداة مرئية في كل مرة: تحدٍّ تفاعلي.- وجود
challenge-platformومسارmanagedفي HTML: يؤكّد التحدي المُدار.
لماذا يمرّ سكربتي أحيانًا ويتعثّر أحيانًا على الرابط نفسه؟
لأن التحدي المُدار تكيّفي؛ فهو يقرّر مستوى الصعوبة لكل جلسة بناءً على سمعة عنوان IP والبصمة والسلوك. لذا قد تمرّ جلسة بلا أداة وتُطالَب أخرى بأداة Turnstile. عامل كل جلسة على حدة بدل افتراض نمط ثابت.
هل تختلف تكلفة حل التحدي المُدار عن التفاعلي في CaptchaAI؟
لا. تعتمد CaptchaAI على تسعير قائم على عدد الـ threads المتزامنة، بلا رسوم إضافية حسب نوع الكابتشا. الخطط تبدأ من BASIC بسعر 15$ شهريًا (5 threads)، ويُحلّ النوعان ضمن الخطة نفسها.
الخلاصة
يختار التحدي المُدار صعوبة التحدي لكل زائر تكيّفيًا — من المرور غير المرئي حتى تحدي JS الكامل — بينما يعرض التفاعلي اختبار CAPTCHA على الجميع. النوعان يُنتجان ملف cf_clearance نفسه ويُحلّان عبر CaptchaAI: استخدم turnstile لأغلب التحديات وcloudflare_challenge لصفحات تحدي JavaScript.
مقالات ذات صلة
- فحص سلامة متصفح Cloudflare مقابل الكابتشا
- كيف تميّز بين تحدي Cloudflare وTurnstile
- كيف يعمل تحدي Cloudflare من الداخل