undetected-chromedriver es una biblioteca de Python que gestiona la compatibilidad de versiones de ChromeDriver para Selenium. Cuando un sitio presenta un CAPTCHA durante la automatización, CaptchaAI lo resuelve y devuelve un token que usted inyecta en la página.
Esta guía muestra cómo combinar ambas herramientas: use undetected-chromedriver para la automatización del navegador con Selenium y CaptchaAI para resolver cualquier CAPTCHA que aparezca.
lo que necesitas
| Requisito | Detalles |
|---|---|
| Clave API CaptchaAI | captchaai.com |
| Python 3.8+ | |
| Navegador Chrome | Instalado en su sistema |
Instalar dependencias:
pip install undetected-chromedriver requests
Configuración básica
import undetected_chromedriver as uc
import requests
import time
def create_browser():
"""Create a Chrome browser instance."""
options = uc.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
driver = uc.Chrome(options=options)
return driver
Resolviendo reCAPTCHA v2 con Selenium y CaptchaAI
Paso 1: navegue y extraiga la clave del sitio
API_KEY = "YOUR_API_KEY"
def extract_recaptcha_sitekey(driver):
"""Extract reCAPTCHA v2 sitekey from the page."""
try:
element = driver.find_element("css selector", "[data-sitekey]")
return element.get_attribute("data-sitekey")
except Exception:
# Try finding in iframe src
iframes = driver.find_elements("css selector", "iframe[src*='recaptcha']")
for iframe in iframes:
src = iframe.get_attribute("src")
if "k=" in src:
return src.split("k=")[1].split("&")[0]
return None
Paso 2: Resuelve con CaptchaAI
def solve_recaptcha_v2(sitekey, pageurl):
"""Submit reCAPTCHA v2 to CaptchaAI and return the token."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(20)
for _ in range(30):
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:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
Paso 3: inyecta el token y envíalo
def inject_recaptcha_token(driver, token):
"""Inject the solved token into the page and submit."""
driver.execute_script(f'''
document.getElementById("g-recaptcha-response").innerHTML = "{token}";
document.getElementById("g-recaptcha-response").style.display = "block";
''')
# If there's a callback function, trigger it
driver.execute_script(f'''
if (typeof ___grecaptcha_cfg !== 'undefined') {{
var clients = ___grecaptcha_cfg.clients;
for (var key in clients) {{
var client = clients[key];
if (client && client.callback) {{
client.callback("{token}");
}}
}}
}}
''')
Flujo de trabajo completo: inicie sesión con reCAPTCHA
import undetected_chromedriver as uc
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha(sitekey, pageurl):
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": pageurl, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(20)
for _ in range(30):
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:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
def main():
driver = uc.Chrome()
try:
# Navigate to target page
driver.get("https://staging.example.com/qa-login")
time.sleep(3)
# Fill in form fields
driver.find_element("id", "username").send_keys("user")
driver.find_element("id", "password").send_keys("pass")
# Extract sitekey
element = driver.find_element("css selector", "[data-sitekey]")
sitekey = element.get_attribute("data-sitekey")
pageurl = driver.current_url
print(f"Sitekey: {sitekey}")
# Solve CAPTCHA
token = solve_recaptcha(sitekey, pageurl)
print(f"Token: {token[:50]}...")
# Inject token
driver.execute_script(
f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)
# Submit form
driver.find_element("id", "submit-btn").click()
time.sleep(3)
print(f"Current URL: {driver.current_url}")
finally:
driver.quit()
if __name__ == "__main__":
main()
Resolviendo Cloudflare Turnstile
Para sitios con widgets Cloudflare Turnstile, extraiga la clave del sitio y resuelva mediante el método Turnstile:
def solve_turnstile(sitekey, pageurl):
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "turnstile",
"sitekey": sitekey, "pageurl": pageurl, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(10)
for _ in range(30):
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:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
# Inject Turnstile token
def inject_turnstile_token(driver, token):
driver.execute_script(f'''
var input = document.querySelector('[name="cf-turnstile-response"]');
if (input) input.value = "{token}";
''')
Solución de problemas
| Problema | causa | Solución |
|---|---|---|
| La versión de Chrome no coincide | UC no puede encontrar el controlador correspondiente | Actualice Chrome o especifique version_main en uc.Chrome() |
| CAPTCHA todavía aparece | El sitio requiere resolución de CAPTCHA | Integre CaptchaAI para resolver cualquier CAPTCHA automáticamente. |
| La inyección de token falla | ID de elemento incorrecto o devolución de llamada | Verifique la implementación reCAPTCHA de la página |
WebDriverException |
Chrome falló | Añadir --no-sandbox y --disable-dev-shm-usage |
Preguntas frecuentes
¿Por qué utilizar el controlador Chrome no detectado con CaptchaAI?
Chromedriver no detectado reduce las señales de detección de bots, por lo que aparecen menos CAPTCHA. Cuando los CAPTCHA todavía se activan, CaptchaAI los resuelve. La combinación proporciona la mayor tasa de éxito.
¿Funciona el controlador de cromo no detectado en modo sin cabeza?
Sí, pero el modo sin cabeza puede activar más CAPTCHA. Utilice options.add_argument("--headless=new") para el nuevo modo sin cabeza de Chrome.
¿Puedo usar esto con Selenium Grid?
Sí, pero el controlador cromado no detectado necesita parchear el binario del controlador local. Para configuraciones distribuidas, aplique parches previos al controlador en cada nodo.
¿Qué pasa si el sitio detecta automatización a pesar de las UC?
Algunos sitios utilizan detección avanzada más allá de los parches de UC. CaptchaAI maneja los CAPTCHA resultantes independientemente del método de detección.
Agregue CaptchaAI a la automatización de su navegador
Obtenga su clave API encaptchaai.com. Combine la automatización del navegador con la resolución confiable de CAPTCHA con CaptchaAI.
Guías relacionadas
- Cómo resolver reCAPTCHA v2 usando API
- Cómo resolver Cloudflare Turnstile usando API
- Puppeteer + CaptchaAI
- Chrome en modo headless o con cabeza para resolver CAPTCHA