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

سير عمل GeeTest v3 للتحدي والاستجابة: الغوص التقني العميق

يستخدم GeeTest v3 بروتوكول الاستجابة للتحدي متعدد الخطوات. على عكس reCAPTCHA حيث يحل رمز مميز واحد كل شيء، يتضمن GeeTest خطوة تسجيل وتبادل رمز التحدي والتحقق النهائي - كل منها ينتج معلمات مختلفة. يعد فهم هذا التدفق أمرًا ضروريًا للتكامل الصحيح مع CaptchaAI.

بروتوكول المرحلتين

يعمل GeeTest v3 على مرحلتين:

المرحلة 1: التسجيل (من جانب الخادم)

تتصل الواجهة الخلفية للموقع بـ GeeTest لتسجيل تحدي جديد:

Site Backend → GeeTest Server: "Give me a challenge for this user"
GeeTest Server → Site Backend: { gt, challenge, new_captcha }
Site Backend → Browser: Passes gt and challenge to the page

المرحلة الثانية: التحقق (جانب العميل + جانب الخادم)

يقوم المتصفح بعرض التحدي، ويقوم المستخدم بحله، ويتم التحقق من النتيجة:

Browser: Renders slider/puzzle using gt + challenge
User: Solves the challenge
Browser → Site Backend: { geetest_challenge, geetest_validate, geetest_seccode }
Site Backend → GeeTest Server: Verifies the three values
GeeTest Server → Site Backend: { result: "success" }

التدفق التفصيلي

الخطوة 1: تسجيل استدعاء API

تستدعي الواجهة الخلفية للموقع نقطة نهاية تسجيل GeeTest:

GET https://api.geetest.com/register.php?gt=GT_ID&json_format=1

الرد:

{
  "success": 1,
  "gt": "81dc9bdb52d04dc20036dbd8313ed055",
  "challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  "new_captcha": true
}
المعلمة معنى
gt معرف GeeTest - يحدد حساب GeeTest الخاص بالموقع
challenge رمز التحدي الفريد لهذه الجلسة
new_captcha ما إذا كان سيتم استخدام تنسيق CAPTCHA الجديد

هام: قيمة challenge مخصصة للاستخدام مرة واحدة ومحدودة بالوقت. يولد كل تحميل للصفحة تحديًا جديدًا.

الخطوة 2: تقديم التحدي

يستقبل المتصفح gt وchallenge ويقوم بتهيئة عنصر واجهة المستخدم GeeTest:

initGeetest({
  gt: "81dc9bdb52d04dc20036dbd8313ed055",
  challenge: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  offline: false,
  new_captcha: true,
  product: "float"
}, function(captchaObj) {
  captchaObj.appendTo('#captcha-container');
  captchaObj.onSuccess(function() {
    var result = captchaObj.getValidate();
    // result contains: geetest_challenge, geetest_validate, geetest_seccode
  });
});

الخطوة 3: أنواع التحدي

يدعم GeeTest v3 العديد من أنواع التحدي:

النوع إجراء المستخدم الوصف
المنزلق اسحب قطعة اللغز حرك قطعة اللغز لإكمال الصورة
** انقر على أيقونة ** انقر على الأيقونات بالترتيب انقر فوق أيقونات محددة في التسلسل الموضح
كلمة النقر انقر فوق الأحرف انقر فوق الأحرف الصينية بالترتيب الصحيح
الفضاء انقر فوق/select تحدي التفكير المكاني

يتم تحديد نوع التحدي بواسطة GeeTest بناءً على تكوين الموقع وملف تعريف مخاطر المستخدم.

الخطوة 4: قيم الحل

بعد الحل، تنتج القطعة ثلاث قيم:

