المقارنات

فحص تكامل متصفح Cloudflare مقابل تحدي CAPTCHA

إذا اصطدم سكربتك بحائط Cloudflare، فالسؤال الأول قبل أي إصلاح هو: هل تعرّضت لحظر فحص تكامل المتصفح (BIC) أم لـتحدي CAPTCHA؟ الفرق ليس شكلياً؛ فكلٌّ منهما يعطيك رمز حالة مختلفاً ويتطلب علاجاً مختلفاً. فحص تكامل المتصفح فحص سلبي يقرأ رؤوس HTTP ويردّ 403 دون أي واجهة تحدٍّ، بينما تحدي CAPTCHA — مثل Turnstile أو التحدي المُدار — مهمة قابلة للحل يجتازها المتصفح الحقيقي ويصاحبها عادةً رمز 503.

قبل أن تكتب سطراً واحداً من الإصلاح، احسم التشخيص في ثلاث نقاط:

  • حظر BIC يعني رؤوساً خاطئة. أصلح رؤوس الطلب لتبدو كمتصفح حقيقي؛ لا حاجة إلى أي خدمة حل.
  • تحدي CAPTCHA يعني مهمة قابلة للحل. استخدم طريقة turnstile أو cloudflare_challenge في CaptchaAI.
  • 403 دائم مع كل الرؤوس يعني حظر IP. غيّر عنوان IP أو الوكيل.

الفرق في لمحة: BIC مقابل تحدي CAPTCHA

اقرأ الجدول من زاوية عملية: ماذا يفحص كل دفاع، وماذا ترى، وهل تحتاج خدمة حل.

العنصر فحص تكامل المتصفح (BIC) تحدي CAPTCHA
ما الذي يفحصه رؤوس HTTP فقط سلوك المتصفح وبيئته
هل يتطلب JavaScript؟ لا (على مستوى الرؤوس) نعم
ما يراه المستخدم لا شيء عند النجاح، أو 403 عند الفشل أداة تحدٍّ أو صفحة JavaScript
رمز الحالة عند الفشل 403 503
هل هو قابل للحل؟ لا — أصلح الرؤوس أو يبقى الحظر نعم — حُلّ تحدي CAPTCHA
ملف تعريف ارتباط يُصدَر لا cf_clearance
هل تحتاج CaptchaAI؟ لا — أصلح رؤوس الطلب نعم
مُفعّل افتراضياً نعم (في كل خطط Cloudflare) لا (يُضبط لكل قاعدة)
ينطبق على كل طلب مطابقات قواعد WAF فقط

ما هو فحص تكامل المتصفح (BIC) وكيف يعمل

يقيّم فحص تكامل المتصفح رؤوس طلب HTTP لاكتشاف حركة المرور غير المتصفحية، وهو يعمل قبل أي تحدي JavaScript أو CAPTCHA. كلما ابتعد طلبك عن شكل متصفح حقيقي، ارتفع احتمال حظره هنا.

ما الذي يفحصه BIC في طلبك

يجمع الفحص إشارات عدة، وأيٌّ منها قد يكفي للحظر:

  • User-Agent — وكيل مستخدم مفقود أو فارغ أو معروف أنه سيئ، مثل python-requests/2.31 أو curl أو wget.
  • ترتيب الرؤوس — ترتيب غير معتاد تنتجه مكتبات HTTP غير المتصفحية.
  • رؤوس متصفح مفقودة — غياب Accept أو Accept-Language أو Accept-Encoding، وهو ما يميّز العملاء المبسّطين.
  • توقيعات بوتات معروفة — وكلاء أدوات إرسال مزعج أو ماسحات ضوئية، أو Googlebot قادم من عناوين IP لا تخص Google.
  • قوائم حظر عناوين IP — عناوين ضارة معروفة أو عناوين مراكز بيانات مدرجة في قوائم الحظر.

مسار عمل BIC خطوة بخطوة

Request hits Cloudflare edge
    ↓
BIC evaluates HTTP headers:
  ├─ User-Agent present and valid?
  ├─ Required headers (Accept, Accept-Language) present?
  ├─ Header order consistent with browser?
  └─ IP not on abuse list?
    ↓
