Hướng Dẫn API

Hướng dẫn API và thông số CAPTCHA của GeeTest Slide

Nắm vững mọi thông số trong bài gửi GeeTest CAPTCHA. Tìm hiểu cách trích xuất gt, challenge và các giá trị khác, đồng thời gửi chúng một cách chính xác đến CaptchaAI.


Thông số GeeTest v3

tham số Bắt buộc Mô tả
gt ID tài khoản GeeTest (hex 32 ký tự). Tìm thấy trong nguồn trang hoặc phản hồi API
challenge Chuỗi thử thách dành riêng cho phiên. Phải mới cho mỗi lần giải
pageurl URL đầy đủ của trang hiển thị CAPTCHA
api_server Không Tên miền phụ máy chủ API GeeTest tùy chỉnh

Trích xuất tham số từ một trang

# 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']}")

Gửi GeeTest tới 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")

Sử dụng giải pháp

Giải pháp trả về ba giá trị phải được gửi đến điểm cuối xác thực của trang đích:

# 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

Thử thách sự tươi mới

Tham số challenge dành riêng cho phiên và hết hạn nhanh chóng:

# 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

Quy tắc chính: Trích xuất thử thách và gửi tới CaptchaAI trong vòng vài giây. Một thử thách cũ sẽ luôn thất bại.


Máy chủ API tùy chỉnh

Một số trang web sử dụng tên miền phụ GeeTest tùy chỉnh:

# 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
)

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
ERROR_CAPTCHA_UNSOLVABLE Thử thách cũ Tìm nạp thử thách mới ngay trước khi gửi
validate trống Phiên bản API sai Sử dụng version=4 cho các trang GeeTest v4
Giải pháp bị từ chối bởi trang web Thiếu seccode Đảm bảo cả ba trường đều được gửi
Không tìm thấy tham số gt Được tải qua JavaScript Sử dụng Selenium hoặc kiểm tra phản hồi XHR cho điểm cuối đăng ký

Câu hỏi thường gặp

Sự khác biệt giữa gtchallenge là gì?

gt là ID tài khoản GeeTest của trang web - nó vẫn giữ nguyên. challenge được tạo mỗi phiên và phải được trích xuất mới mỗi lần.

Thử thách có hiệu lực trong bao lâu?

Thông thường là 60-120 giây. Giải nén nó và gửi tới CaptchaAI ngay lập tức.

api_server làm gì?

Nó cho CaptchaAI biết nên sử dụng máy chủ API GeeTest nào. Chỉ bắt buộc khi trang web sử dụng điểm cuối GeeTest không mặc định. Kiểm tra các yêu cầu mạng của trang để tìm api-*.geetest.com.


Hướng dẫn liên quan


Làm chủ các thông số GeeTest —bắt đầu với CaptchaAI.

Os comentários estão desativados para este artigo.