Explainers

Explicación de los sistemas CAPTCHA invisibles: cómo funcionan

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:

  1. Verificación del token de acceso privado: si el navegador es compatible con Apple PAT, la verificación se completa al instante.
  2. Desafío no interactivo: el navegador resuelve un ligero rompecabezas criptográfico de prueba de trabajo
  3. 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)
  4. 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

Los comentarios están deshabilitados para este artículo.

Publicaciones relacionadas

Explainers Guía de detección de implementación de Cloudflare Turnstile
Cómo detectar la implementación de Cloudflare Turnstile: desde HTML estático y llamadas Java Script hasta carga dinámica, con código en Python y Puppeteer.

Cómo detectar la implementación de Cloudflare Turnstile: desde HTML estático y llamadas Java Script hasta carg...

Apr 18, 2026
Comparisons CAPTCHA de texto vs CAPTCHA de imagen: comparación de desarrolladores
Comparativa práctica de CAPTCHA de texto vs CAPTCHA de imagen: comparación de desarrolladores, centrada en diferencias de costo, precisión, velocidad y esfuerzo...

Comparativa práctica de CAPTCHA de texto vs CAPTCHA de imagen: comparación de desarrolladores, centrada en dif...

Apr 30, 2026
Troubleshooting Errores y solución de problemas de Cloudflare Turnstile
Errores frecuentes de Cloudflare Turnstile: códigos de error de la API, fallos de validación, token rechazado y cómo corregir cada problema con Captcha AI.

Errores frecuentes de Cloudflare Turnstile: códigos de error de la API, fallos de validación, token rechazado...

Apr 23, 2026