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.
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
- 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.
- 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.
- 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 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.
- 01Carga la página
Abre el sitio de destino con el proxy y el user agent desde los que vas a enviar.
- 02Lee la sitekey
Usa find_element con [data-sitekey] y lee el atributo, además de data-callback si existe.
- 03Resuelve
Envía por POST type, sitekey y driver.current_url a /v1/solve?wait=60 con el mismo proxy y user agent.
- 04Inyecta 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.
Dónde suelen fallar las integraciones
Muchas páginas habilitan el botón de envío desde el callback del widget. Rellenar solo el campo deja el botón deshabilitado.
El textarea de respuesta se crea cuando se renderiza el widget. Espera al iframe del widget antes de inyectar.
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 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.
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.