يستخدم 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
>=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 أو المعلمات لم تُطابَق مع الهدف الصحيح | قارن الهدف وطريقة الحل والمعلمات المطلوبة مرة أخرى |
| الاختبار ينجح لكن بيئة الإنتاج تفشل | الجلسة أو الرؤوس أو سياق الوكيل يختلف عن الاختبار | أعد استخدام الشروط التي نجحت في الاختبار داخل سير العمل الفعلي كلما أمكن |
| المشكلة ما تزال غير واضحة | السجلات لا تتضمن سياقًا كافيًا لتشخيص موثوق | سجّل نوع الحل وزمن الاستجابة ورمز الخطأ والأثر اللاحق معًا |
الخطوات التالية
- البدء السريع مع CaptchaAI: حلّ أول كابتشا في 5 دقائق
- كيفية حلّ reCAPTCHA v2 عبر الـ API: دليل خطوة بخطوة
- كيفية حل Cloudflare Turnstile باستخدام واجهة API
- كيفية حل GeeTest v3 باستخدام API