Tutoriais de API

Como resolver GeeTest v3 usando API

GeeTest v3 apresenta desafios interativos – quebra-cabeças de slides, seleção de ícones ou correspondência de palavras. Ao contrário do reCAPTCHA, GeeTest usa um fluxo de verificação personalizado com três parâmetros (gt, challenge, api_server) que você deve extrair da página antes de resolver.

Este guia percorre todo o processo de extração de parâmetros GeeTest e solução do desafio com a API CaptchaAI.


Requisitos

Artigo Valor
Chave de API CaptchaAI Decaptchaai.com
Valor GeeTest gt Identificador estático por site
GeeTest challenge Valor dinâmico por sessão
URL da página A URL onde GeeTest aparece
Idioma Python 3.7+ ou Node.js 14+

Etapa 1: extrair os parâmetros do GeeTest

GeeTest requer três parâmetros. O gt é estático (o mesmo para cada solicitação), enquanto o challenge muda por sessão.

Método 1: guia Rede

  1. Abra a guia DevTools → Rede
  2. Filtrar por register-slide ou gettype.php ou get.php
  3. Acione o captcha e procure a solicitação de inicialização
  4. A resposta contém gt, challenge e, às vezes, api_server
{
  "success": 1,
  "gt": "019924a82c70bb123aae90d483087f94",
  "challenge": "12345678abc90def12345678abc90def",
  "new_captcha": true
}

Método 2: fonte da página

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

Método 3: endpoint da API

Muitos sites buscam parâmetros GeeTest de sua própria API:

# 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"]

Etapa 2: envie a tarefa para CaptchaAI

Pitão

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;
}

Passo 3: Pesquise a solução

A resolução GeeTest retorna três valores: challenge, validate e seccode.

Pitão

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');
}

Etapa 4: envie a solução para o site de destino

Envie todos os três valores para o endpoint de verificação do site:

# 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}")

Exemplo completo de 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}")

Solução de problemas

Erro Causa Correção
ERROR_BAD_PARAMETERS Faltando GT ou desafio Ambos são obrigatórios – extrato da página
ERROR_CAPTCHA_UNSOLVABLE O desafio expirou ou é inválido Busque novamente um novo desafio no site
Solução rejeitada pelo site Valor de desafio obsoleto O desafio é o uso único; ganhe um novo para cada tentativa
geetest_validate está vazio Resolver falha internamente Tente novamente com um novo desafio

Exemplo executável completo

Precisa de um projeto funcional completo com configuração de ambiente, pesquisas, novas tentativas e tratamento de erros?

Veja o exemplo executável completo no GitHub →


Perguntas frequentes

Por que preciso buscar um novo desafio a cada vez?

O valor challenge é de uso único. Depois de consumido (seja por uma solução bem-sucedida ou por expiração), o backend do site irá rejeitá-lo. Sempre busque um novo desafio antes de cada solução.

Qual é o parâmetro api_server?

Ele especifica qual servidor GeeTest trata da verificação. Os valores comuns são api.geetest.com e api-na.geetest.com. Se o site usar um servidor personalizado, inclua-o na sua solicitação.

Quanto tempo leva a resolução do GeeTest?

Normalmente 15–30 segundos. Os quebra-cabeças de slides e os desafios de ícones levam tempos semelhantes.

Posso resolver GeeTest v4 com este método?

Não. GeeTest v4 usa um protocolo diferente. Verifique se CaptchaAI suporta a versão específica do GeeTest no site.

Qual é a diferença entre os desafios de slide e clique do GeeTest?

GeeTest v3 tem vários tipos de desafio (slide, clique no ícone, correspondência de palavras), mas os parâmetros da API e o fluxo são idênticos. CaptchaAI lida com todos os tipos v3 de forma transparente.


Guias relacionados

Os comentários estão desativados para este artigo.