Pass → Request forwarded to origin
    OR
Fail → 403 Forbidden (no challenge offered)

كيف تجتاز BIC في Python

يُعالَج بإرسال رؤوس تشبه المتصفح، دون حل أي CAPTCHA. قارن بين الطلب المبسّط الذي يفشل والطلب المزوّد برؤوس كاملة الذي ينجح:

import requests

# ❌ FAILS BIC — minimal headers
response = requests.get("https://cloudflare-protected.com")
# User-Agent: python-requests/2.31.0
# Result: 403 Forbidden

# ✅ PASSES BIC — browser-like headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,"
              "image/avif,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
}

response = requests.get("https://cloudflare-protected.com", headers=headers)
# Result: 200 OK (passed BIC)

المكافئ في Node.js

const axios = require("axios");

// Browser-like headers to pass BIC
const headers = {
  "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0",
  Accept:
    "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,*/*;q=0.8",
  "Accept-Language": "en-US,en;q=0.9",
  "Accept-Encoding": "gzip, deflate, br",
  Connection: "keep-alive",
  "Upgrade-Insecure-Requests": "1",
  "Sec-Fetch-Dest": "document",
  "Sec-Fetch-Mode": "navigate",
  "Sec-Fetch-Site": "none",
  "Sec-Fetch-User": "?1",
};

async function fetchWithBIC(url) {
  const response = await axios.get(url, { headers });
  console.log(`Status: ${response.status}`);
  return response.data;
}

تحديات CAPTCHA من Cloudflare

تعمل تحديات CAPTCHA بعد اجتياز فحص تكامل المتصفح، وتتطلب تنفيذ JavaScript وتمثّل مهمة قابلة للحل بخلاف حظر BIC الصامت. هنا فقط يصبح استخدام خدمة حل مثل CaptchaAI منطقياً.

أنواع تحديات Cloudflare

تنقسم التحديات إلى أربعة أنماط، وكلٌّ منها يقابله طريقة حل محددة في CaptchaAI:

  • أداة Turnstile — يدمجها المطوّر داخل الصفحة وتظهر على النموذج، وتُحل بطريقة turnstile.
  • التحدي المُدار — تُطلقه قاعدة WAF بشكل متكيّف (غير مرئي أو مربع اختيار)، وطريقته turnstile.
  • تحدي JavaScript — ينشأ من وضع IUAM أو قاعدة WAF ويعرض صفحة "جارٍ التحقق من متصفحك"، وطريقته cloudflare_challenge.
  • التحدي التفاعلي — يظهر عند الاشتباه المرتفع كتحدٍّ بملء الصفحة، وطريقته cloudflare_challenge.

مسار عمل التحدي (يختلف عن BIC)

Request passes BIC check
    ↓
WAF rules evaluate bot score, IP, path
    ↓
Rule triggers CAPTCHA challenge (HTTP 503)
    ↓
Browser executes JavaScript challenge
    ↓
Challenge solved → cf_clearance cookie issued
    ↓
Subsequent requests pass with cookie

شخّص نوع الحظر قبل أن تُصلح شيئاً

نوع الحظر هو ما يحدد الإصلاح. السكربت التالي يرسل الطلب مرتين — برؤوس مبسّطة ثم برؤوس متصفح — ويستنتج نوعه من رمزَي الحالة:

import requests

