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