حالات الاستخدام

كيف يعمل اكتشاف CAPTCHA في تجريف الويب

اختبار CAPTCHA لا يظهر عشوائياً؛ إنه المخرج النهائي لمحرّك يمنح كل زيارة درجة ثقة بناءً على عشرات الإشارات، فإذا هبطت الدرجة تحت عتبة معيّنة عرض الموقع تحدياً بدلاً من الصفحة.

لهذا قد يعمل سكربت الأتمتة أسابيع ثم يصطدم فجأة بموجة تحديات دون تغيير واضح في الكود. ولفرق ضمان الجودة والباحثين الذين يجرون تجريفاً مصرّحاً به على مواقع يملكونها أو أُذن لهم بها، فهم هذه الدرجة هو الفرق بين مسار بيانات مستقر وآخر ينكسر عند أول توسّع. نبدأ من النموذج الأوضح — درجة reCAPTCHA v3 — ثم الإشارات التي تغذّيها وكيف يتعامل CaptchaAI مع التحدي.

كيف يتحوّل سلوكك إلى درجة: نموذج reCAPTCHA v3

يعمل reCAPTCHA v3 في الخلفية ويمنح كل زيارة درجة بين 0.0 و1.0 تحدّد إجراء الموقع تجاهها:

نطاق الدرجة التصنيف إجراء الموقع
0.7 - 1.0 الأرجح إنسان السماح بالمرور
0.3 - 0.7 غير مؤكد قد يعرض CAPTCHA
0.0 - 0.3 الأرجح روبوت حظر أو CAPTCHA

وحين تنخفض الدرجة قد يعرض الموقع تحدي reCAPTCHA v2 بدلاً من السماح المباشر — ويحل CaptchaAI الإصدارين. أبرز عواملها:

  • بيئة JavaScript وبصمة المتصفح
  • أنماط التفاعل بالمؤشر ولوحة المفاتيح
  • سمعة عنوان IP وسجل ملفات ارتباط Google
  • زمن التفاعل مع الصفحة وأسلوب التنقّل

الإشارات التي تُغذّي درجة الكشف

لا يعتمد الكشف على إشارة واحدة بل على طبقات متراكمة يرفع كل منها الشك حتى يتجاوز مجموعها العتبة:

عنوان IP ومعدّل الطلبات

أبسط الإشارات وأشيعها؛ الطلبات الكثيفة من عنوان واحد أو من نطاق مركز بيانات معروف ترفع التدقيق فوراً:

الإشارة العتبة التقريبية النتيجة
الطلبات في الدقيقة أكثر من 20-30 من عنوان واحد تحديد المعدّل أو CAPTCHA
الطلبات في الساعة أكثر من 200-500 من عنوان واحد حظر مؤقت
سمعة عنوان IP نطاق مركز بيانات معروف اختبار CAPTCHA فوري
عدم تطابق جغرافي اكتشاف VPN أو بروكسي تدقيق مرتفع

التخفيف: يوزّع تدوير الوكلاء الطلبات على عناوين متعددة فيخفض المعدّل لكل عنوان. راجع تدوير الوكلاء في تجريف CAPTCHA.

ترويسات HTTP التي تكشف الأداة

تفحص الخوادم ترويسات كل طلب بحثاً عن مؤشرات آلية؛ أبرزها:

  • User-Agent — يُعلَّم فوراً إذا حمل اسم مكتبة افتراضية
  • Accept-Language — غيابه مؤشر على أداة آلية
  • Referer — دخول صفحات عميقة بلا مُحيل يبدو مريباً
  • Cookie — غياب ملفات ارتباط الجلسة يعني زائراً جديداً أو روبوتاً

والفرق بين طلب آلي وآخر بشري واضح:

# Bot-like request (triggers CAPTCHA)
GET /page HTTP/1.1
User-Agent: python-requests/2.28.0

# Human-like request (less likely to trigger)
GET /page HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/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
Referer: https://www.google.com/

بصمة المتصفح عبر JavaScript

تُشغّل خدمات مكافحة الروبوتات JavaScript لبناء بصمة تكشف المتصفحات مقطوعة الرأس (headless)، وهي الخصائص التي تغذّي درجة reCAPTCHA v3:

// What fingerprinting scripts check:
navigator.webdriver        // true in automated browsers
navigator.plugins.length   // 0 in headless
window.chrome              // undefined in non-Chrome
navigator.languages        // unusual in headless
WebGL renderer             // "SwiftShader" = headless
canvas fingerprint         // consistent across headless instances

ملفات الارتباط وتتبّع الجلسة

تزرع المواقع ملفات ارتباط عند الزيارة الأولى ثم تتحقق من اتساقها لاحقاً؛ غيابها أو تعديلها يرفع الشك تدريجياً:

# First visit — site sets tracking cookies
# Second visit — site checks:
# - Are the cookie values consistent?
# - Was the cookie modified?
# - Is this a fresh session?

