المقارنات

تحدي Cloudflare المُدار مقابل التحدي التفاعلي

حين يصطدم سكربت الأتمتة بصفحة تحقق من 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 إلى أربعة مستويات خطورة، من الأخف إلى الأثقل:

  1. خطورة منخفضة: مرور غير مرئي تمامًا دون أي واجهة (نحو 90% من الزوار).
  2. خطورة متوسطة: أداة Turnstile غير تفاعلية تعمل في الخلفية بإثبات عمل صامت.
  3. خطورة مرتفعة: أداة Turnstile تفاعلية بخانة اختيار تتطلب نقرة واحدة.
  4. خطورة مرتفعة جدًا: صفحة تحدي 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 مرئيًا على كل زائر دون استثناء؛ فلا مرور غير مرئي هنا، وكل زائر ملزم بإكمال التحدي بنفسه.

تُميّز التحدي التفاعلي عن المُدار ثلاث علامات ثابتة تظهر في كل طلب:

  1. يظهر اختبار CAPTCHA في كل مرة دون استثناء، بلا أي مرور غير مرئي.
  2. يعيد الخادم رمز 403 لا 503.
  3. تبقى الأداة حاضرة في شيفرة 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 الذي يعترض سكربتك

أدق طريقة للتمييز هي فحص رمز الحالة ومحتوى الصفحة معًا عبر ثلاث خطوات تؤتمتها الدالة التالية وتقترح طريقة الحل:

  1. اقرأ رمز الحالة: 503 يرجّح المُدار أو تحدي JS، و403 يرجّح التفاعلي أو حظر WAF.
  2. افحص وجود challenge-platform ومسار managed في شيفرة HTML.
  3. تحقّق من ظهور أداة 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، فتوقّف السكربت عن استخراج مفتاح الموقع وبدأ يفشل.

ما حدث ليس عطلًا في سكربتك، بل انتقال البوابة من التفاعلي إلى المُدار — وهو تحوّل شائع مع تحديث القواعد. والإصلاح عملي عبر ثلاث خطوات:

  1. افحص رمز الحالة أولًا قبل محاولة استخراج مفتاح الموقع.
  2. إذا كان 503 ولا توجد أداة cf-turnstile في الصفحة، فارجع إلى طريقة cloudflare_challenge بمعرّف الموقع managed.
  3. إذا ظهرت أداة 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.

مقالات ذات صلة

أدلة ذات صلة

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