الشروحات المعمقة

GeeTest v4: أبرز التغييرات وطريقة الحل

إذا توقّف سكربت الأتمتة فجأة على موقع كان يعمل بلا مشاكل، فقد يكون السبب أن الموقع انتقل من GeeTest v3 إلى GeeTest v4. يختلف الإصداران في البنية وأنواع التحديات وآلية التحقق إلى حدّ أن الشيفرة التي تبحث عن معاملَي gt وchallenge لن تجد لهما أثراً في v4. والخلاصة العملية أولاً: يحل CaptchaAI اختبارات GeeTest v3 اليوم بمعدل نجاح مرتفع، أما دعم GeeTest v4 فهو قادم قريباً ولم يُتَح بعد.

يوضّح هذا الدليل ما الذي تغيّر بالضبط في الإصدار الرابع، وكيف تكتشف الإصدار الذي يعمل على صفحتك، وكيف تُجهّز تكاملك لمسار الحل المخطّط لـ v4 مع الاستمرار في حلّ v3 اليوم. جميع الأمثلة بلغة Python وتعتمد على Selenium وطلبات HTTP مباشرة إلى واجهة CaptchaAI، ويمكنك تكييفها بسهولة مع Node.js أو أي بيئة أخرى.


أبرز الفروق بين GeeTest v3 و v4

على المستوى العملي، أهم فرق هو أن v4 نقل جزءاً كبيراً من منطق التهيئة إلى جانب العميل واستبدل معامل challenge الثابت بنظام تحقق قائم على lot_number وpass_token. الجدول التالي يلخّص الفروق التي تهمّ مهندس الأتمتة مباشرةً:

الميزة GeeTest v3 GeeTest v4
التهيئة gt + challenge من الخادم captcha_id فقط
مصدر معامل التحدي يأتي من استدعاء API يُنشأ من جانب العميل
أنواع التحديات سحب، نقر سحب، نقر، اختيار أيقونات، استدلال مكاني
التحقق الخادم يعيد challenge يعتمد على lot_number + pass_token
نقطة نهاية API api.geetest.com gcaptcha4.geetest.com
تدرّج الصعوبة ثابت تقييم مخاطر تكيّفي

النتيجة المباشرة لهذه الفروق أن أي تكامل مبني على v3 يحتاج إلى مراجعة قبل أن يتعامل مع v4: تتغيّر المعاملات التي ترسلها، وتتغيّر الرموز التي تستقبلها، بل ويتغيّر عنوان نقطة النهاية التي يخاطبها المتصفح.


أنواع تحديات GeeTest v4 الجديدة

وسّع GeeTest v4 مجموعة التحديات إلى أربعة أنماط رئيسية، بعضها موروث من v3 وبعضها جديد كلياً. فهم هذه الأنماط يساعدك على تفسير ما يراه المستخدم النهائي على الشاشة، حتى لو كان الحل عبر واجهة برمجة التطبيقات لا يتطلب منك التعامل معها يدوياً.

لغز السحب

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

النقر والاختيار

يُطلب من المستخدم النقر على كائنات محددة داخل صورة، مثل "انقر على كل الوجوه"، ويعتمد على التعرّف على الرموز والصور.

الاستدلال المكاني

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

مطابقة الأيقونات

يطابق المستخدم أيقونات معروضة ضمن تسلسل محدد، وهو من أصعب الأنماط على الأتمتة اليدوية لاعتماده على ترتيب متغيّر.

وبمجرد توفّر دعم v4، ستتكفّل واجهة CaptchaAI بتجريد منطق كل تحدٍّ عنك تماماً كما تفعل مع v3. أما اليوم، فإن CaptchaAI يحل GeeTest v3، ودعم الإصدار v4 قادم قريباً.


كيف تكتشف إصدار GeeTest على الصفحة؟

قبل أي محاولة حل، تحقّق من الإصدار الفعلي على الصفحة. أوضح مؤشّرَين على v4 هما ظهور captcha_id بدل gt، ووجود سكربت gcaptcha4 أو gt4.js في مصدر الصفحة. تخيّل فريقاً في الرياض يُجري اختبارات جودة آلية على صفحة تسجيل الدخول في بوابة تجارة إلكترونية إقليمية: بعد ترقية المزوّد إلى v4، بدأت السكربتات تُعيد ERROR_WRONG_CAPTCHA_ID لأنها ما زالت ترسل قيمة gt القديمة. خطوتهم الأولى هي تأكيد الإصدار برمجياً قبل أي شيء آخر، وهذا ما تفعله الدالة التالية:

