تقدم Cloudflare إجراءين للتحدي يمكن لمشغلي الموقع تكوينهما في قواعد WAF: التحدي المُدار و التحدي التفاعلي. التحدي المُدار هو النهج الحديث والتكيفي - تقرر Cloudflare مستوى الصعوبة لكل زائر. التحدي التفاعلي هو الخيار القديم، حيث يقدم دائمًا اختبار CAPTCHA مرئيًا. إن فهم الفرق يحدد طريقة CaptchaAI التي سيتم استخدامها وما يمكن توقعه أثناء التشغيل الآلي.
إذا كنت تريد قرارًا سريعًا قبل قراءة التفاصيل: التحدي المُدار هو الخيار الأحدث وغالبًا ما يكون أقل احتكاكًا، لكنه أصعب قليلًا في التشخيص لأن بعض الزوار يمرون من دون أداة مرئية. أما التحدي التفاعلي فهو أوضح في السلوك، لكنه يفرض تحديًا مرئيًا على الجميع تقريبًا.
قرار سريع قبل التحليل الكامل
| إذا رأيت هذا السلوك | فالاحتمال الأكبر | ما الذي تفعله أولًا؟ |
|---|---|---|
503 مع صفحة تحقق وقد تمر بعض الجلسات دون أداة مرئية |
Managed Challenge | ابدأ بمحاولة turnstile ثم ارجع إلى cloudflare_challenge عند الحاجة |
403 وتحديًا مرئيًا في كل مرة تقريبًا |
Interactive Challenge | عالج الصفحة كـ Turnstile مرئي مباشر |
| جلسات تمر أحيانًا وتتعثر أحيانًا على نفس المسار | Managed Challenge متكيف | خزّن نوع التحدي لكل جلسة بدل افتراض نمط ثابت |
مقارنة سريعة
| ميزة | التحدي المدار | التحدي التفاعلي |
|---|---|---|
| مقدمة | 2021 | الإرث (ما قبل 2021) |
| ** التكيف؟ ** | نعم (يقرر Cloudflare لكل زائر) | لا (تفاعلي دائمًا) |
| تمرير غير مرئي ممكن؟ | نعم (~ 90% من الزوار يمرون بشكل غير مرئي) | لا (يظهر دائمًا اختبار CAPTCHA) |
| أنواع التحدي المستخدمة | التحدي غير المرئي → Turnstile → JS | كلمة التحقق (CAPTCHA) مرئية دائمًا |
| ** موصى به بواسطة Cloudflare؟ ** | نعم (افتراضي للقواعد الجديدة) | لا (تم الاحتفاظ به للتوافق مع الإصدارات السابقة) |
| ** احتكاك المستخدم ** | منخفض (معظمهم يمرون دون رؤية أي شيء) | عالي (يتطلب التفاعل دائمًا) |
| حالة HTTP | 503 | 403 |
| طريقة CaptchaAI | turnstile أو cloudflare_challenge |
turnstile |
التحدي المدار (حديث)
التحدي المُدار هو إجراء التحدي الموصى به من 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
ما تجربة الزوار
| نوع الزائر | ما يرونه | النسبة المئوية |
|---|---|---|
| متصفح عادي، IP جيد | لا شيء (تمريرة غير مرئية) | ~90% |
| متصفح جديد، IP محايد | سبينر مختصر | ~5% |
| إشارات مشبوهة | خانة الاختيار Turnstile | ~4% |
| إشارات عالية المخاطر | صفحة "جارٍ التحقق من متصفحك...". | ~1% |
إخراج HTML
تستخدم صفحات التحدي المُدار منصة التحدي الخاصة بـ Cloudflare:
<!-- 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>
التحدي التفاعلي (القديمة)
يقدم التحدي التفاعلي دائمًا اختبار CAPTCHA مرئيًا يجب على الزائر التفاعل معه. لا توجد بطاقة مرور غير مرئية - كل زائر يرى التحدي ويجب عليه إكماله.
كيف يعمل
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
| قضية | تأثير |
|---|---|
| مرئي دائمًا | 100% من الزوار يرون التحدي |
| ** احتكاك أعلى ** | يجب على كل زائر التفاعل |
| ** معدل ارتداد أعلى ** | يغادر المستخدمون بدلاً من إكماله |
| ** لا يوجد التكيف مع المخاطر ** | يتعرض الزوار المعروفون للتحدي أيضًا |
| مخاوف إمكانية الوصول | يجب على كل زائر إكمال التفاعل |
الكشف: ما هو التحدي الذي أواجهه؟
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 | كتلة واف |
|---|---|---|---|---|
| حالة HTTP | 503 | 403 | 503 | 403 |
challenge-platform في HTML |
✅ | ✅ | ❌ | ❌ |
مسار managed في البرنامج النصي |
✅ | ❌ | ❌ | ❌ |
jschl في HTML |
❌ | ❌ | ✅ | ❌ |
| يظهر دائما القطعة | ❌ | ✅ | ❌ | ❌ |
| تمريرة غير مرئية ممكنة | ✅ | ❌ | ❌ | ❌ |
حل كل نوع من التحدي
حل التحدي المدارة
عادةً ما يتم عرض التحديات المُدارة كعناصر واجهة مستخدم Turnstile. استخدم طريقة CaptchaAI 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;
}
}
الهجرة من التفاعلية إلى المدارة
توصي Cloudflare بالانتقال من التحدي التفاعلي إلى التحدي المُدار. إذا كان الموقع الذي تقوم بتشغيله تلقائيًا يقوم بالتبديل:
| التغيير | التأثير على الأتمتة |
|---|---|
| التفاعلية → المدارة | قد يبدأ بالمرور بشكل غير مرئي (احتمال 90% تقريبًا) |
| HTTP 403 → 503 | تحديث عمليات التحقق من رمز الحالة |
| → مرئي دائمًا | قد لا تكون القطعة في HTML |
| نفس مفتاح الموقع | يبقى رمز الحل CaptchaAI كما هو |
| نفس إخراج cf_clearance | يبقى التعامل مع ملفات تعريف الارتباط كما هو |
استكشاف الأخطاء وإصلاحها
| أعراض | السبب | إصلاح |
|---|---|---|
| 503 مع عدم وجود القطعة المرئية | لقد مر التحدي المُدار بشكل غير مرئي | لا يلزم اتخاذ أي إجراء، لقد نجحت |
| 503 مع "التحقق من المتصفح الخاص بك" | تمكنت من الارتقاء إلى مستوى تحدي JS | استخدم طريقة cloudflare_challenge |
| 403 مع اختبار CAPTCHA المرئي | التحدي التفاعلي (القديمة) | استخدم طريقة turnstile |
| 403 بدون تحدي | كتلة WAF، وليس تحديا | تغيير IP أو نمط الطلب |
| يتغير نوع التحدي بشكل عشوائي | التحدي المُدار يتكيّف مع الإشارات | التعامل مع كل من تحدي Turnstile وJS |
| cf_clearance من نوع واحد مرفوض لنوع آخر | تدفقات التحدي المختلفة، نفس المجال | حل أي تحدي يتم تقديمه |
الأسئلة المتداولة
هل ينبغي علي دائمًا تجربة التحدي المُدار أولاً؟
نعم. تستخدم معظم المواقع "التحدي المُدار" الآن. ابدأ باستخدام طريقة turnstile، ثم ارجع إلى cloudflare_challenge إذا كانت الصفحة تعرض تحدي JavaScript (503 مع "التحقق من المتصفح").
هل يمكن لموقع ما استخدام كلا النوعين في صفحات مختلفة؟
نعم، ولكن هذا غير شائع. يمكن أن يكون لكل قاعدة WAF إجراء مختلف. قد تستخدم إحدى القواعد التحدي المُدار لـ /login والتحدي التفاعلي لـ /api/.
هل لا يزال التحدي المُدار بحاجة إلى ملف تعريف الارتباط cf_clearance؟
نعم. ينتج كلا النوعين من التحدي نفس ملف تعريف الارتباط cf_clearance. التعامل مع ملفات تعريف الارتباط متطابق بغض النظر عن نوع التحدي.
ماذا لو تجاوزني التحدي المُدار بشكل غير مرئي؟
إذا قرر التحدي المُدار أن طلبك منخفض المخاطر، فإنه يمرر الطلب دون أي اعتراض واضح. سيكون ردك 200 عادي مع محتوى الصفحة. ليست هناك حاجة إلى حل CaptchaAI في هذه الحالة.
هل تم إهمال التحدي التفاعلي؟
لم تقم Cloudflare بإهمالها رسميًا، لكنهم يوصون بالتحدي المُدار لجميع القواعد الجديدة. يبقى التحدي التفاعلي للتوافق مع الإصدارات السابقة. قد يتم ترحيل المواقع في أي وقت.
ملخص
يختار التحدي المُدار من Cloudflare بشكل تكيفي صعوبة التحدي لكل زائر (غير مرئي لتحدي JS الكامل)، بينما يقدم التحدي التفاعلي دائمًا اختبار CAPTCHA مرئيًا. كلاهما ينتج نفس ملف تعريف الارتباط cf_clearance ويتم حلهما باستخدام CaptchaAI. استخدم turnstile لمعظم التحديات وcloudflare_challenge لصفحات تحدي JavaScript. التحدي المُدار هو الوضع الافتراضي الحديث؛ التحدي التفاعلي هو إرث.
مقالات ذات صلة
- فحص تكامل متصفح Cloudflare مقابل Captcha
- Cloudflare Challenge مقابل اكتشاف Turnstile
- كيف يعمل تحدي Cloudflare