Los CAPTCHA invisibles verifican a los usuarios sin mostrar un desafío visible. No hay casillas de verificación en las que hacer clic, ni cuadrícula de imágenes que resolver ni texto que escribir. La verificación se realiza completamente en segundo plano a través de JavaScript que analiza el comportamiento del navegador, las señales del dispositivo y la reputación de la red. Si su flujo de trabajo de automatización encuentra un formulario que se envía limpiamente para algunos usuarios pero bloquea a otros (sin ningún CAPTCHA visible en la página), se trata de un sistema CAPTCHA invisible.
Cómo funcionan los CAPTCHA invisibles
Todos los CAPTCHA invisibles siguen el mismo patrón central:
Page loads → CAPTCHA JavaScript injected
↓
Script runs in background, collecting signals:
├─ Browser fingerprint (canvas, WebGL, fonts, plugins)
├─ Behavioral data (mouse, keyboard, scroll, timing)
├─ Network data (IP reputation, TLS fingerprint)
├─ Device data (screen, GPU, CPU cores, memory)
└─ History data (cookies, previous CAPTCHA completions)
↓
Signals sent to CAPTCHA provider's risk engine
↓
Risk score computed
↓
Response varies by score:
├─ Low risk → Token issued silently (user sees nothing)
├─ Medium → Light challenge shown (checkbox, simple click)
└─ High risk → Full challenge (image grid) or block
La diferencia clave con los CAPTCHA visibles: la verificación se ejecuta continuamente desde el momento en que se carga la página, no solo cuando el usuario hace clic en una casilla de verificación.
Principales sistemas CAPTCHA invisibles
1. reCAPTCHA v3
Proveedor: Google ** Lanzamiento: ** 2018 Participación de mercado: La más alta entre los CAPTCHA invisibles
reCAPTCHA v3 devuelve una puntuación de punto flotante entre 0,0 y 1,0 para cada acción de la página. El propietario del sitio web decide qué hacer con la puntuación.
Cómo recopila señales:
<!-- reCAPTCHA v3 integration -->
<script src="https://www.google.com/recaptcha/api.js?render=SITE_KEY"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('SITE_KEY', { action: 'login' }).then(function(token) {
// Token sent to server for verification
document.getElementById('captcha-token').value = token;
});
});
</script>
La llamada execute() activa la recopilación de señales bajo demanda. Detrás de escena, reCAPTCHA ha estado recopilando datos desde que se cargó el script.
Interpretación de la partitura:
| Puntuación | Significado | Acción típica |
|---|---|---|
| 0,9 | muy probablemente humano | Permitir |
| 0,7 | probablemente humano | Permitir con seguimiento |
| 0,5 | incierto | Requerir verificación adicional |
| 0.3 | Probablemente robot | Bloquear o mostrar reCAPTCHA v2 |
| 0.1 | Muy probablemente robot | Bloquear |
Detección en la fuente de la página:
import requests
import re
def detect_recaptcha_v3(url):
html = requests.get(url, timeout=10).text
indicators = {
"recaptcha_v3": False,
"site_key": None,
"actions": [],
}
# Check for v3 script
if "recaptcha/api.js?render=" in html:
indicators["recaptcha_v3"] = True
match = re.search(r"render=([A-Za-z0-9_-]+)", html)
if match:
indicators["site_key"] = match.group(1)
# Find action names
actions = re.findall(r"action:\s*['\"](\w+)['\"]", html)
indicators["actions"] = actions
return indicators
print(detect_recaptcha_v3("https://staging.example.com/qa-login"))
2. Cloudflare Turnstile
Proveedor: Cloudflare Lanzamiento: 2022 Participación de mercado: Crecimiento más rápido
Turnstile utiliza un proceso de verificación de varias etapas sin requerir la recopilación de datos del usuario.
Etapas de verificación:
- Verificación del token de acceso privado: si el navegador es compatible con Apple PAT, la verificación se completa al instante.
- Desafío no interactivo: el navegador resuelve un ligero rompecabezas criptográfico de prueba de trabajo
- Desafío gestionado: Cloudflare decide entre interactivo y no interactivo en función de las señales de riesgo de su red (más del 20 % del tráfico de Internet fluye a través de Cloudflare)
- Desafío interactivo: solo se muestra cuando la puntuación de riesgo es alta; muestra un widget estilo casilla de verificación
Integración:
<!-- Turnstile widget -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
Detección:
def detect_turnstile(url):
html = requests.get(url, timeout=10).text
indicators = {
"turnstile": False,
"site_key": None,
}
if "challenges.cloudflare.com/turnstile" in html or "cf-turnstile" in html:
indicators["turnstile"] = True
match = re.search(r'data-sitekey="([^"]+)"', html)
if match:
indicators["site_key"] = match.group(1)
return indicators
3. reCAPTCHA v2 invisibles
Proveedor: Google ** Lanzamiento: ** 2017
Este es reCAPTCHA v2 que se activa mediante programación al enviar el formulario. No hay ninguna casilla de verificación visible: el usuario hace clic en el botón enviar y reCAPTCHA se ejecuta en segundo plano. Si la puntuación de riesgo es lo suficientemente alta, aparece un desafío de imagen visible como una ventana emergente.
Integración:
<button class="g-recaptcha"
data-sitekey="SITE_KEY"
data-callback="onSubmit"
data-size="invisible">
Submit
</button>
Diferencia clave con respecto a la versión 3: la versión 2 Invisible aún representa un desafío visible para los usuarios riesgosos. La v3 nunca muestra un desafío visible: el sitio web debe decidir qué hacer con la puntuación.
4. hCaptcha Pasivo (Empresarial)
Proveedor: Máquinas de Intuición Disponibilidad: Solo nivel empresarial
El modo pasivo de hCaptcha Enterprise evalúa al usuario sin ningún widget visible. Utiliza las mismas señales de comportamiento que el hCaptcha estándar, pero sólo presenta un desafío visual para los visitantes más sospechosos.
5. Tokens de acceso privado de Apple
Proveedor: Apple Disponibilidad: iOS 16+, macOS Ventura+
Este no es un proveedor de CAPTCHA sino un mecanismo de omisión de CAPTCHA. Los dispositivos Apple demuestran que son legítimos mediante la certificación de hardware, lo que permite a los sitios web omitir los CAPTCHA por completo.
Device attestation:
1. Website requests a challenge from a token issuer
2. Device proves it is genuine without revealing identity
3. Token issuer generates a blind-signed token
4. Website verifies token → CAPTCHA skipped
Compatible con Cloudflare, Fastly y otros proveedores de CDN.
Resolver CAPTCHA invisibles con CaptchaAI
Los CAPTCHA invisibles aún generan tokens que deben enviarse junto con los formularios. Los solucionadores basados en API generan estos tokens externamente.
Resolviendo reCAPTCHA v3
import requests
import time
API_KEY = "YOUR_API_KEY"
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6LdKlZEpAAAAAAOQjzC2v_d36tWxCl6dWsozdSy9",
"pageurl": "https://staging.example.com/qa-login",
"version": "v3",
"action": "login",
"min_score": "0.9",
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
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:
token = result["request"]
print(f"reCAPTCHA v3 token received (score ≥ 0.9)")
break
Política de score para v3
def decide_v3_action(score: float) -> str:
if score >= 0.9:
return "submit"
if score >= 0.5:
return "step_up_to_v2"
return "block_or_review"
Resolviendo Cloudflare Turnstile
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAAC3DHQhMMQ_Rxrg",
"pageurl": "https://example.com/signup",
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
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:
turnstile_token = result["request"]
print(f"Turnstile token received (100% success rate)")
break
Node.js - Resolviendo reCAPTCHA v3
const axios = require("axios");
async function solveRecaptchaV3(siteKey, pageUrl, action) {
const API_KEY = "YOUR_API_KEY";
// Submit
const { data: submit } = await axios.post(
"https://ocr.captchaai.com/in.php",
new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: siteKey,
pageurl: pageUrl,
version: "v3",
action: action,
min_score: "0.9",
json: 1,
})
);
const taskId = submit.request;
// Poll
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const { data: result } = await axios.get(
"https://ocr.captchaai.com/res.php",
{
params: {
key: API_KEY,
action: "get",
id: taskId,
json: 1,
},
}
);
if (result.status === 1) {
return result.request;
}
}
throw new Error("Solve timeout");
}
solveRecaptchaV3("SITE_KEY", "https://staging.example.com/qa-login", "login")
.then((token) => console.log("Token:", token.substring(0, 50) + "..."));
Detección de CAPTCHA invisibles: verificador completo
import requests
import re
def detect_invisible_captcha(url):
"""Detect all invisible CAPTCHA types on a page."""
html = requests.get(url, timeout=10).text
results = []
# reCAPTCHA v3
if "recaptcha/api.js?render=" in html:
key = re.search(r"render=([A-Za-z0-9_-]+)", html)
results.append({
"type": "reCAPTCHA v3",
"site_key": key.group(1) if key else "unknown",
"solver_method": "userrecaptcha (version=v3)",
})
# reCAPTCHA v2 invisible
if 'data-size="invisible"' in html and "g-recaptcha" in html:
key = re.search(r'data-sitekey="([^"]+)"', html)
results.append({
"type": "reCAPTCHA v2 Invisible",
"site_key": key.group(1) if key else "unknown",
"solver_method": "userrecaptcha (invisible=1)",
})
# Cloudflare Turnstile
if "challenges.cloudflare.com/turnstile" in html:
key = re.search(r'data-sitekey="([^"]+)"', html)
results.append({
"type": "Cloudflare Turnstile",
"site_key": key.group(1) if key else "unknown",
"solver_method": "turnstile",
})
# hCaptcha (passive mode detected by script without visible widget)
if "hcaptcha.com/1/api.js" in html and 'data-size="invisible"' in html:
results.append({
"type": "hCaptcha Passive",
"solver_method": "hcaptcha",
})
if not results:
results.append({"type": "none detected"})
return results
for item in detect_invisible_captcha("https://example.com"):
print(item)
Comparación de CAPTCHA invisibles
| Característica | reCAPTCHA v3 | torniquete | reCAPTCHA v2 Invisible | hCaptcha Pasivo |
|---|---|---|---|---|
| Reto visible | nunca | Rara vez | A veces (retroceso) | Rara vez |
| Privacidad | Recopila datos de navegación | Sin datos personales | Recopila datos de navegación | Recopila datos de interacción |
| Costo | Gratis (1M/month) | Gratis (ilimitado) | Gratis (1M/month) | Solo empresa |
| Puntuación devuelta | Sí (0,0-1,0) | No (pasar/fail) | No (pasar/fail) | Sí (empresa) |
| Reto visible de respaldo | El sitio web decide | Gestionado por Cloudflare | Ventana emergente de cuadrícula de imágenes | Ventana emergente de cuadrícula de imágenes |
| Soporte CaptchaAI | Sí (token v3) | Sí (100% de éxito) | Sí (ficha) | Contactar con soporte |
Preguntas frecuentes
¿Cómo puedo saber si una página tiene un CAPTCHA invisible?
Consulte la fuente de la página para ver los scripts del proveedor CAPTCHA. Busque recaptcha/api.js?render= (reCAPTCHA v3), challenges.cloudflare.com/turnstile (torniquete) o hcaptcha.com/1/api.js con data-size="invisible" (hCaptcha pasivo). El widget CAPTCHA no tiene presencia visible en la página, por lo que debe inspeccionar el HTML o las solicitudes de red.
¿Un CAPTCHA invisible todavía genera un token?
Sí. Los CAPTCHA invisibles generan tokens que deben incluirse en los envíos de formularios. El token se coloca en un campo de formulario oculto o se envía como parámetro de solicitud. Los solucionadores basados en API generan estos tokens externamente.
¿Pueden los CAPTCHA invisibles bloquear mi automatización sin mostrar ningún error?
Sí. Si su automatización no incluye un token CAPTCHA válido en el envío del formulario, el servidor rechazará la solicitud en silencio o devolverá un error genérico. No habrá ningún desafío CAPTCHA visible: la solicitud simplemente falla porque falta el token o no es válido.
¿Es reCAPTCHA v3 más seguro que reCAPTCHA v2?
reCAPTCHA v3 es más difícil de detectar visualmente (no hay widget en la página), pero no necesariamente es más seguro. v3 devuelve una puntuación sobre la cual el sitio web debe actuar: si el umbral se establece demasiado bajo, los bots pasan fácilmente. v2 impone un desafío definitivo/response. En la práctica, v3 con un umbral estricto (0,7+) más v2 como respaldo proporciona la mejor seguridad.
Resumen
Los CAPTCHA invisibles verifican a los usuarios a través de análisis JavaScript en segundo plano del comportamiento del navegador, las señales del navegador del dispositivo y la reputación de la red, sin ninguna interacción visible. reCAPTCHA v3 y Cloudflare Turnstile son las implementaciones dominantes, y Turnstile crece más rápido debido a su precio gratuito y su diseño que prioriza la privacidad. Para la automatización, los CAPTCHA invisibles aún requieren tokens válidos. UsarCaptchaAIpara generar estos tokens: reCAPTCHA v3 mediante el método userrecaptcha con version=v3, y Cloudflare Turnstile mediante el método turnstile con una tasa de éxito del 100%.
Artículos relacionados
- Comparación de Geetest y Cloudflare Turnstile
- Cloudflare Turnstile 403 Después de la corrección del token
- Modos de widget Cloudflare Turnstile explicados