CaptchaNo
[ INTEGRACIÓN ]

Solucionador de captchas para
Selenium

Resuelve el desafío dentro de la ejecución en lugar de dejar que falle el trabajo. Un ejemplo funcional en Python y las tres cosas que deciden si se acepta tu token.

Selenium · Python
import time
import requests

CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}

def solve(task: dict) -> dict:
    """Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
    r = requests.post(
        "https://api.captchano.com/v1/solve",
        params={"wait": 60},
        json=task,
        headers=HEADERS,
        timeout=75,
    )
    data = r.json()
    # A solve can outlast the 60 s wait: poll the task until it finishes.
    while data.get("status") in ("queued", "solving"):
        time.sleep(5)
        data = requests.get(
            f"https://api.captchano.com/v1/task/{data['id']}",
            headers=HEADERS,
            timeout=30,
        ).json()
    if data.get("status") != "ready":
        raise RuntimeError(data.get("error") or data)
    return data["solution"]

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com/login")

sitekey = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey")
solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": driver.current_url})

driver.execute_script(
    "document.getElementById('g-recaptcha-response').value = arguments[0]",
    solution["token"],
)
driver.find_element(By.CSS_SELECTOR, "form").submit()

Qué decide si se acepta el token

  1. Pasa tu proxy. El token debe generarse detrás de la misma IP de salida que lo envía. En los sistemas que evalúan la sesión esto es obligatorio, no una optimización.
  2. Usa el mismo user agent. Turnstile y varios sistemas antibot vinculan el token a un user agent. Te devolvemos el que se usó para que puedas reproducirlo exactamente.
  3. Pídelo tarde. Los tokens caducan en unos 120 segundos. Solicita uno cuando estés listo para enviar.

Bloqueante o con sondeo

El ejemplo usa ?wait=60, así que la llamada devuelve la resolución terminada y tu paso de Selenium sigue siendo lineal. Si prefieres no mantener una conexión abierta, quita el parámetro, guarda el id devuelto y consulta GET /v1/task/{id} cada cinco segundos. Un token que ya pagaste se puede recuperar durante diez minutos, así que una conexión caída no te hace perder la resolución.

Costo

$0.00598 por cada resolución exitosa de reCAPTCHA v2; las resoluciones fallidas nunca se cobran. Consulta los precios de cada tipo de desafío o la referencia de la API para ver la estructura completa de la solicitud.

[ CÓMO ENCAJA ]

Cómo encaja la resolución en Selenium

Selenium controla un navegador real, así que el desafío se muestra exactamente como lo vería un usuario. Lee la sitekey del DOM, solicita un token y escríbelo de vuelta con execute_script antes de hacer clic en enviar.

  1. 01
    Carga la página

    Abre el sitio de destino con el proxy y el user agent desde los que vas a enviar.

  2. 02
    Lee la sitekey

    Usa find_element con [data-sitekey] y lee el atributo, además de data-callback si existe.

  3. 03
    Resuelve

    Envía por POST type, sitekey y driver.current_url a /v1/solve?wait=60 con el mismo proxy y user agent.

  4. 04
    Inyecta y envía

    Usa execute_script para rellenar el campo de respuesta y disparar el callback, y luego haz clic en enviar.

Cómo meter el token en la página

driver.execute_script rellena el campo oculto g-recaptcha-response o cf-turnstile-response y, si la página usa uno, llama al callback del widget.

[ ERRORES COMUNES ]

Dónde suelen fallar las integraciones

El callback nunca se disparó

Muchas páginas habilitan el botón de envío desde el callback del widget. Rellenar solo el campo deja el botón deshabilitado.

No se encuentra el campo oculto

El textarea de respuesta se crea cuando se renderiza el widget. Espera al iframe del widget antes de inyectar.

Proxy distinto

El proxy de Selenium se configura al iniciar el driver. Pasa la misma cadena de proxy a la resolución para que el token y el envío compartan IP.

[ PREGUNTAS FRECUENTES ]

Preguntas frecuentes sobre captchas en Selenium

¿Puede Selenium resolver reCAPTCHA por sí solo?

No. Selenium controla el navegador, pero no puede responder un desafío de imágenes, y a los navegadores automatizados es más probable que se les muestre uno. Solicitas un token a una API de resolución y lo inyectas, como hace el ejemplo de esta página.

¿Funciona con undetected-chromedriver o Selenium Grid?

Sí. La integración solo lee el DOM y ejecuta JavaScript, así que funciona con cualquier sesión de WebDriver, local o remota, siempre que pases el mismo proxy y user agent a la resolución.

¿Dónde pongo el token de Turnstile?

Turnstile usa un input oculto llamado cf-turnstile-response dentro del formulario. Asigna su valor y llama al callback indicado en data-callback si la página declara uno.

¿Cómo manejo un captcha que solo aparece a veces?

Comprueba si está el widget después de cada navegación y llama a la API solo cuando esté presente. Se te cobra por resolución exitosa, así que comprobarlo no cuesta nada.

[ LEE A CONTINUACIÓN ]

Guías útiles

¿Listo para construir?

Empieza con una prueba gratuita de 3 días y luego paga por cada resolución exitosa a medida que crece tu tráfico. No necesitas tarjeta para la prueba.

Ver nuestros planes
¿Eres un agente de IA? Consulta las opciones de configuración →