دروس API

معلمات GeeTest Slide CAPTCHA ودليل واجهة برمجة التطبيقات

أتقن كل معلمة في عمليات إرسال GeeTest CAPTCHA. تعرف على كيفية استخراج gt وchallenge والقيم الأخرى وإرسالها بشكل صحيح إلى CaptchaAI.


معلمات GeeTest v3

المعلمة مطلوب الوصف
gt نعم معرف حساب GeeTest (سداسي عشري مكون من 32 حرفًا). تم العثور عليه في مصدر الصفحة أو استجابة واجهة برمجة التطبيقات
challenge نعم سلسلة التحدي الخاصة بالجلسة. يجب أن تكون طازجة لكل حل
pageurl نعم عنوان URL الكامل للصفحة التي تعرض اختبار CAPTCHA
api_server لا النطاق الفرعي لخادم GeeTest API المخصص

استخراج المعلمات من الصفحة

# extract_geetest_params.py
import requests
import re
import json


def extract_geetest_v3(page_url, session=None):
    """Extract GeeTest v3 gt and challenge from a page."""
    if session is None:
        session = requests.Session()
        session.headers["User-Agent"] = (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36"
        )

    resp = session.get(page_url, timeout=15)
    html = resp.text

    # Method 1: Extract gt from HTML
    gt_match = re.search(r'gt["\']?\s*[:=]\s*["\']([a-f0-9]{32})', html)
    gt = gt_match.group(1) if gt_match else None

    # Method 2: Find API endpoint that returns challenge
    api_match = re.search(r'(https?://[^"\']+register-slide[^"\']*)', html)

    challenge = None
    if api_match:
        api_url = api_match.group(1)
        api_resp = session.get(api_url, timeout=10)
        try:
            data = api_resp.json()
            challenge = data.get("challenge")
            gt = gt or data.get("gt")
        except json.JSONDecodeError:
            pass

    if not challenge:
        # Try embedded challenge
        ch_match = re.search(r'challenge["\']?\s*[:=]\s*["\']([a-f0-9]+)', html)
        challenge = ch_match.group(1) if ch_match else None

    return {"gt": gt, "challenge": challenge, "pageurl": page_url}


# Usage
params = extract_geetest_v3("https://example.com/login")
print(f"gt: {params['gt']}")
print(f"challenge: {params['challenge']}")

إرسال GeeTest إلى CaptchaAI

# solve_geetest.py
import requests
import time
import os


def solve_geetest(gt, challenge, pageurl, api_server=None):
    """Solve GeeTest v3 slide CAPTCHA via CaptchaAI."""
    api_key = os.environ["CAPTCHAAI_API_KEY"]

    payload = {
        "key": api_key,
        "method": "geetest",
        "gt": gt,
        "challenge": challenge,
        "pageurl": pageurl,
        "json": 1,
    }

    if api_server:
        payload["api_server"] = api_server

    # Submit
    resp = requests.post(
        "https://ocr.captchaai.com/in.php",
        data=payload,
        timeout=30,
    )
    result = resp.json()

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

    task_id = result["request"]

    # Poll — GeeTest typically solves in 10-20 seconds
    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"]  # Returns challenge, validate, seccode
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("GeeTest solve timeout")

استخدام الحل

يقوم الحل بإرجاع ثلاث قيم يجب إرسالها إلى نقطة نهاية التحقق من صحة الموقع المستهدف:

# submit_solution.py
import json


def submit_geetest_solution(session, validation_url, solution, original_challenge):
    """Submit GeeTest solution to the target site."""
    # Parse solution if string
    if isinstance(solution, str):
        solution = json.loads(solution)

    payload = {
        "geetest_challenge": solution.get("challenge", original_challenge),
        "geetest_validate": solution.get("validate", ""),
        "geetest_seccode": solution.get("seccode", ""),
    }

    resp = session.post(validation_url, data=payload, timeout=30)
    return resp


# Complete flow
def full_geetest_flow(page_url, validation_url):
    import requests
    from extract_geetest_params import extract_geetest_v3

    session = requests.Session()
    session.headers["User-Agent"] = (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36"
    )

    # Step 1: Extract parameters
    params = extract_geetest_v3(page_url, session)
    print(f"gt: {params['gt']}, challenge: {params['challenge'][:16]}...")

    # Step 2: Solve
    solution = solve_geetest(
        params["gt"], params["challenge"], params["pageurl"],
    )
    print("Solved!")

    # Step 3: Submit
    resp = submit_geetest_solution(
        session, validation_url, solution, params["challenge"],
    )
    print(f"Validation response: {resp.status_code}")
    return resp

نضارة التحدي

المعلمة challenge خاصة بالجلسة وتنتهي بسرعة:

# fresh_challenge.py
import time


def get_fresh_challenge(session, register_url):
    """Always fetch a fresh challenge before solving."""
    resp = session.get(register_url, timeout=10)
    data = resp.json()

    challenge = data.get("challenge")
    if not challenge:
        raise ValueError("No challenge returned")

    return challenge


def solve_with_fresh_challenge(session, gt, register_url, pageurl):
    """Ensure challenge is fresh before submitting to CaptchaAI."""
    challenge = get_fresh_challenge(session, register_url)

    # Submit immediately — don't let it expire
    solution = solve_geetest(gt, challenge, pageurl)
    return solution

القاعدة الأساسية: استخرج التحدي وأرسله إلى CaptchaAI خلال ثوانٍ. التحدي الذي لا معنى له سوف يفشل دائمًا.


خادم API المخصص

تستخدم بعض المواقع نطاقًا فرعيًا مخصصًا لـ GeeTest:

# The api_server parameter specifies a custom GeeTest backend
# Default: api.geetest.com
# Custom examples: api-na.geetest.com, api.geetest.com/ajax-custom

solution = solve_geetest(
    gt="abc123...",
    challenge="def456...",
    pageurl="https://example.com/login",
    api_server="api-na.geetest.com",  # North America endpoint
)

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

المشكلة السبب الإجراء
ERROR_CAPTCHA_UNSOLVABLE التحدي الذي لا معنى له جلب التحدي الجديد مباشرة قبل الإرسال
validate فارغ إصدار API خاطئ استخدم version=4 لمواقع GeeTest v4
الحل مرفوض من قبل الموقع seccode مفقود تأكد من إرسال كافة الحقول الثلاثة
لم يتم العثور على المعلمة gt تم التحميل عبر JavaScript استخدم السيلينيوم أو تحقق من استجابات XHR لنقطة نهاية التسجيل

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

ما الفرق بين gt وchallenge؟

gt هو معرف حساب GeeTest الخاص بالموقع - ويظل كما هو. يتم إنشاء challenge في كل جلسة ويجب استخراجه جديدًا في كل مرة.

ما هي مدة صلاحية التحدي؟

عادة 60-120 ثانية. قم باستخراجه وإرساله إلى CaptchaAI على الفور.

ماذا يفعل api_server؟

إنه يخبر CaptchaAI بخادم GeeTest API الذي يجب استخدامه. مطلوب فقط عندما يستخدم الموقع نقطة نهاية GeeTest غير افتراضية. تحقق من طلبات الشبكة الخاصة بالصفحة لـ api-*.geetest.com.


أدلة ذات صلة


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