الفرق بينهما يتلخّص في سطر واحد: Cloudflare Challenge صفحة كاملة تحجب الموقع قبل أن يُحمّل وتحتاج إلى method: cloudflare_challenge مع وكيل و User-Agent إلزاميين، أمّا Cloudflare Turnstile فأداة صغيرة داخل نموذج مُحمَّل بالفعل تُحلّ بـ method: turnstile ومفتاح موقع فقط. تحديد النوع الصحيح قبل الإرسال هو ما يفصل بين استجابة ناجحة ورمز خطأ متكرّر. في هذا الدليل ستتعرّف على العلامات البصرية والبرمجية التي تكشف كل نوع، ثم على الـ method المناسب لكلٍّ منهما في CaptchaAI.
الفرق الجوهري بين النوعين في نظرة واحدة
قبل أي فحص، ثبّت الصورة الكبيرة في ذهنك: النوعان يأتيان من Cloudflare لكنهما يعملان في مرحلتين مختلفتين من دورة حياة الصفحة، ويُرجعان نتيجتين مختلفتين تماماً.
| الميزة | Cloudflare Challenge | Cloudflare Turnstile |
|---|---|---|
| النوع | صفحة بينية تملأ الشاشة | أداة مُضمَّنة داخل النموذج |
| المظهر | حجب الصفحة بأكملها، "التحقق من متصفحك" | مربع اختيار صغير أو عنصر غير مرئي داخل النموذج |
| method في CaptchaAI | cloudflare_challenge |
turnstile |
| الناتج | ملف تعريف الارتباط cf_clearance |
سلسلة رمزية (توكن) |
| يتطلّب وكيلاً | نعم — إلزامي | موصى به |
| يتطلّب User-Agent | نعم — إلزامي | لا |
الخلاصة العملية: إذا حُجب الموقع كلّه فأنت أمام Challenge، وإذا ظهر المحتوى وبقيت أداة تحقّق داخل نموذج فأنت أمام Turnstile.
لماذا يهم تحديد النوع قبل إرسال الطلب
إرسال الـ method الخاطئ لا يعطيك نتيجة أضعف، بل يفشل دائماً. حين ترسل turnstile لصفحة تحدٍّ كاملة، لا يجد مزوّد الحل مفتاح موقع صالحاً فيعود الرمز ERROR_CAPTCHA_UNSOLVABLE؛ وحين ترسل cloudflare_challenge لأداة Turnstile مضمّنة، تحصل على صيغة استجابة لا يقبلها الموقع. كل محاولة فاشلة تشغل Thread وتضيّع وقتاً، ومع التشغيل على نطاق واسع تتراكم هذه الأخطاء وتُغرِق سجلّاتك بلا فائدة. لهذا يبدأ أي مسار تشخيص سليم بسؤال واحد: أي نوع من حماية Cloudflare أمامي؟ يمكنك مراجعة معاني الرموز التي تظهر في هذه الحالات ضمن مرجع رموز الأخطاء المرتبط في نهاية المقال.
تخيّل سيناريو شائعاً في السوق العربي: فريق يبني أداة لمراقبة أسعار متجر إلكتروني إقليمي. الصفحة الرئيسية تُظهر تحدّياً كامل الشاشة عند أول زيارة، بينما نموذج تسجيل الدخول لحساب التاجر يعرض أداة Turnstile صغيرة. لو عاملهما الفريق كنوع واحد، لفشل نصف الطلبات دون سبب واضح — والحل ببساطة هو كشف النوع في كل خطوة على حدة.
كيف تتعرّف على Cloudflare Challenge
Cloudflare Challenge هو صفحة بينية تملأ الشاشة وتمنع الوصول إلى المحتوى، وتظهر قبل تحميل الصفحة الفعلية. تعرفه من مؤشّرات بصرية واضحة: رسالة "يتم التحقق من متصفحك قبل الوصول إلى..."، ومؤشّر تحميل Cloudflare يدور في منتصف الشاشة، وعنوان صفحة يحمل النص "Just a moment..."، بينما يبقى عنوان URL كما هو رغم أن المحتوى المعروض هو صفحة Cloudflare لا موقعك الفعلي.
على مستوى الـ HTML، تكشف الوسوم التالية صفحة التحدي دون لبس:
<!-- Cloudflare Challenge page indicators -->
<title>Just a moment...</title>
<div id="challenge-running">...</div>
<div class="cf-browser-verification">...</div>
وللكشف الآلي داخل سكربت الأتمتة، افحص رمز الحالة ونص الاستجابة معاً:
import requests
resp = requests.get("https://example.com")
is_cf_challenge = (
resp.status_code == 403 and
"Just a moment" in resp.text or
"cf-browser-verification" in resp.text or
"challenge-platform" in resp.text
)
if is_cf_challenge:
print("Cloudflare Challenge detected — use method: cloudflare_challenge")
المؤشّر الأوضح هنا هو رمز الحالة 403 أو 503 المصحوب بأحد الوسوم أعلاه؛ فوجودها معاً يكاد يؤكّد أنك أمام صفحة تحدٍّ لا أداة مضمّنة.
كيف تتعرّف على Cloudflare Turnstile
Turnstile أداة مُضمَّنة داخل صفحة تم تحميلها بالفعل، وتظهر داخل النماذج تماماً مثل reCAPTCHA. بصرياً تلاحظ عنصر Cloudflare صغيراً داخل النموذج بنمط مربع الاختيار، بينما تبقى بقيّة محتوى الصفحة مرئية بشكل طبيعي، وتعرض الأداة عبارة "Verify you are human".
في شيفرة الصفحة، يظهر Turnstile عبر عنصر مخصّص أو عبر سكربت التحميل:
<!-- Turnstile widget indicators -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAADnPIDROz1234"></div>
<!-- Or loaded via JavaScript -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js"></script>
وبرمجياً يمكنك كشفه واستخراج مفتاح الموقع في خطوة واحدة:
import requests
resp = requests.get("https://example.com/login")
is_turnstile = (
"cf-turnstile" in resp.text or
"challenges.cloudflare.com/turnstile" in resp.text
)
if is_turnstile:
# Extract sitekey
if 'data-sitekey="' in resp.text:
start = resp.text.index('data-sitekey="') + 14
end = resp.text.index('"', start)
sitekey = resp.text[start:end]
print(f"Turnstile detected — sitekey: {sitekey}")
print("Use method: turnstile")
لاحظ أن الكود لا يكتفي بكشف Turnstile بل يستخرج مفتاح الموقع (sitekey) مباشرة من السمة data-sitekey؛ وهذا المفتاح هو ما ستمرّره لاحقاً إلى الـ method، فبدونه يعود الطلب برمز ERROR_BAD_PARAMETERS.
دالة كشف موحّدة تجمع الفحصين
بدل تكرار الفحصين يدوياً، اجمعهما في دالة واحدة تُرجع النوع والـ method الجاهز للإرسال. الترتيب مقصود: نفحص التحدي كامل الشاشة أولاً لأنه يظهر عبر رمز الحالة، ثم الأداة المضمّنة.
def detect_cloudflare_type(url):
"""Detect which Cloudflare protection a URL uses."""
resp = requests.get(url, allow_redirects=True)
# Check for full-page Challenge
if resp.status_code in [403, 503]:
if any(marker in resp.text for marker in [
"Just a moment",
"cf-browser-verification",
"challenge-platform",
"challenge-running"
]):
return {"type": "cloudflare_challenge", "method": "cloudflare_challenge"}
# Check for embedded Turnstile
if "cf-turnstile" in resp.text or "challenges.cloudflare.com/turnstile" in resp.text:
sitekey = None
if 'data-sitekey="' in resp.text:
start = resp.text.index('data-sitekey="') + 14
end = resp.text.index('"', start)
sitekey = resp.text[start:end]
return {"type": "turnstile", "method": "turnstile", "sitekey": sitekey}
return {"type": "none", "method": None}
# Usage
result = detect_cloudflare_type("https://example.com")
print(f"Protection: {result['type']}")
print(f"CaptchaAI method: {result['method']}")
اجعل هذه الدالة أول خطوة في سير عملك: استدعِها قبل كل عملية حل، واعتمد على قيمة method التي تُرجعها بدلاً من ترميز النوع يدوياً في الكود.
كيفية حل كل نوع عبر CaptchaAI
بعد تحديد النوع، الإرسال إلى CaptchaAI مباشر. لاحظ أن حقول تحدي الصفحة الكاملة إلزامية بالكامل، بينما يكتفي Turnstile بمفتاح الموقع وعنوان الصفحة.
Cloudflare Challenge:
data = {
"key": "YOUR_API_KEY",
"method": "cloudflare_challenge",
"pageurl": "https://example.com",
"proxy": "host:port:user:pass", # MANDATORY
"proxytype": "HTTP", # MANDATORY
"userAgent": "Mozilla/5.0 ...", # MANDATORY
"json": 1
}
# Returns cf_clearance cookie — set it in your session
Cloudflare Turnstile:
data = {
"key": "YOUR_API_KEY",
"method": "turnstile",
"sitekey": "0x4AAAAAAADnPIDROz1234",
"pageurl": "https://example.com/login",
"json": 1
}
# Returns a token — inject into cf-turnstile-response field
تدعم CaptchaAI كلا النوعين ضمن خططها القائمة على الـ Thread، بدءاً من خطة BASIC بسعر $15 شهرياً و5 خيوط معالجة متزامنة، وصولاً إلى الخطط الأعلى للأحمال الكبيرة. لأن التسعير يعتمد على عدد الخيوط لا على عدد عمليات الحل، يمكنك حل النوعين بأي حجم دون رسوم إضافية لكل عملية.
أخطاء شائعة وكيفية إصلاحها
هذه الأخطاء الأربعة الأكثر تكراراً تنشأ كلها من الخلط بين النوعين أو من نقص حقل إلزامي في الطلب:
- إرسال
turnstileلصفحة تحدٍّ يعيدERROR_CAPTCHA_UNSOLVABLE— بدّل إلىcloudflare_challenge. - إرسال
cloudflare_challengeلأداة Turnstile يعطي صيغة استجابة خاطئة — بدّل إلىturnstile. - غياب الوكيل مع التحدي يعيد
ERROR_PROXY_NOT_AUTHORIZED— أضِف وكيلاً فهو إلزامي هنا. - غياب مفتاح الموقع مع Turnstile يعيد
ERROR_BAD_PARAMETERS— استخرج المفتاح من HTML الصفحة.
الأسئلة الشائعة
ما أسرع فحص بصري للتمييز بين النوعين قبل كتابة أي كود؟
انظر إلى الصفحة بعينك: إذا حُجب المحتوى بالكامل خلف شاشة "التحقق من متصفحك" فهو Challenge، وإذا رأيت الصفحة كاملة مع مربّع تحقّق صغير داخل نموذج فهو Turnstile. هذا الفحص السريع يكفي في أغلب الحالات قبل اللجوء إلى الكشف البرمجي.
هل يمكنني تخزين ملف تعريف الارتباط cf_clearance وإعادة استخدامه؟
نعم لفترة محدودة. الملف مرتبط بعنوان IP الخاص بالوكيل الذي وُلِّد منه، فما دمت تُرسل الطلبات من العنوان نفسه يبقى صالحاً حتى انتهاء صلاحيته. عند تغيّر عنوان IP أو انتهاء المهلة، أعِد حل التحدي للحصول على ملف جديد.
هل تدعم CaptchaAI حل النوعين معاً؟ وما الخطط المناسبة للحجم الكبير؟
نعم، Cloudflare Challenge وCloudflare Turnstile كلاهما مدعوم بشكل كامل، والتسعير قائم على عدد الخيوط المتزامنة مع عمليات حل غير محدودة لكل خيط:
- BASIC — $15 شهرياً و5 خيوط، للتجارب والأحمال الصغيرة.
- ADVANCE — $90 شهرياً و50 خيطاً، للأحمال المتوسطة.
- PREMIUM — $170 شهرياً و100 خيط، للتشغيل على نطاق واسع.
لأن الفوترة تحسب الخيوط لا عمليات الحل، تعالج النوعين بأي حجم دون رسوم لكل عملية.
ظهر لي Cloudflare رغم أن الكشف أعاد "لا شيء" — ما السبب؟
بعض إجراءات Cloudflare لا تُفعَّل إلا مع إجراءات محدّدة مثل طلبات POST أو نداءات API، أو لوكلاء مستخدمين بعينهم. جرّب الوصول إلى العنوان بـ User-Agent يشبه الروبوت لاستدعاء التحدي، ثم أعِد تشغيل دالة الكشف.
حلّ حماية Cloudflare بنوعيها مع CaptchaAI
تعامل مع Challenge وTurnstile معاً من واجهة واحدة عبر captchaai.com.