极验 GeeTest v4
极验 GeeTest v4 是 GeeTest 的无感打分 / 滑块拼图 / 点选图像 / 点选文字(v4 按风险自适应下发,同一个 captchaId 可能出不同题)。页面上先出现一条「点击按钮进行验证」的横条或浮层按钮;低风险用户点一下直接打勾放行,高风险才升级成滑动拼图、按提示顺序点击图标/文字,甚至五子棋这类推理题。弹窗右下角带极验 logo 与刷新、关闭按钮。
接口规格
| 项目 | 值 |
|---|---|
| type | geetest |
| 必填参数 | website_urlwebsite_key |
| 可选参数 | 无 |
| 返回 | 一组字段(要一起提交)(solution.captcha_idsolution.lot_numbersolution.pass_tokensolution.gen_timesolution.captcha_output) |
| 怎么用这个解 | 把这五个字段一起提交回目标站 |
| 价格 | $2.08 / 1K 次 —— 按成功计费,没解出来退款 |
| 厂商文档 | GeeTest 官方文档 |
参数去页面哪里取
下面全部是可以直接照做的定位方法 —— DOM 属性名、JS 全局变量名、script 上的 query 参数。
第一步先判 v3 还是 v4,判错了参数完全对不上。
看 <script> 的 src:v4 是 https://static.geetest.com/v4/gt4.js(实测极验官网 demo 页就是这一条),全局函数是 initGeetest4;v3 是 https://static.geetest.com/static/js/gt.0.5.0.js,全局函数是 initGeetest(不带 4)。在 Console 里敲 typeof initGeetest4 返回 "function" 就是 v4。
取 captcha_id(填进我们的 `website_key`),三个办法,按可靠度排序:
① 最可靠——看网络请求。 打开 DevTools Network,刷新页面,过滤 gcaptcha4,会看到组件自己发的第一个请求:https://gcaptcha4.geetest.com/load?captcha_id=<32位小写十六进制>&challenge=<uuid>&client_type=web&callback=geetest_<13位毫秒时间戳>
query 里的 captcha_id 就是要填的值。这一步不会被前端改名或混淆绕过,因为它是组件发出去的。
② 看 JS 配置。 全文搜 initGeetest4(,第一个参数对象里的 captchaId 键。⚠ 注意大小写换形:前端配置叫驼峰 captchaId,网络请求和服务端校验叫下划线 captcha_id,是同一个值,不要以为是两个参数。
③ 小程序页面上是自定义组件属性:<captcha4 id="captcha" captchaId="{{captchaId}}" bindSuccess="..." />。
⚠ 不要去 DOM 上找 `data-sitekey` 这类属性——极验没有。 它是纯 JS 配置,不像 Turnstile / reCAPTCHA 把 key 挂在 HTML 属性上,按那个习惯找会一无所获。appendTo("#captcha") 里那个 #captcha 只是容器 id,跟 key 无关。
取到之后可以自测对不对(我实测过):
curl "https://gcaptcha4.geetest.com/load?captcha_id=<你的ID>&challenge=11111111-2222-3333-4444-555555555555&client_type=web&callback=geetest_$(date +%s)000"返回 {"status": "success", "data": {"lot_number":...}} 说明 ID 有效;返回 {"status":"error","code":"-50103","msg":"not captcha"} 说明 ID 抄错了。
`website_url` 填验证码所在那一页的完整地址(含路径),不是站点首页。
调用示例
一个端点解全部验证码类型 —— 换一种验证码只改 type 这一个字段。
curl -X POST https://api.everyinfra.com/api/v1/captcha \ -H "Authorization: Bearer omg_你的KEY" \ -H "Content-Type: application/json" \ -d '{"type":"geetest","website_url":"<website_url>","website_key":"<website_key>"}'
{ "solution": { "captcha_id": "…", "lot_number": "…", "pass_token": "…", "gen_time": "…", "captcha_output": "…" }, "billing": { "charged": true, "credits": 150 }}
怎么确认目标站用的就是它
组件在页面加载时就开始采集全程行为轨迹(鼠标/触摸的移动路径、按下与释放时序)、设备与浏览器环境特征,连同题面作答一起上报;服务端风控引擎给出风险判定,据此决定直接放行还是升级题型。通过后前端拿到一组一次性凭证,业务后端再带着凭证向极验 `https://gcaptcha4.geetest.com/validate` 做二次校验才算数。
容易搞混的
最容易和极验 v3 搞混——同厂商上一代,参数集完全不同(v3 要 gt + 每次现取的 challenge,v4 只要 captcha_id)。其次容易和网易易盾搞混,因为两者的滑动拼图外观非常接近、且在中国大陆站点上都高频出现;判别只看脚本域名:static.geetest.com 是极验,cstaticdun.126.net 是易盾。
常见部署场景
- 航司与旅行票务(极验官网按行业分类首位就是「航司」,英文站对应 Travel & Hotel)
- 金融银行、证券基金(官网独立行业方案页)
- 电商与零售的抢购、领券环节
- 游戏与社交平台的注册、登录、找回密码
- 国际站点:v4 内置 15 种语言(zho/eng/zho-tw/zho-hk/udm/jpn/ind/kor/rus/ara/spa/pon/por/fra/deu),不是只做中国大陆
已知的坑
v4 的 `/load` 请求里也有一个叫 `challenge` 的参数,但它不是 v3 那个 challenge。 v4 的 challenge 是客户端自己随机生成的 UUID,v3 的 challenge 是服务端 API1 下发、一次性、页面加载完就已消耗。只看到「challenge」这个词就判成 v3 是最常见的误判。实测:我随手编一个 UUID 传进 v4 的 /load,照样返回 status: success。
判版本更稳的两条判据:页面上有没有一个服务端下发的静态 challenge(有 gt + challenge 一对 = v3;只有 captcha_id = v4);以及成功后回传几个字段(v3 是三个 geetest_challenge / geetest_validate / geetest_seccode;v4 是四到五个 lot_number / captcha_output / pass_token / gen_time,加上你自己带的 captcha_id)。
v4 的五个字段必须一起提交回目标站,少一个会被拒。字段名照抄不要改大小写。
captchaObj.getValidate() 只在 onSuccess 回调里返回对象,其他时候一律返回 false——不是解错了,是取的时机不对。
服务端二次校验还需要一个 sign_token,它是用只存在于服务端的 captcha_key 对 lot_number 做 HMAC-SHA256 得到的。那把 key 不在页面上,不要浪费时间去找,它是目标站自己的密钥,不是我们要的参数。
captcha_id 是站点级静态值,同一站点长期不变,可以缓存复用;v3 的 challenge 恰恰相反,每次都要现取。
极验官方文档站有两套:docs.geetest.com/gt4/* 与 docs.geetest.com/BehaviorVerification/* 讲的是 v4(中/英),docs.geetest.com/captcha/* 讲的是 v3。翻错文档会拿到完全不同的参数表。
常见问题
极验 GeeTest v4 要传哪些参数?
必填 website_url、website_key,没有可选参数。请求里 type 传 geetest。
解出来的东西怎么用?
返回一组字段(要一起提交),取 solution.captcha_id、solution.lot_number、solution.pass_token、solution.gen_time、solution.captcha_output。把这五个字段一起提交回目标站
initGeetest4 要去页面的哪里找?
重点找 initGeetest4、initGeetest、gcaptcha4。本页「参数去页面哪里取」一节写了全部位置与取法,含可直接粘进控制台的一行命令。
怎么确认目标站用的就是 极验 GeeTest v4?
最容易和极验 v3 搞混——同厂商上一代,参数集完全不同(v3 要 gt + 每次现取的 challenge,v4 只要 captcha_id)。其次容易和网易易盾搞混,因为两者的滑动拼图外观非常接近、且在中国大陆站点上都高频出现;判别只看脚本域名:static.geetest.com 是极验,cstaticdun.126.net 是易盾。
有什么容易踩的坑?
v4 的 `/load` 请求里也有一个叫 `challenge` 的参数,但它不是 v3 那个 challenge。 v4 的 challenge 是客户端自己随机生成的 UUID,v3 的 challenge 是服务端 API1 下发、一次性、页面加载完就已消耗。只看到「challenge」这个词就判成 v3 是最常见的误判。实测:我随手编一个 UUID 传进 v4 的 /load,照样返回 status: success。
多少钱一次,失败扣不扣?
$2.08 / 1K 次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。