Explainers

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

在国内站点上遇到滑块或图标点选验证码,多半来自极验(GeeTest)。先说结论:CaptchaAI 目前识别 GeeTest v3GeeTest v4 官方标注为“即将支持”,尚未上线。下面梳理二者区别与准备思路。


GeeTest v3 与 v4 的核心区别

v4 是一次结构性重写:初始化、验证字段、API 端点都变了,v3 的逻辑无法直接套用。

对比项 GeeTest v3 GeeTest v4
初始化参数 服务器下发 gt + challenge 仅需 captcha_id
挑战参数来源 由 API 调用返回 客户端生成
挑战类型 滑动、点选 滑动、点选、图标识别、空间推理
验证方式 服务器返回 challenge 使用 lot_number + pass_token
API 端点 api.geetest.com gcaptcha4.geetest.com
难度调节 固定 自适应风险评分

如何检测并提取 GeeTest v4 参数

判断版本看脚本即可:v4 会引用 gcaptcha4.geetest.comgt4.js 并带上 captcha_id。这类内容由 JavaScript 渲染,建议用 Selenium 取 page_source 再匹配。

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

GeeTest v4 的四种挑战类型

v4 把结果更多交给行为与风险评分判断,挑战形式也比 v3 更多样:

挑战类型 说明
滑块拼图 拖动拼图到缺口,v4 加了更细的轨迹判定
点选识别 按提示点选特定对象(如“点击所有人脸”),依赖图像识别
空间推理 v4 新增:按空间规律排列形状,比 v3 更复杂
图标匹配 按序列匹配指定图标,脚本很难稳定复现

v4 支持上线后,CaptchaAI API 会屏蔽这些差异;在此之前请使用已支持的 GeeTest v3


GeeTest v4 识别现状:即将支持

再次强调:GeeTest v4 尚未可用,仍是“即将支持”。CaptchaAI 现在识别 GeeTest v3。下面是 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}")

流程与 v3 一致:提交后拿到 task_id,每 5 秒轮询 res.php,区别只是带上 version: "4"


将 v4 解决方案写入页面表单

识别结果需写回你自己 QA 页面的隐藏表单字段并触发校验回调。v4 返回 lot_numberpass_tokengen_timecaptcha_output 等值,解析时先按 JSON 处理即可取到各字段。

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

常见错误与排查

问题 可能原因 处理方式
ERROR_WRONG_CAPTCHA_ID 把 v3 的 gt 值当成了 v4 的 captcha_id 检查页面是否加载 gcaptcha4 脚本以确认是 v4
结果被拒绝 缺少 version=4 参数 提交 v4 时始终带上 version: "4"
找不到 captcha_id 参数由 JavaScript 动态渲染 用 Selenium 从渲染后的页面提取
token 格式报错 把整段结果当字符串解析 先按 JSON 解析,再取各个字段

常见问题

围绕 v3、v4 的识别与区别,下面是开发者最常问到的几个问题。

CaptchaAI 现在能识别 GeeTest v4 吗?

暂时不能。GeeTest v4 官方标注为“即将支持”,尚未上线;现在 CaptchaAI 识别的是 GeeTest v3。

怎么快速判断页面用的是 GeeTest v3 还是 v4?

看源码:出现 gcaptcha4.geetest.comgt4.js 通常是 v4;看到 api.geetest.comchallenge 参数则是 v3。

国内站点常见的极验滑块,CaptchaAI 能处理吗?

站点若用 GeeTest v3,可直接用 geetest 方法识别;极验 v4 属于即将支持。注意 CaptchaAI 不支持易盾、防水墙、阿里云验证码等其他国产验证码。

v4 支持上线前,现有的 v3 集成需要改动吗?

不需要。v3 与 v4 的参数和验证字段完全不同(见上表),两套集成相互独立。


相关指南

想深入 v3 的参数细节,可参考极验滑块参数提取指南;想横向对比不同验证码,可看 GeeTest 与 Cloudflare Turnstile 对比


今天就用 CaptchaAI 识别 GeeTest v3,v4 支持即将到来 —免费开始

该文章已禁用评论。