在国内站点上遇到滑块或图标点选验证码,多半来自极验(GeeTest)。先说结论:CaptchaAI 识别 GeeTest v3,不识别 GeeTest v4。下面梳理二者区别,以及 CaptchaAI 的适用范围。
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 更复杂 |
| 图标匹配 | 按序列匹配指定图标,脚本很难稳定复现 |
页面无论显示其中哪一种,都是 GeeTest v4,CaptchaAI 无法识别。CaptchaAI 识别的是 GeeTest v3。
CaptchaAI 的适用范围
CaptchaAI 识别 GeeTest v3。它不识别 GeeTest v4。其 geetest 方法接收 v3 的参数(gt、新获取的 challenge 和 pageurl),返回 challenge、validate 和 seccode。该方法没有 v4 参数,所以不要把 v4 的 captcha_id 当作 gt 提交。先做上文的检测:如果页面加载了 gcaptcha4.geetest.com 或 gt4.js,说明运行的是 v4,CaptchaAI 无法识别。如果页面仍是 v3,完整流程见如何使用 API 解决 GeeTest v3 问题。
v4 的验证方式有何不同
在 v3 页面上,验证通过后得到三个值:geetest_challenge、geetest_validate 和 geetest_seccode,由网站后端向 GeeTest 校验。在 v4 页面上,captchaObj.getValidate() 返回的则是四个值:lot_number、captcha_output、pass_token 和 gen_time。网站后端把它们连同自己的 captcha_id 和用私钥签名的 sign_token,发送到 gcaptcha4.geetest.com 上 v4 的 /validate 接口(见 GeeTest v4 的 Web API 与 服务端 API 文档)。读取或填写 v3 三个字段的代码,在 v4 页面上无从下手。
常见错误与排查
| 问题 | 可能原因 | 处理方式 |
|---|---|---|
在原本正常的页面上找不到 gt / challenge |
网站已改用 GeeTest v4,没有服务器下发的 challenge |
检查页面是否加载 gcaptcha4.geetest.com 或 gt4.js;CaptchaAI 只识别 GeeTest v3 |
CaptchaAI 返回 ERROR_WRONG_CAPTCHA_ID |
gt 或 challenge 无效,例如把 v4 的 captcha_id 当作 gt 提交 |
每次请求都提交页面的 v3 gt 和新获取的 challenge |
找不到 captcha_id |
参数由 JavaScript 动态渲染 | 用 Selenium 从渲染后的页面提取 |
常见问题
围绕 v3、v4 的识别与区别,下面是开发者最常问到的几个问题。
CaptchaAI 能识别 GeeTest v4 吗?
不能。CaptchaAI 识别 GeeTest v3,成功率高。它不识别 GeeTest v4,因此也没有 v4 的成功率可以提供。
怎么快速判断页面用的是 GeeTest v3 还是 v4?
看源码:出现 gcaptcha4.geetest.com 或 gt4.js 通常是 v4;看到 api.geetest.com 和 challenge 参数则是 v3。
国内站点常见的极验滑块,CaptchaAI 能处理吗?
站点若用 GeeTest v3,可直接用 geetest 方法识别;CaptchaAI 不识别极验 v4。注意 CaptchaAI 不支持易盾、防水墙、阿里云验证码等其他国产验证码。
现有的 v3 集成需要改动吗?
v3 页面不需要。v3 与 v4 的参数和验证字段完全不同(见上表):v4 没有服务器下发的 challenge,验证通过后返回四个值而不是三个,所以 v3 集成不能直接用于 v4 页面。CaptchaAI 识别 GeeTest v3,不识别 GeeTest v4。
相关指南
想深入 v3 的参数细节,可参考极验滑块参数提取指南;想横向对比不同验证码,可看 GeeTest 与 Cloudflare Turnstile 对比。
用 CaptchaAI 识别 GeeTest v3 —免费开始。CaptchaAI 不识别 GeeTest v4。