{
  "geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
  "geetest_validate": "abc123def456_validate",
  "geetest_seccode": "abc123def456_validate|jordan"
}
القيمة الوصف
geetest_challenge رمز التحدي المعدل (الأصلي + حرفين إضافيين)
geetest_validate تجزئة التحقق من الصحة
geetest_seccode رمز الحماية (التحقق + `\

الخطوة 5: التحقق من جانب الخادم

ترسل الواجهة الخلفية للموقع هذه القيم الثلاث إلى GeeTest للتحقق منها:

POST https://api.geetest.com/validate.php

seccode=abc123def456_validate|jordan
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy
&sdk=geetest-python-3.0.0

يستجيب GeeTest بـ:

{
  "seccode": "abc123def456_validate",
  "validate": "abc123def456_validate"
}

استخراج معلمات CaptchaAI

لحل المشكلة باستخدام CaptchaAI، تحتاج إلى gt وchallenge من الصفحة:

الأسلوب 1: اعتراض استجابة التسجيل

from playwright.sync_api import sync_playwright
import json

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()

    geetest_params = {}

    def handle_response(response):
        if "register" in response.url and "geetest" in response.url:
            data = response.json()
            geetest_params["gt"] = data.get("gt")
            geetest_params["challenge"] = data.get("challenge")

    page.on("response", handle_response)
    page.goto("https://example.com/login")

    # Wait for GeeTest to load
    page.wait_for_selector(".geetest_holder")
    print(f"gt: {geetest_params.get('gt')}")
    print(f"challenge: {geetest_params.get('challenge')}")

الطريقة الثانية: الاستخراج من صفحة JavaScript

gt = page.evaluate("() => document.querySelector('[data-gt]')?.dataset.gt")
challenge = page.evaluate("() => document.querySelector('[data-challenge]')?.dataset.challenge")

الطريقة الثالثة: من مكالمة initGeetest

ابحث في مصدر الصفحة عن استدعاء initGeetest:

import re
source = page.content()
gt_match = re.search(r"gt['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)
challenge_match = re.search(r"challenge['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)

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

إرسال المعلمات المستخرجة:

POST https://ocr.captchaai.com/in.php

key=YOUR_API_KEY
&method=geetest
&gt=81dc9bdb52d04dc20036dbd8313ed055
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
&pageurl=https://example.com/login
&json=1

استطلاع للنتيجة:

GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1

إرجاع CaptchaAI:

{
  "status": 1,
  "request": {
    "geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
    "geetest_validate": "abc123def456_validate",
    "geetest_seccode": "abc123def456_validate|jordan"
  }
}

ستتلقى القيم الثلاث المطلوبة لخطوة التحقق من الموقع.

وضع عدم الاتصال مقابل الوضع عبر الإنترنت

يحتوي GeeTest v3 على وضع احتياطي عندما لا يمكن الوصول إلى خوادم GeeTest:

الوضع قيمة success السلوك
أون لاين 1 الاستجابة للتحدي العادي مع خوادم GeeTest
** غير متصل ** 0 التحقق المحلي المبسط

في وضع عدم الاتصال، يتم إنشاء التحدي محليًا ويكون التحقق أسهل. تستخدم معظم المواقع الوضع عبر الإنترنت.

استكشاف الأخطاء وإصلاحها

المشكلة السبب الإجراء
النتيجة لا تطابق الحالة الفعلية نوع CAPTCHA أو المعلمات لم تُطابَق مع الهدف الصحيح قارن الهدف وطريقة الحل والمعلمات المطلوبة مرة أخرى
الاختبار ينجح لكن بيئة الإنتاج تفشل الجلسة أو الرؤوس أو سياق الوكيل يختلف عن الاختبار أعد استخدام الشروط التي نجحت في الاختبار داخل سير العمل الفعلي كلما أمكن
المشكلة ما تزال غير واضحة السجلات لا تتضمن سياقًا كافيًا لتشخيص موثوق سجّل نوع الحل وزمن الاستجابة ورمز الخطأ والأثر اللاحق معًا

الخطوات التالية

أدلة ذات صلة

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