reCAPTCHA v2 Enterprise agrega puntuación de riesgo de nivel empresarial a la casilla de verificación estándar "No soy un robot". El widget tiene el mismo aspecto que el estándar v2, pero los tokens se verifican a través del backend empresarial de Google con una validación más estricta. Para resolverlo con CaptchaAI, agregue enterprise=1 a su solicitud v2.
Esta guía cubre la implementación completa de Node.js: detectar Enterprise v2, enviarlo a CaptchaAI, sondear el resultado e inyectar el token.
lo que necesitas
| Requisito | Detalles |
|---|---|
| Clave API CaptchaAI | captchaai.com |
| Nodo.js 14+ | Con fetch o node-fetch incorporados |
| Clave del sitio | Desde la URL de anclaje empresarial (parámetro k=) |
| URL de la página | URL completa donde aparece el CAPTCHA |
| Acción (opcional) | Desde el parámetro sa= en la URL de anclaje |
Paso 1: Identificar reCAPTCHA v2 Enterprise
Abra DevTools y busque la solicitud de anclaje empresarial en la pestaña Red:
https://www.google.com/recaptcha/enterprise/anchor?ar=1&k=6LdxxXXxAAAAAAcX...&sa=LOGIN&...
Indicadores clave:
- La fuente del script incluye
/recaptcha/enterprise.jso/enterprise/anchor - El parámetro
k=es sitekey - El parámetro
sa=(si está presente) es la acción
El estándar v2 usa /recaptcha/api2/anchor; no agregue enterprise=1 para el estándar v2.
Paso 2: envíe la tarea a CaptchaAI
const API_KEY = "YOUR_API_KEY";
async function submitTask(sitekey, pageurl, action) {
const params = new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: pageurl,
enterprise: "1",
json: "1",
});
if (action) {
params.set("action", action);
}
const response = await fetch(
`https://ocr.captchaai.com/in.php?${params}`
);
const data = await response.json();
if (data.status !== 1) {
throw new Error(`Submit failed: ${data.request}`);
}
console.log(`Task submitted. ID: ${data.request}`);
return data.request;
}
Paso 3: consulta para conocer el resultado
Espere 20 segundos antes de la primera consulta, luego verifique cada 5 segundos:
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function pollResult(taskId) {
await delay(20000);
for (let attempt = 0; attempt < 30; attempt++) {
const params = new URLSearchParams({
key: API_KEY,
action: "get",
id: taskId,
json: "1",
});
const response = await fetch(
`https://ocr.captchaai.com/res.php?${params}`
);
const data = await response.json();
if (data.status === 1) {
console.log(`Solved. Token: ${data.request.substring(0, 60)}...`);
return {
token: data.request,
userAgent: data.user_agent || "",
};
}
if (data.request !== "CAPCHA_NOT_READY") {
throw new Error(`Solve failed: ${data.request}`);
}
console.log(`Attempt ${attempt + 1}: not ready, waiting 5s...`);
await delay(5000);
}
throw new Error("Solve timed out");
}
Paso 4: inyecta el token
Envíe el token resuelto como g-recaptcha-response. Si la API devolvió un user_agent, utilícelo en los encabezados de su solicitud:
async function submitForm(token, userAgent) {
const headers = { "Content-Type": "application/x-www-form-urlencoded" };
if (userAgent) {
headers["User-Agent"] = userAgent;
}
const response = await fetch("https://example.com/api/login", {
method: "POST",
headers,
body: new URLSearchParams({
username: "user",
password: "pass",
"g-recaptcha-response": token,
}),
});
console.log(`Response status: ${response.status}`);
return response;
}
guión de trabajo completo
const API_KEY = "YOUR_API_KEY";
const SITE_KEY = "6LdxxXXxAAAAAAcXxxXxxX91xxxxxxxx8xxOx7A";
const PAGE_URL = "https://staging.example.com/qa-login";
const ACTION = "LOGIN"; // optional — omit if not in anchor URL
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function solveRecaptchaV2Enterprise() {
// Submit task
const submitParams = new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: SITE_KEY,
pageurl: PAGE_URL,
enterprise: "1",
action: ACTION,
json: "1",
});
const submitRes = await fetch(
`https://ocr.captchaai.com/in.php?${submitParams}`
);
const submitData = await submitRes.json();
if (submitData.status !== 1) {
throw new Error(`Submit error: ${submitData.request}`);
}
const taskId = submitData.request;
console.log(`Task ID: ${taskId}`);
// Poll for result
await delay(20000);
for (let i = 0; i < 30; i++) {
const pollParams = new URLSearchParams({
key: API_KEY,
action: "get",
id: taskId,
json: "1",
});
const pollRes = await fetch(
`https://ocr.captchaai.com/res.php?${pollParams}`
);
const pollData = await pollRes.json();
if (pollData.status === 1) {
return {
token: pollData.request,
userAgent: pollData.user_agent || "",
};
}
if (pollData.request !== "CAPCHA_NOT_READY") {
throw new Error(`Solve error: ${pollData.request}`);
}
await delay(5000);
}
throw new Error("Solve timed out");
}
(async () => {
const { token, userAgent } = await solveRecaptchaV2Enterprise();
console.log(`Token: ${token.substring(0, 60)}...`);
if (userAgent) console.log(`User-Agent: ${userAgent}`);
})();
Resultado esperado:
Task ID: 73849562810
Token: 03AGdBq24PBCqLmOx2V4pGHJjkR2xZ1r...
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...
Solución de problemas
| error | causa | Solución |
|---|---|---|
ERROR_WRONG_USER_KEY |
Formato de clave API no válido | La clave de verificación tiene 32 caracteres en su tablero |
ERROR_KEY_DOES_NOT_EXIST |
Clave no encontrada | Verificar clave encaptchaai.com |
ERROR_ZERO_BALANCE |
Saldo insuficiente | Recarga tu cuenta |
ERROR_BAD_TOKEN_OR_PAGEURL |
URL o clave de sitio incorrecta | Extraiga el valor k= correcto de la URL ancla empresarial |
ERROR_CAPTCHA_UNSOLVABLE |
No se pudo resolver | Verifique que la clave del sitio sea Enterprise v2, vuelva a intentarlo |
| Token rechazado por el sitio | No coincidencia usuario-agente | Utilice user_agent de la respuesta de resolución. |
Preguntas frecuentes
¿Cómo puedo detectar Enterprise v2 frente a Standard v2?
Enterprise v2 se carga desde /recaptcha/enterprise/ en el script o URL de anclaje. El estándar v2 usa /recaptcha/api2/.
¿Se requiere el parámetro de acción?
Solo si la URL ancla incluye sa=. Si está ausente, omítalo en su solicitud CaptchaAI.
¿Por qué el sitio de destino rechaza mi token?
Lo más común: falta de coincidencia entre el usuario y el agente. Los tokens Enterprise v2 están vinculados al agente de usuario del solucionador. Utilice siempre el valor user_agent devuelto en la respuesta de la consulta.
¿Puedo usar esto con Puppeteer o Playwright?
Sí. Extraiga la clave del sitio de la página, resuelva a través de la API y luego inyecte el token en document.getElementById('g-recaptcha-response').innerHTML.
¿Cuál es el tiempo típico de resolución?
15 a 30 segundos dependiendo de la carga del servidor.
Empieza a resolver reCAPTCHA v2 Enterprise
Obtenga su clave API encaptchaai.comy agregue enterprise=1 a sus solicitudes v2.
Guías relacionadas
- Cómo resolver reCAPTCHA v2 Enterprise usando API
- Resolver reCAPTCHA v2 Enterprise con Python
- Errores y soluciones comunes de reCAPTCHA v2 Enterprise
- Cómo identificar la implementación empresarial de reCAPTCHA