def diagnose_cloudflare_block(url):
    """Determine if block is BIC or CAPTCHA."""
    # Intentionally use minimal headers to trigger BIC
    minimal_response = requests.get(url, timeout=15, allow_redirects=False)

    # Use browser headers to bypass BIC
    browser_headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
        "Accept": "text/html,application/xhtml+xml,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate, br",
    }
    browser_response = requests.get(
        url, headers=browser_headers, timeout=15, allow_redirects=False
    )

    result = {
        "minimal_headers_status": minimal_response.status_code,
        "browser_headers_status": browser_response.status_code,
    }

    if minimal_response.status_code == 403 and browser_response.status_code == 200:
        result["diagnosis"] = "BIC only — fix headers to pass"
        result["fix"] = "Add browser-like headers"

    elif minimal_response.status_code == 403 and browser_response.status_code == 403:
        result["diagnosis"] = "IP or WAF block — not just BIC"
        result["fix"] = "Change IP or check WAF rules"

    elif browser_response.status_code == 503:
        html = browser_response.text
        if "jschl" in html:
            result["diagnosis"] = "IUAM JavaScript challenge"
            result["fix"] = "Use CaptchaAI cloudflare_challenge method"
        elif "cf-turnstile" in html or "challenge-platform" in html:
            result["diagnosis"] = "Managed/Turnstile challenge"
            result["fix"] = "Use CaptchaAI turnstile method"
        else:
            result["diagnosis"] = "Unknown Cloudflare challenge"
            result["fix"] = "Inspect page source for challenge type"

    elif browser_response.status_code == 200:
        html = browser_response.text
        if "cf-turnstile" in html:
            result["diagnosis"] = "Page loads but has Turnstile widget"
            result["fix"] = "Use CaptchaAI turnstile method for form submission"
        else:
            result["diagnosis"] = "No challenge — page accessible"
            result["fix"] = "None needed"

    return result


# Usage
diagnosis = diagnose_cloudflare_block("https://example-cf-site.com")
print(f"Diagnosis: {diagnosis['diagnosis']}")
print(f"Fix: {diagnosis['fix']}")

استكشاف الأخطاء الشائعة وحلولها

اربط كل عَرَض بسببه وإصلاحه الأسرع:

العَرَض السبب الإصلاح
403 مع رؤوس مبسّطة و200 مع رؤوس المتصفح BIC فقط استخدم رؤوساً تشبه المتصفح
403 مع كل تركيبات الرؤوس حظر IP أو قاعدة WAF جرّب عنوان IP أو وكيلاً مختلفاً
503 مع صفحة تحدٍّ تحدي CAPTCHA (وليس BIC) استخدم CaptchaAI
403 متقطّع تحديد معدل الطلبات أو حظر مرتبط بالجلسة خفّض معدل الطلبات وحافظ على الجلسة
الرؤوس صحيحة ومع ذلك 403 فحص بصمة TLS (JA3) استخدم curl_cffi أو متصفحاً حقيقياً

سيناريوهات واقعية وطريقة التعامل مع كلٍّ منها

تخيّل سكربت أتمتة يراقب توافر المنتجات على متجر إلكتروني إقليمي محمي بـ Cloudflare. في أول تشغيل تحصل على 403 لأن مكتبة HTTP ترسل وكيل المستخدم python-requests؛ هذا حظر BIC صرف. بعد ضبط الرؤوس يعود الرد 200، لكن نموذج الدخول يعرض أداة Turnstile — وهنا فقط تدخل CaptchaAI عبر طريقة turnstile. النقاط التالية تغطّي معظم الحالات:

السيناريو 1: حظر BIC فقط

Request with python-requests UA → 403
Request with Chrome UA → 200 ✓

Fix: Add proper browser headers. No CaptchaAI needed.

السيناريو 2: اجتياز BIC ثم ظهور تحدي CAPTCHA

Request with Chrome UA → 503 (challenge page)

Fix: Headers are fine. Use CaptchaAI to solve the challenge.

السيناريو 3: BIC وتحدي CAPTCHA معاً

Request with python-requests UA → 403 (BIC block)
Request with Chrome UA → 503 (CAPTCHA challenge)

Fix: First fix headers, then solve CAPTCHA with CaptchaAI.

السيناريو 4: لا هذا ولا ذاك — حظر IP

Request with python-requests UA → 403
Request with Chrome UA → 403

Fix: Neither BIC nor solvable challenge. IP is blocked.
Try different IP/proxy.

أفضل ممارسات الرؤوس لاجتياز BIC

مجموعة الرؤوس الأساسية

اجعلها نقطة انطلاقك الثابتة لأي عميل HTTP يتعامل مع مواقع Cloudflare؛ فهي تجمع الرؤوس الإلزامية والموصى بها:

