استكشاف الأخطاء

كيف تعرف نوع حماية Cloudflare: Challenge أم Turnstile؟

الفرق بينهما يتلخّص في سطر واحد: 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.


أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.