Análises Técnicas

Fluxo de trabalho de resposta ao desafio GeeTest v3: aprofundamento técnico

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
&gt=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

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.

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