CLOUDFLARE_SAFE_HEADERS = {
    # Mandatory
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",

    # Strongly recommended
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",

    # Sec-Fetch headers (modern Chrome)
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",

    # Recommended for consistency
    "Sec-Ch-Ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"Windows"',
}

الرؤوس التي تُطلق حظر BIC

هذه القيم تكشف العميل الآلي فوراً؛ تجنّبها أو استبدلها بقيم متصفح حقيقية:

  • User-Agent: python-requests/2.31.0 — معرّف مكتبة HTTP معروف.
  • User-Agent: curl/7.81.0 — معرّف أداة سطر أوامر.
  • غياب رأس Accept — لا متصفح يحذفه.
  • غياب Accept-Language — كل المتصفحات ترسله.
  • User-Agent: "" فارغ — غير صالح ودليل أتمتة واضح.
  • User-Agent: Googlebot/2.1 من عنوان IP لا يخص Google — هوية بوت مزيّفة.

أسئلة شائعة

كيف أفرّق بسرعة بين حظر BIC وتحدي CAPTCHA؟

ابدأ من رمز الحالة، ثم أرسِل الطلب مرتين وقارن كما في سكربت التشخيص أعلاه:

  • 403 دون واجهة تحدٍّ ← فحص تكامل المتصفح على الأرجح.
  • 503 مع صفحة "جارٍ التحقق من متصفحك" أو أداة Turnstile ← تحدي CAPTCHA.

هل يكفي تغيير User-Agent وحده لاجتياز BIC؟

نادراً. وكيل المستخدم المتصفحي شرط ضروري لكنه غير كافٍ؛ إذ يتحقق BIC أيضاً من وجود Accept وAccept-Language وAccept-Encoding ومن اتساق ترتيب الرؤوس. أرسِل المجموعة الكاملة، لا وكيل المستخدم وحده.

رؤوسي كاملة ومع ذلك أحصل على 403، ما السبب؟

غالباً لم يعُد الأمر متعلقاً بـ BIC، بل بعنوان IP مدرج في قائمة حظر، أو قاعدة WAF، أو فحص بصمة TLS مثل JA3. جرّب عنوان IP نظيفاً، وإن استمر الحظر فاستخدم عميلاً يحاكي بصمة TLS مثل curl_cffi.

هل يحلّ CaptchaAI فحص تكامل المتصفح؟

لا، ولا يُفترض به ذلك. فحص تكامل المتصفح مسألة رؤوس لا تحدٍّ قابل للحل؛ أصلح رؤوس HTTP بنفسك. يتولّى CaptchaAI ما يأتي بعده: تحديات Turnstile والتحديات المُدارة وتحديات JavaScript عبر طريقتَي turnstile وcloudflare_challenge.

متى أستخدم طريقة turnstile ومتى cloudflare_challenge؟

يعتمد الاختيار على شكل التحدي في الصفحة:

  • أداة Turnstile أو تحدٍّ مُدار ← طريقة turnstile.
  • صفحة "جارٍ التحقق من متصفحك" (وضع IUAM) أو تحدي JavaScript ← طريقة cloudflare_challenge.

وإن لم تكن متأكداً، افحص مصدر الصفحة: وجود cf-turnstile يرجّح الأولى، ووجود jschl يرجّح الثانية.

الخلاصة

يحظر فحص تكامل متصفح Cloudflare الطلبات ذات الرؤوس غير المتصفحية برمز 403، بينما تقدّم تحديات CAPTCHA مهمة قابلة للحل برمز 503. يُعالَج فحص تكامل المتصفح برؤوس مناسبة تشبه المتصفح دون حاجة إلى CaptchaAI، أما تحديات CAPTCHA فتحتاج إلى طريقة Turnstile أو Cloudflare Challenge من CaptchaAI. شخّص نوع الحظر أولاً: أصلح الرؤوس لأجل BIC، واستخدم CaptchaAI لتحديات CAPTCHA، وغيّر عنوان IP للحظر الصلب.

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

أدلة ذات صلة

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