在国内站点上遇到滑块或图标点选验证码,多半来自极验(GeeTest)。先说结论:CaptchaAI 目前识别 GeeTest v3;GeeTest 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.com 或 gt4.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_number、pass_token、gen_time、captcha_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.com 或 gt4.js 通常是 v4;看到 api.geetest.com 和 challenge 参数则是 v3。
国内站点常见的极验滑块,CaptchaAI 能处理吗?
站点若用 GeeTest v3,可直接用 geetest 方法识别;极验 v4 属于即将支持。注意 CaptchaAI 不支持易盾、防水墙、阿里云验证码等其他国产验证码。
v4 支持上线前,现有的 v3 集成需要改动吗?
不需要。v3 与 v4 的参数和验证字段完全不同(见上表),两套集成相互独立。
相关指南
想深入 v3 的参数细节,可参考极验滑块参数提取指南;想横向对比不同验证码,可看 GeeTest 与 Cloudflare Turnstile 对比。
今天就用 CaptchaAI 识别 GeeTest v3,v4 支持即将到来 —免费开始。