API 教程

如何使用 API 解决 GeeTest v3 问题

GeeTest v3 呈现互动挑战 - 幻灯片拼图、图标选择或单词匹配。与 reCAPTCHA 不同,GeeTest 使用带有三个参数(gtchallengeapi_server)的自定义验证流程,您必须在求解之前从页面中提取这些参数。

本指南逐步介绍了提取 GeeTest 参数并使用 CaptchaAI API 解决挑战的完整过程。


要求

物品 价值
CaptchaAI API 密钥 验证码网站
GeeTest gt 静态每站点标识符
极测challenge 动态每会话价值
页面网址 GeeTest 出现的 URL
语言 Python 3.7+ 或 Node.js 14+

步骤1:提取GeeTest参数

GeeTest 需要三个参数。 gt 是静态的(每个请求都相同),而 challenge 每个会话都会更改。

方法 1:网络选项卡

  1. 打开 DevTools → 网络 选项卡
  2. register-slidegettype.phpget.php 过滤
  3. 触发验证码并查找初始化请求
  4. 响应包含 gtchallenge,有时包含 api_server
{
  "success": 1,
  "gt": "019924a82c70bb123aae90d483087f94",
  "challenge": "12345678abc90def12345678abc90def",
  "new_captcha": true
}

方法二:页面源码

// Search page source for initGeetest or gt value
document.querySelectorAll('script').forEach(s => {
  if (s.textContent.includes('initGeetest')) {
    console.log(s.textContent);
  }
});

方法3:API端点

许多网站从自己的 API 获取 GeeTest 参数:

# The site's registration endpoint
params_response = requests.get("https://example.com/api/captcha/register")
data = params_response.json()
gt = data["gt"]
challenge = data["challenge"]

第二步:向CaptchaAI提交任务

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "geetest",
    "gt": "019924a82c70bb123aae90d483087f94",
    "challenge": "12345678abc90def12345678abc90def",
    "api_server": "api.geetest.com",  # Optional, use if site specifies
    "pageurl": "https://staging.example.com/qa-login",
    "json": 1
})

data = response.json()
if data.get("status") != 1:
    raise Exception(f"Submit error: {data.get('request')}")

task_id = data["request"]
print(f"Task submitted: {task_id}")

Node.js

const axios = require('axios');

const API_KEY = 'YOUR_API_KEY';

async function submitGeeTest(gt, challenge, pageurl) {
  const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
    params: {
      key: API_KEY,
      method: 'geetest',
      gt,
      challenge,
      api_server: 'api.geetest.com',
      pageurl,
      json: 1
    }
  });

  if (data.status !== 1) throw new Error(`Submit error: ${data.request}`);
  return data.request;
}

第 3 步:民意调查解决方案

GeeTest 求解返回三个值:challengevalidateseccode

Python

def get_geetest_solution(task_id):
    for attempt in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1
        }).json()

        if result.get("status") == 1:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {result.get('request')}")

    raise Exception("Timeout")

solution = get_geetest_solution(task_id)
# solution = {
#   "geetest_challenge": "12345678abc90def12345678abc90def1a",
#   "geetest_validate": "abcdef1234567890abcdef1234567890",
#   "geetest_seccode": "abcdef1234567890abcdef1234567890|jordan"
# }

Node.js

async function getGeeTestSolution(taskId) {
  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const { data } = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
    });
    if (data.status === 1) return data.request;
    if (data.request !== 'CAPCHA_NOT_READY') throw new Error(data.request);
  }
  throw new Error('Timeout');
}

第四步:将解决方案提交到目标站点

将所有三个值发送到站点的验证端点:

# Submit the GeeTest solution with the form data
verify_response = requests.post("https://example.com/api/login", data={
    "username": "user@example.com",
    "password": "password123",
    "geetest_challenge": solution["geetest_challenge"],
    "geetest_validate": solution["geetest_validate"],
    "geetest_seccode": solution["geetest_seccode"]
})

print(f"Login status: {verify_response.status_code}")

完整的 Python 示例

import requests
import time

API_KEY = "YOUR_API_KEY"
SITE_URL = "https://staging.example.com/qa-login"

# 1. Get GeeTest parameters from the site
params = requests.get("https://example.com/api/captcha/register").json()

# 2. Submit to CaptchaAI
submit = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "geetest",
    "gt": params["gt"],
    "challenge": params["challenge"],
    "pageurl": SITE_URL,
    "json": 1
}).json()
task_id = submit["request"]

# 3. Poll for solution
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        solution = result["request"]
        break

# 4. Submit to site
login = requests.post(SITE_URL, data={
    "username": "user@example.com",
    "password": "pass",
    "geetest_challenge": solution["geetest_challenge"],
    "geetest_validate": solution["geetest_validate"],
    "geetest_seccode": solution["geetest_seccode"]
})
print(f"Result: {login.status_code}")

故障排除

错误 原因 处理方式
ERROR_BAD_PARAMETERS 缺少gt或挑战 两者都是必需的 - 从页面摘录
ERROR_CAPTCHA_UNSOLVABLE 挑战已过期或无效 从网站重新获取新的挑战
解决方案被站点拒绝 陈旧的挑战值 挑战是一次性的;每次尝试都获得一个新的
geetest_validate 为空 内部解决失败 重试新的挑战

完整的可运行示例

需要一个包含环境设置、轮询、重试和错误处理的完整工作项目吗?

请参阅 GitHub 上的完整可运行示例 →


常问问题

为什么我每次都需要获取新的挑战?

challenge 值是一次性的。一旦它被消耗(无论是成功解决还是过期),站点的后端将拒绝它。在每次解决之前始终获取新的挑战。

api_server 参数是什么?

它指定哪个 GeeTest 服务器处理验证。常见值为 api.geetest.comapi-na.geetest.com。如果该站点使用自定义服务器,请将其包含在您的请求中。

GeeTest 求解需要多长时间?

通常为 15-30 秒。幻灯片谜题和图标挑战所需的时间相似。

我可以用这个方法解决GeeTest v4吗?

不会。GeeTest v4 使用不同的协议。检查CaptchaAI是否支持网站上特定的GeeTest版本。

GeeTest 幻灯片挑战和点击挑战有什么区别?

GeeTest v3有多种挑战类型(幻灯片、图标点击、文字匹配),但API参数和流程是相同的。 CaptchaAI 透明地处理所有 v3 类型。


相关指南

该文章已禁用评论。