极验GT4滑块验证协议全链路逆向演示

极验从GT3迭代到GT4后,核心加密逻辑的复杂度(尤其是环境指纹、行为轨迹拟合)显著提升,但对于公开可逆向的简化Demo站,或通过浏览器Hook稳定提取关键生成函数后,仍可实现全流程自动化。

本文以极验GT4官方登录Demo为目标,给出一套基于 Python Requests + NodeJS ExecJS 的轻量级实现代码。


一、整体验证流程拆解

GT4简化版的公开验证逻辑可分为 4个核心步骤

  1. 生成UUID格式的 challenge 标识
  2. 调用 /load 接口获取验证配置(lot_number/payload/process_token/static_path等)
  3. 核心逆向:调用Hook/补环境后提取的JS函数生成关键加密参数 w
  4. 调用 /verify 接口通过极验服务器验证,拿到业务可用的 seccode 信息
  5. 携带 seccode 完成Demo业务接口的交互

二、轻量级实现代码

前置依赖

pip install requests execjs

注意:ExecJS 需要提前安装 NodeJS 并配置好环境变量,默认会调用 node 命令执行JS代码。

Python主逻辑(main.py)

import requests
import time
import execjs
import json
from datetime import datetime, timezone, timedelta

# ---------------------- 1. 初始化JS执行环境 ----------------------
# demo.js 为通过浏览器Hook/补环境后提取的核心JS代码(需自行准备)
with open("demo.js", "r", encoding="utf-8") as f:
    jscode = f.read()
ctx = execjs.compile(jscode)

# ---------------------- 2. 基础配置 ----------------------
CAPTCHA_ID = "99b142aaece96330d0f3ffb565ffb3ef"  # 极验GT4 Demo站固定captcha_id
BASE_HEADERS = {
    "Accept": "*/*",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Cache-Control": "no-cache",
    "Connection": "keep-alive",
    "Pragma": "no-cache",
    "Referer": "https://gt4.geetest.com/",
    "Sec-Fetch-Dest": "script",
    "Sec-Fetch-Mode": "no-cors",
    "Sec-Fetch-Site": "same-site",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
    "sec-ch-ua": "\"Not;A=Brand\";v=\"99\", \"Google Chrome\";v=\"139\", \"Chromium\";v=\"139\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\""
}
# 可选:极验GT4 Demo站的临时Cookie(可省略但响应速度可能稍慢)
BASE_COOKIES = {
    "captcha_v4_user": "011a9cb06bdd4689975694733321d078",
    "sensorsdata2015jssdkcross": "%7B%22distinct_id%22%3A%221984a8102985cf-0b16af714940d38-26011151-2073600-1984a810299111c%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%7D%2C%22%24device_id%22%3A%221984a8102985cf-0b16af714940d38-26011151-2073600-1984a810299111c%22%7D",
    "Hm_lvt_25b04a5e7a64668b9b88e2711fb5f0c4": "1753596626,1753862889",
    "_uetvid": "635904806ab011f0ba3ed52cdc6e75e1"
}

# ---------------------- 3. 生成Challenge标识 ----------------------
challenge = ctx.call("uuid")

# ---------------------- 4. 调用Load接口拉取验证配置 ----------------------
load_params = {
    "captcha_id": CAPTCHA_ID,
    "challenge": challenge,
    "client_type": "web",
    "lang": "zho",
    "callback": f"geetest_{int(time.time() * 1000)}"
}
load_resp = requests.get(
    url="https://gcaptcha4.geetest.com/load",
    headers=BASE_HEADERS,
    cookies=BASE_COOKIES,
    params=load_params
)
# 去掉JSONP外层的回调函数名
load_data = json.loads(load_resp.text[load_resp.text.find('{'): -1])["data"]

# ---------------------- 5. 核心:生成加密参数w ----------------------
# 生成GT4要求的+08:00时区ISO格式时间(注意:必须带时区)
formatted_time = datetime.now(timezone(timedelta(hours=8))).isoformat()
# 调用提取的getW函数(需demo.js中存在该导出函数)
w = ctx.call(
    "getW",
    load_data["lot_number"],
    CAPTCHA_ID,
    formatted_time,
    load_data["static_path"],
    load_data["payload"],
    load_data["process_token"]
)

# ---------------------- 6. 调用Verify接口通过验证 ----------------------
verify_params = {
    "callback": f"geetest_{int(time.time() * 1000)}",
    "captcha_id": CAPTCHA_ID,
    "client_type": "web",
    "lot_number": load_data["lot_number"],
    "payload": load_data["payload"],
    "process_token": load_data["process_token"],
    "payload_protocol": "1",
    "pt": "1",
    "w": w
}
verify_resp = requests.get(
    url="https://gcaptcha4.geetest.com/verify",
    headers=BASE_HEADERS,
    cookies=BASE_COOKIES,
    params=verify_params
)
verify_data = json.loads(verify_resp.text[verify_resp.text.find('{'): -1])["data"]["seccode"]

# ---------------------- 7. 携带seccode完成Demo业务交互 ----------------------
demo_params = {
    "captcha_id": CAPTCHA_ID,
    "lot_number": load_data["lot_number"],
    "pass_token": verify_data["pass_token"],
    "gen_time": verify_data["gen_time"],
    "captcha_output": verify_data["captcha_output"]
}
demo_resp = requests.get(
    url="https://gt4.geetest.com/demov4/demo/login",
    headers=BASE_HEADERS,
    params=demo_params
)
print("Demo业务接口响应:", demo_resp.json())

三、关键注意事项

1. 关于demo.js的获取

本文仅提供Python端的调用框架,核心的 demo.js(需包含 uuidgetW 两个导出函数)需通过以下方式自行准备:

  • 浏览器Hook:利用DevTools的XHR/Fetch断点、JS断点(找到处理load接口响应并生成w的核心函数),直接提取并导出函数
  • 自动化浏览器补环境:使用Puppeteer/Playwright获取完整的w生成逻辑,但本文是轻量级实现,故不展开

2. 关于带时区的ISO时间

GT4的getW函数对时间格式要求严格,必须是 带+08:00(东八区)时区标记的ISO 8601格式,例如 2025-08-01T12:00:00+08:00,否则极验服务器会直接拒绝验证。

3. 关于Cookie的使用

极验GT4 Demo站的Cookie并非必填项,但携带与User-Agent匹配的临时Cookie可以减少环境检查的压力,提高验证通过的概率。


四、总结

本文给出的是极验GT4简化版的全链路轻量级自动化方案,核心难点在于 demo.js 的提取与补环境(如果仅从浏览器Hook提取函数,很多时候需要补一些简单的浏览器环境变量,如 window/navigator 等)。

对于真实生产环境的GT4(通常有复杂的行为轨迹拟合、设备指纹加密),这套方案无法直接使用,需要结合轨迹识别算法、更深度的环境模拟才能实现稳定通过。