# extract_geetest_v4.py
import re
from selenium import webdriver


def extract_geetest_v4_params(url):
    """Extract GeeTest v4 captcha_id from a page."""
    driver = webdriver.Chrome()
    driver.get(url)

    page_source = driver.page_source

    # GeeTest v4 uses captcha_id instead of gt
    match = re.search(r'captcha_id["\']?\s*[:=]\s*["\']([a-f0-9]+)', page_source)
    captcha_id = match.group(1) if match else None

    # Check for v4-specific script
    is_v4 = "gcaptcha4" in page_source or "gt4.js" in page_source

    driver.quit()

    return {
        "captcha_id": captcha_id,
        "is_v4": is_v4,
        "pageurl": url,
    }


# Usage
params = extract_geetest_v4_params("https://example.com/login")
print(f"Captcha ID: {params['captcha_id']}")
print(f"Is v4: {params['is_v4']}")

لأن كثيراً من المواقع تبني عنصر التحدي عبر JavaScript بعد تحميل الصفحة، فإن الاعتماد على متصفح حقيقي مثل Selenium أدقّ من قراءة الـ HTML الخام؛ فهو يمنح الصفحة فرصة لحقن captcha_id قبل أن تبحث عنه.


مسار حل GeeTest v4 المخطّط (قادم قريباً)

دعم GeeTest v4 مُدرَج على خارطة طريق CaptchaAI ولم يُتَح بعد؛ لا يمكن وصفه إلا بأنه قادم قريباً. حتى إطلاقه، اعتمد على GeeTest v3 الذي يحله CaptchaAI اليوم بمعدل نجاح مرتفع. يوضّح المثال التالي المسار المخطّط لـ v4 حتى يكون تكاملك جاهزاً؛ راجع صفحة الأنواع المدعومة في CaptchaAI للاطلاع على الحالة الحالية. النمط ثابت: أرسل المهمة، ثم استطلع النتيجة دورياً حتى تجهز الرموز.

# solve_geetest_v4.py
import requests
import time
import os


def solve_geetest_v4(captcha_id, pageurl):
    """Submit GeeTest v4 to CaptchaAI and get solution."""
    api_key = os.environ["CAPTCHAAI_API_KEY"]

    # Submit task
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "geetest",
        "gt": captcha_id,      # captcha_id maps to the gt parameter
        "pageurl": pageurl,
        "version": "4",        # Specify v4 explicitly
        "json": 1,
    }, timeout=30)

    result = resp.json()
    if result.get("status") != 1:
        raise RuntimeError(f"Submit failed: {result.get('request')}")

    task_id = result["request"]

    # Poll for result
    time.sleep(10)
    for _ in range(30):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key,
            "action": "get",
            "id": task_id,
            "json": 1,
        }, timeout=15)
        data = resp.json()

        if data.get("status") == 1:
            return data["request"]  # Contains validation tokens
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("GeeTest v4 solve timeout")


# Usage
solution = solve_geetest_v4(
    captcha_id="abc123def456",
    pageurl="https://example.com/login",
)
print(f"Solution: {solution}")

لاحظ أن المعامل version: "4" صريح في الطلب، وأن captcha_id يُمرَّر عبر حقل gt نفسه. الفحص الدوري هنا يبدأ بعد مهلة عشر ثوانٍ ثم يعيد المحاولة كل خمس ثوانٍ، وهو نمط استطلاع مناسب لتحديات GeeTest عموماً.


حقن رموز التحقق بعد الحل

خلافاً لـ v3 الذي يكتفي بقيمة challenge واحدة، يعيد الإصدار الرابع مجموعة رموز — lot_number وpass_token وgen_time وcaptcha_output — يجب حقنها في الحقول المخفية للنموذج قبل إرساله. الدالة التالية تُحلّل الاستجابة وتضع كل رمز في مكانه:

# inject_geetest_v4.py
import json
from selenium import webdriver
from selenium.webdriver.common.by import By


