深度解析

GeeTest v4 验证码变更及解决指南

与 v3 相比,GeeTest v4 在架构、挑战类型和集成模式方面带来了重大变化。本指南解释了发生的变化以及如何解决 v4 挑战。


GeeTest v3 与 v4 — 主要区别

特征 GeeTest v3 GeeTest v4
初始化 来自服务器的 gt + challenge 仅限 captcha_id
挑战参数 API 调用需要 生成的客户端
挑战类型 滑动、点击 滑动、点击、图标选择、空间推理
验证 服务器返回challenge 使用 lot_number + pass_token
API端点 api.geetest.com gcaptcha4.geetest.com
扩展难度 固定的 自适应风险评分

提取GeeTest v4参数

# extract_geetest_v4.py
import re
from selenium import webdriver


def extract_geetest_v4_params(url):
    """Extract GeeTest v4 captcha_id from a page."""
    driver = webdriver.Chrome()
    driver.get(url)

    page_source = driver.page_source

    # GeeTest v4 uses captcha_id instead of gt
    match = re.search(r'captcha_id["\']?\s*[:=]\s*["\']([a-f0-9]+)', page_source)
    captcha_id = match.group(1) if match else None

    # Check for v4-specific script
    is_v4 = "gcaptcha4" in page_source or "gt4.js" in page_source

    driver.quit()

    return {
        "captcha_id": captcha_id,
        "is_v4": is_v4,
        "pageurl": url,
    }


# Usage
params = extract_geetest_v4_params("https://staging.example.com/qa-login")
print(f"Captcha ID: {params['captcha_id']}")
print(f"Is v4: {params['is_v4']}")

用 CaptchaAI 解决 GeeTest v4

# solve_geetest_v4.py
import requests
import time
import os


def solve_geetest_v4(captcha_id, pageurl):
    """Submit GeeTest v4 to CaptchaAI and get solution."""
    api_key = os.environ["CAPTCHAAI_API_KEY"]

    # Submit task
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "geetest",
        "gt": captcha_id,      # captcha_id maps to the gt parameter
        "pageurl": pageurl,
        "version": "4",        # Specify v4 explicitly
        "json": 1,
    }, timeout=30)

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

    task_id = result["request"]

    # Poll for result
    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"]  # Contains validation tokens
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("GeeTest v4 solve timeout")


# Usage
solution = solve_geetest_v4(
    captcha_id="abc123def456",
    pageurl="https://staging.example.com/qa-login",
)
print(f"Solution: {solution}")

注入GeeTest v4解决方案

# inject_geetest_v4.py
import json
from selenium import webdriver
from selenium.webdriver.common.by import By


def inject_geetest_v4_solution(driver, solution):
    """Inject GeeTest v4 solution tokens into the page."""
    # Parse solution — v4 returns different tokens than v3
    if isinstance(solution, str):
        try:
            solution = json.loads(solution)
        except json.JSONDecodeError:
            pass

    # GeeTest v4 validation uses lot_number, pass_token, gen_time, captcha_output
    driver.execute_script("""
        var solution = arguments[0];

        // Set hidden form fields
        var fields = {
            'lot_number': solution.lot_number,
            'pass_token': solution.pass_token,
            'gen_time': solution.gen_time,
            'captcha_output': solution.captcha_output,
        };

        for (var name in fields) {
            var input = document.querySelector('input[name="' + name + '"]');
            if (!input) {
                input = document.createElement('input');
                input.type = 'hidden';
                input.name = name;
                document.forms[0].appendChild(input);
            }
            input.value = fields[name];
        }

        // Trigger validation callback if available
        if (window.captchaObj && typeof window.captchaObj.appendTo === 'function') {
            window.captchaObj.appendTo('#captcha-container');
        }
    """, solution)

v4 挑战类型

幻灯片拼图

经典的滑动匹配挑战。用户拖动一块拼图。

单击选择

用户单击特定对象(例如,“单击所有面”)。使用图标识别。

空间推理

v4 中的新增功能 — 用户以空间模式排列形状。比 v3 更复杂。

图标匹配

用户匹配序列中显示的图标。手动自动化更难。

CaptchaAI 处理所有 v4 挑战类型 — API 抽象了特定于挑战的逻辑。


故障排除

问题 原因 处理方式
ERROR_WRONG_CAPTCHA_ID 使用 v3 gt 值代替 v4 captcha_id 检查 gcaptcha4 脚本页面以确认 v4
解决方案被拒绝 缺少 version=4 参数 始终为 v4 指定 version: "4"
captcha_id 未找到 JavaScript 渲染 使用 Selenium 从渲染页面中提取
令牌格式错误 解析字符串而不是 JSON 将解决方案解析为 JSON 以获取单个令牌

常问问题

我如何知道网站是否使用 GeeTest v3 还是 v4?

在 v4 的页面源代码中查找 gcaptcha4.geetest.comgt4.js。如果您看到 api.geetest.comchallenge 参数,则它是 v3。

GeeTest v4 比 v3 更难解决吗?

对于自动求解器来说,没有。 CaptchaAI 处理这两个版本。 V4 的自适应难度会影响最终用户的摩擦,但不会影响基于 API 的解决方案。

GeeTest v4的成功率是多少?

CaptchaAI 报告 GeeTest 挑战的成功率为 100%,在 v3 和 v4 中保持一致。


相关指南


解决 GeeTest v4 挑战 —以 CaptchaAI 开头.

该文章已禁用评论。