GeeTest v3 presenta desafíos interactivos: rompecabezas de diapositivas, selecciones de íconos o combinación de palabras. A diferencia de reCAPTCHA, GeeTest utiliza un flujo de verificación personalizado con tres parámetros (gt, challenge, api_server) que debes extraer de la página antes de resolver.
Esta guía recorre el proceso completo de extracción de parámetros de GeeTest y resolución del desafío con la API CaptchaAI.
Requisitos
| Artículo | Valor |
|---|---|
| Clave API CaptchaAI | Decaptchaai.com |
Valor GeeTest gt |
Identificador estático por sitio |
GeeTest challenge |
Valor dinámico por sesión |
| URL de la página | La URL donde aparece GeeTest |
| Idioma | Python 3.7+ o Node.js 14+ |
Paso 1: extraer los parámetros de GeeTest
GeeTest requiere tres parámetros. El gt es estático (igual para cada solicitud), mientras que challenge cambia por sesión.
Método 1: pestaña Red
- Abra la pestaña Red de DevTools →
- Filtrar por
register-slideogettype.phpoget.php - Activa el captcha y busca la solicitud de inicialización.
- La respuesta contiene
gt,challengey, a veces,api_server.
{
"success": 1,
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"new_captcha": true
}
Método 2: fuente de la 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: punto final API
Muchos sitios obtienen parámetros de GeeTest desde su propia 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"]
Paso 2: envíe la tarea a CaptchaAI
pitón
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}")
Nodo.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;
}
Paso 3: consulta para encontrar la solución
La resolución de GeeTest devuelve tres valores: challenge, validate y seccode.
pitón
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"
# }
Nodo.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');
}
Paso 4: envíe la solución al sitio de destino
Envíe los tres valores al punto final de verificación del sitio:
# 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}")
Ejemplo 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}")
Solución de problemas
| error | causa | Solución |
|---|---|---|
ERROR_BAD_PARAMETERS |
Falta gt o desafío | Ambos son obligatorios: extracto de la página. |
ERROR_CAPTCHA_UNSOLVABLE |
El desafío expiró o no es válido | Vuelva a buscar un nuevo desafío del sitio |
| Solución rechazada por el sitio | Valor de desafío obsoleto | El desafío es de un solo uso; obtener uno nuevo para cada intento |
geetest_validate está vacío |
Resolver falló internamente | Vuelve a intentarlo con un nuevo desafío |
Ejemplo ejecutable completo
¿Necesita un proyecto funcional completo con configuración del entorno, sondeo, reintentos y manejo de errores?
Vea el ejemplo ejecutable completo en GitHub →
Preguntas frecuentes
¿Por qué necesito buscar un nuevo desafío cada vez?
El valor challenge es de un solo uso. Una vez que se consume (ya sea por una resolución exitosa o por vencimiento), el backend del sitio lo rechazará. Busque siempre un nuevo desafío antes de cada solución.
¿Qué es el parámetro api_server?
Especifica qué servidor GeeTest maneja la verificación. Los valores comunes son api.geetest.com y api-na.geetest.com. Si el sitio utiliza un servidor personalizado, inclúyalo en su solicitud.
¿Cuánto tiempo lleva la resolución de GeeTest?
Normalmente entre 15 y 30 segundos. Los rompecabezas de diapositivas y los desafíos de íconos toman tiempos similares.
¿Puedo resolver GeeTest v4 con este método?
No. GeeTest v4 utiliza un protocolo diferente. Compruebe si CaptchaAI es compatible con la versión específica de GeeTest en el sitio.
¿Cuál es la diferencia entre los desafíos de diapositivas y clics de GeeTest?
GeeTest v3 tiene varios tipos de desafíos (diapositiva, clic en ícono, coincidencia de palabras), pero los parámetros y el flujo de la API son idénticos. CaptchaAI maneja todos los tipos v3 de forma transparente.
Guías relacionadas
- Cómo funciona el CAPTCHA GeeTest v3
- Errores y soluciones comunes de GeeTest v3
- GeeTest y reCAPTCHA