def inject_geetest_v4_solution(driver, solution):
    """Inject GeeTest v4 solution tokens into the page."""
    # Parse solution — v4 returns different tokens than v3
    if isinstance(solution, str):
        try:
            solution = json.loads(solution)
        except json.JSONDecodeError:
            pass

    # GeeTest v4 validation uses lot_number, pass_token, gen_time, captcha_output
    driver.execute_script("""
        var solution = arguments[0];

        // Set hidden form fields
        var fields = {
            'lot_number': solution.lot_number,
            'pass_token': solution.pass_token,
            'gen_time': solution.gen_time,
            'captcha_output': solution.captcha_output,
        };

        for (var name in fields) {
            var input = document.querySelector('input[name="' + name + '"]');
            if (!input) {
                input = document.createElement('input');
                input.type = 'hidden';
                input.name = name;
                document.forms[0].appendChild(input);
            }
            input.value = fields[name];
        }

        // Trigger validation callback if available
        if (window.captchaObj && typeof window.captchaObj.appendTo === 'function') {
            window.captchaObj.appendTo('#captcha-container');
        }
    """, solution)

أهم نقطة هنا هي تحليل الاستجابة كـ JSON أولاً؛ فمعاملتها كسلسلة نصية واحدة تُفقدك القدرة على الوصول إلى كل رمز على حدة، وهي أكثر الأخطاء شيوعاً عند الانتقال من v3 إلى v4.


معالجة الأخطاء الشائعة

معظم مشكلات v4 ترجع إلى خلط معاملات الإصدارين أو إلى تنسيق الاستجابة. الجدول التالي يربط كل رسالة خطأ بسببها المباشر وحلّها:

المشكلة السبب الحل
ERROR_WRONG_CAPTCHA_ID إرسال قيمة gt الخاصة بـ v3 بدل captcha_id الخاصة بـ v4 تحقّق من وجود سكربت gcaptcha4 في الصفحة لتأكيد أنها v4
رفض الحل غياب المعامل version=4 حدِّد دائماً version: "4" مع تحديات الإصدار الرابع
عدم العثور على captcha_id الصفحة تُبنى عبر JavaScript استخدم Selenium لاستخراج القيمة من الصفحة بعد تحميلها
خطأ في تنسيق الرمز تحليل الاستجابة كسلسلة نصية بدل JSON حلّل الاستجابة كـ JSON للحصول على كل رمز على حدة

أسئلة شائعة

متى يتوفّر دعم GeeTest v4 رسمياً في CaptchaAI؟

دعم GeeTest v4 قادم قريباً ولم يُعلَن عن تاريخ نهائي بعد. حتى ذلك الحين، استخدم GeeTest v3 الذي يحله CaptchaAI اليوم بمعدل نجاح مرتفع، وتابع صفحة الأنواع المدعومة لمعرفة أي تحديث على الحالة.

هل يعمل سكربت GeeTest v3 القديم مع مواقع انتقلت إلى v4؟

لا. يعتمد سكربت v3 على معاملَي gt وchallenge، بينما لا يوفّرهما الإصدار الرابع أصلاً؛ فهو يبدأ بـ captcha_id ويعيد رموز تحقق مختلفة. ستحتاج إلى اكتشاف الإصدار أولاً ثم اتباع المسار المناسب لكل حالة.

ما دور lot_number وpass_token في تحقق v4؟

يحلّ هذان الرمزان محلّ معامل challenge القديم. يُرسَل lot_number كمعرّف للجلسة، بينما يُستخدم pass_token مع gen_time وcaptcha_output لإثبات اجتياز التحدي عند إرسال النموذج إلى الخادم.

هل يتطلب حلّ تحديات GeeTest وكيلاً سكنياً؟

ليس شرطاً، لكن استخدام وكيل سكني ذي سمعة عنوان IP جيدة يقلّل من احتكاك التقييم التكيّفي في v4 ويحسّن استقرار النتائج، خاصةً مع الطلبات عالية الحجم الصادرة من نطاق جغرافي واحد.


أدلة ذات صلة


حلّ GeeTest v3 اليوم — ابدأ مع CaptchaAI. دعم GeeTest v4 قادم قريباً.

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