Tutorial API

Parameter GeeTest Slide CAPTCHA dan Panduan API

Kuasai setiap parameter dalam pengiriman GeeTest CAPTCHA. Pelajari cara mengekstrak gt, challenge, dan nilai lainnya, lalu mengirimkannya dengan benar ke CaptchaAI.


Parameter GeeTest v3

Parameter Diperlukan Deskripsi
gt Ya ID akun GeeTest (32 karakter hex). Ditemukan di sumber halaman atau respons API
challenge Ya String challenge khusus sesi. Harus fresh untuk setiap solve
pageurl Ya URL lengkap halaman yang menampilkan CAPTCHA
api_server Tidak Subdomain server API GeeTest kustom

Mengekstrak Parameter dari Halaman

# 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://staging.example.com/qa-login")
print(f"gt: {params['gt']}")
print(f"challenge: {params['challenge']}")

Mengirimkan GeeTest ke 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")

Menggunakan Solusi

Solusi mengembalikan tiga nilai yang harus dikirim ke endpoint validasi situs target:

# 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

Kesegaran Challenge

Parameter challenge bersifat unik per sesi dan cepat kadaluarsa:

# 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

Aturan utama: Ekstrak challenge dan kirimkan ke CaptchaAI dalam hitungan detik. Challenge yang basi akan selalu gagal.


Custom API Server

Beberapa situs menggunakan subdomain GeeTest khusus:

# 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://staging.example.com/qa-login",
    api_server="api-na.geetest.com",  # North America endpoint
)

Pemecahan Masalah

Masalah Penyebab Perbaikan
ERROR_CAPTCHA_UNSOLVABLE Challenge basi Ambil challenge baru segera sebelum submit
validate kosong Versi API salah Gunakan version=4 untuk situs GeeTest v4
Solusi ditolak situs seccode tidak ada Pastikan ketiga field dikirimkan
Parameter gt tidak ditemukan Dimuat via JavaScript Gunakan Selenium atau periksa respons XHR untuk endpoint register

Pertanyaan Umum

Apa perbedaan antara gt dan challenge?

gt adalah ID akun GeeTest situs — tetap sama. challenge dibuat per sesi dan harus diekstrak baru setiap kali.

Berapa lama challenge valid?

Biasanya 60–120 detik. Ekstrak dan segera kirim ke CaptchaAI.

Apa fungsi api_server?

Ini memberi tahu CaptchaAI server API GeeTest mana yang digunakan. Hanya diperlukan jika situs menggunakan endpoint GeeTest non-default. Periksa request jaringan halaman untuk api-*.geetest.com.


Panduan Terkait

  • GeeTest v4: Perubahan dan Panduan Solve

Kuasai parameter GeeTest — mulai dengan CaptchaAI.

Komentar dinonaktifkan untuk artikel ini.