GeeTest v3 usa um protocolo de resposta a desafios em várias etapas. Ao contrário do reCAPTCHA, onde um único token resolve tudo, o GeeTest envolve uma etapa de registro, uma troca de token de desafio e uma validação final – cada uma produzindo parâmetros diferentes. Compreender este fluxo é essencial para a integração correta com CaptchaAI.
O protocolo de duas fases
GeeTest v3 opera em duas fases:
Fase 1: Registro (lado do servidor)
O backend do site entra em contato com a GeeTest para registrar um novo desafio:
Site Backend → GeeTest Server: "Give me a challenge for this user"
GeeTest Server → Site Backend: { gt, challenge, new_captcha }
Site Backend → Browser: Passes gt and challenge to the page
Fase 2: Verificação (lado do cliente + lado do servidor)
O navegador renderiza o desafio, o usuário resolve e o resultado é verificado:
Browser: Renders slider/puzzle using gt + challenge
User: Solves the challenge
Browser → Site Backend: { geetest_challenge, geetest_validate, geetest_seccode }
Site Backend → GeeTest Server: Verifies the three values
GeeTest Server → Site Backend: { result: "success" }
Fluxo detalhado
Etapa 1: chamada de API de registro
O backend do site chama o endpoint de registro do GeeTest:
GET https://api.geetest.com/register.php?gt=GT_ID&json_format=1
Resposta:
{
"success": 1,
"gt": "81dc9bdb52d04dc20036dbd8313ed055",
"challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"new_captcha": true
}
| Parâmetro | Significado |
|---|---|
gt |
GeeTest ID — identifica a conta GeeTest do site |
challenge |
Token de desafio exclusivo para esta sessão |
new_captcha |
Se deve usar o novo formato CAPTCHA |
Importante: O valor challenge é de uso único e limitado no tempo. Cada carregamento de página gera um novo desafio.
Etapa 2: Renderização do Desafio
O navegador recebe gt e challenge e inicializa o widget GeeTest:
initGeetest({
gt: "81dc9bdb52d04dc20036dbd8313ed055",
challenge: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
offline: false,
new_captcha: true,
product: "float"
}, function(captchaObj) {
captchaObj.appendTo('#captcha-container');
captchaObj.onSuccess(function() {
var result = captchaObj.getValidate();
// result contains: geetest_challenge, geetest_validate, geetest_seccode
});
});
Etapa 3: tipos de desafio
GeeTest v3 suporta vários tipos de desafio:
| Tipo | Ação do usuário | Descrição |
|---|---|---|
| Controle deslizante | Arraste a peça do quebra-cabeça | Mova uma peça do quebra-cabeça para completar a imagem |
| Clique no ícone | Clique nos ícones em ordem | Clique em ícones específicos na sequência mostrada |
| Clique na palavra | Clique nos caracteres | Clique nos caracteres chineses na ordem correta |
| Espaço | Clique/select | Desafio de raciocínio espacial |
O tipo de desafio é determinado pela GeeTest com base na configuração do site e no perfil de risco do usuário.
Etapa 4: Valores da Solução
Após a resolução, o widget produz três valores:
{
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
| Valor | Descrição |
|---|---|
geetest_challenge |
Token de desafio modificado (original + 2 caracteres extras) |
geetest_validate |
Hash de validação |
geetest_seccode |
Código de segurança (validar + `\ |
Etapa 5: verificação do lado do servidor
O backend do site envia estes três valores para GeeTest para verificação:
POST https://api.geetest.com/validate.php
seccode=abc123def456_validate|jordan
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy
&sdk=geetest-python-3.0.0
GeeTest responde com:
{
"seccode": "abc123def456_validate",
"validate": "abc123def456_validate"
}
Extraindo parâmetros para CaptchaAI
Para resolver com CaptchaAI, você precisa de gt e challenge da página:
Método 1: interceptar a resposta do registro
from playwright.sync_api import sync_playwright
import json
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
geetest_params = {}
def handle_response(response):
if "register" in response.url and "geetest" in response.url:
data = response.json()
geetest_params["gt"] = data.get("gt")
geetest_params["challenge"] = data.get("challenge")
page.on("response", handle_response)
page.goto("https://staging.example.com/qa-login")
# Wait for GeeTest to load
page.wait_for_selector(".geetest_holder")
print(f"gt: {geetest_params.get('gt')}")
print(f"challenge: {geetest_params.get('challenge')}")
Método 2: extrair do JavaScript da página
gt = page.evaluate("() => document.querySelector('[data-gt]')?.dataset.gt")
challenge = page.evaluate("() => document.querySelector('[data-challenge]')?.dataset.challenge")
Método 3: da chamada initGeetest
Pesquise a origem da página para a chamada initGeetest:
import re
source = page.content()
gt_match = re.search(r"gt['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)
challenge_match = re.search(r"challenge['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)
Resolvendo com CaptchaAI
Envie os parâmetros extraídos:
POST https://ocr.captchaai.com/in.php
key=YOUR_API_KEY
&method=geetest
>=81dc9bdb52d04dc20036dbd8313ed055
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
&pageurl=https://staging.example.com/qa-login
&json=1
Enquete para o resultado:
GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1
CaptchaAI retorna:
{
"status": 1,
"request": {
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
}
Você recebe todos os três valores necessários para a etapa de verificação do site.
Modo off-line x on-line
GeeTest v3 tem um modo de fallback quando os servidores GeeTest estão inacessíveis:
| Modo | Valor success |
Comportamento |
|---|---|---|
| On-line | 1 |
Resposta normal ao desafio com servidores GeeTest |
| Off-line | 0 |
Verificação local simplificada |
No modo offline, o desafio é gerado localmente e a verificação é mais simples. A maioria dos sites usa o modo online.
Solução de problemas
| Problema | Causa | Correção |
|---|---|---|
O valor challenge está vazio |
Falha no registro | Verifique se o site carrega o GeeTest corretamente |
| Solução rejeitada | O desafio expirou | Extraia challenge fresco e resolva imediatamente |
Valor gt errado |
Várias instâncias do GeeTest na página | Extraia gt do widget correto |
| Três valores retornados mas o formulário não é enviado | Campos de formulário ausentes | Injete todos os três valores nas entradas corretas |
Perguntas frequentes
Por que GeeTest precisa de gt e challenge?
O gt identifica a conta GeeTest do site (persistente). O challenge é um token específico da sessão que evita ataques de repetição — cada desafio só pode ser resolvido uma vez.
Posso reutilizar um desafio GeeTest?
Não. Cada valor challenge é de uso único. Depois que for resolvido (ou expirar), você deverá obter um novo na API de registro.
Quanto tempo dura um desafio GeeTest?
Os desafios normalmente expiram em 1 a 2 minutos. Resolva e envie imediatamente após extrair os parâmetros.
Artigos relacionados
- Resolver Geetest V3 Nodejs
- Resolvendo Geetest V3 Nodejs Captchaai
- Aprofundamento da API de avaliação empresarial do Recaptcha
Próximas etapas
Resolva os desafios GeeTest v3 —obtenha sua chave API CaptchaAIe integre a resposta de três valores ao seu fluxo de trabalho.