النمط السلوكي عبر الزمن

تقارن الأنظمة المتقدمة سلوك الزائر عبر الوقت بأنماط البشر:

السلوك البشري سلوك الأداة الآلية
تنقّل متغيّر بين الصفحات وصول تسلسلي منتظم
وقت متفاوت على كل صفحة تحميلات سريعة متماثلة
حركة مؤشر وتمرير للصفحة غياب أحداث الحركة والتمرير
نقرات بمواضع متفاوتة نقر على إحداثيات دقيقة متطابقة
بحث ثم تصفّح وصول مباشر إلى الروابط

آلية الكشف لدى Cloudflare

تطبّق إدارة الروبوتات في Cloudflare المنطق نفسه عبر عدة فحوص قبل تمرير الزيارة:

  1. تحدي JavaScript — يشغّل اختبارات المتصفح في صفحة وسيطة
  2. التحدي المُدار — يعرض أداة Turnstile لحركة المرور الحدّية
  3. الحظر — يرفض عناوين IP الخبيثة المعروفة
  4. سمعة IP — ترى Cloudflare نحو 20% من حركة الإنترنت، ما يمنحها ملفات ضخمة عن العناوين

يحل CaptchaAI أداة Turnstile (method=turnstile) وصفحات التحدي الكاملة (method=cloudflare_challenge) على حد سواء.

سيناريو من السوق العربي

لنفترض فريقاً في الرياض يراقب أسعار المنافسين على منصّات تجارة إلكترونية إقليمية بإذن صريح. عند حجم منخفض تكفي ترويسات واقعية وتباعد بين الطلبات، لكن مع التوسّع إلى آلاف الصفحات يومياً يصبح ظهور CAPTCHA حتمياً. عندها يحلّ CaptchaAI التحدي فور وقوعه، وتتوسّع خططه القائمة على الـ Threads المتزامنة مع حجم العمل — بدءاً من BASIC ($15 شهرياً، 5 Threads).

التعامل مع التحدي عبر CaptchaAI

أياً كانت الإشارة التي أطلقت التحدي، يحلّه CaptchaAI بالنمط نفسه: أرسل نوعه ومفتاح الموقع ورابط الصفحة، ثم استطلع النتيجة واحقن الرمز الناتج في طلبك:

import requests
import time

API_KEY = "YOUR_API_KEY"

def handle_captcha(captcha_type, site_key, page_url, **kwargs):
    params = {
        "key": API_KEY,
        "pageurl": page_url
    }

    if captcha_type == "recaptcha_v2":
        params["method"] = "userrecaptcha"
        params["googlekey"] = site_key
    elif captcha_type == "recaptcha_v3":
        params["method"] = "userrecaptcha"
        params["googlekey"] = site_key
        params["version"] = "v3"
        params["action"] = kwargs.get("action", "verify")
    elif captcha_type == "turnstile":
        params["method"] = "turnstile"
        params["sitekey"] = site_key
    elif captcha_type == "cloudflare":
        params["method"] = "cloudflare_challenge"
        params["proxy"] = kwargs["proxy"]
        params["proxytype"] = "HTTP"

    resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
    task_id = resp.text.split("|")[1]

    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
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)

الأسئلة الشائعة

ما الفرق بين تحديد معدّل الطلبات وحظر IP وظهور اختبار CAPTCHA؟

ثلاث نتائج لدرجة الشك نفسها بحدّة مختلفة: تحديد المعدّل يبطئ طلباتك مؤقتاً، والحظر يقطع الوصول كلياً، أما CAPTCHA فيبقي الباب مفتوحاً شرط إثبات أنك لست أداة آلية.

لماذا تظهر التحديات رغم استخدام وكلاء سكنية عالية الجودة؟

العناوين السكنية تخفض التردد لكنها ليست حصينة؛ فمعدّل مرتفع أو ملفات ارتباط مفقودة أو ترويسات شبيهة بالأدوات تكفي وحدها لإطلاق التحدي من عنوان نظيف.

ما أنواع CAPTCHA التي يدعمها CaptchaAI؟

يحل CaptchaAI اختبارات reCAPTCHA v2 وv3، وCloudflare Turnstile وصفحات التحدي، وGeeTest v3، والصور النصية وشبكات الصور، وBLS، لكنه لا يدعم hCaptcha ولا FunCaptcha، بينما تتوفّر CaptchaFox وFriendly Captcha وLemin بصيغة تجريبية (beta).

كيف أحدّد الإشارة التي أطلقت التحدي؟

اعزل المتغيّرات: هل يظهر مع أول طلب (غالباً IP أو الترويسات)، أم بعد عدة طلبات (المعدّل)، أم عند صفحات تحتاج جلسة (ملفات الارتباط)؟ تسجيل زمن الظهور يكشف الطبقة المسؤولة.

أدلة ذات صلة

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