Solución de Problemas

Errores y solución de problemas de BLS CAPTCHA

Cuando la resolución del BLS CAPTCHA falla, el problema casi nunca está en el motor de CaptchaAI: está en cómo tu código extrae y envía las imágenes. El BLS CAPTCHA usa una implementación propia —imágenes generadas por sesión, instrucciones en varios idiomas y una ventana de validez corta—, así que un solo detalle mal resuelto rompe todo el flujo.

Es un tema especialmente relevante para quienes automatizan pruebas y monitoreo sobre portales BLS de visado, que atienden a buena parte de los solicitantes latinoamericanos y de habla hispana. Ahí un fallo silencioso en la extracción se traduce en tareas rechazadas una tras otra, sin un mensaje claro que apunte a la causa. Esta guía recorre los errores en el mismo orden en que aparecen en el pipeline, con la causa y la corrección de cada uno.


Empieza por aquí: triage rápido

Antes de leer sección por sección, recorre esta tabla de arriba abajo. La mayoría de los fallos del BLS CAPTCHA se resuelven en uno de estos siete puntos, y comprobarlos te ahorra abrir un ticket.

Verificación Acción
¿Instrucciones extraídas? Imprime y comprueba el texto de las instrucciones.
¿Imágenes válidas? Guarda el base64 en un archivo y ábrelo para verificarlo.
¿El número de imágenes es correcto? Compara las imágenes enviadas con las que se muestran.
¿El orden de las imágenes es correcto? Verifica que el orden del DOM coincida con el orden en pantalla.
¿Prefijo base64 eliminado? Quita data:image/...;base64,.
¿Formato de la solución? Analiza los índices basados en 1 separados por comas.
¿Conversión de índice? Resta 1 para acceder al arreglo basado en 0.

Errores al enviar el BLS CAPTCHA a la API

Este es el primer punto donde suele romperse el flujo: el envío llega a CaptchaAI, pero incompleto o mal formado.

ERROR_BAD_PARAMETERS

Causa: falta algún parámetro obligatorio en el envío.

  • Confirma que incluyes instructions con el texto exacto del desafío.
  • Envía al menos una imagen en image_base64_1.
  • Mantén siempre method=bls y tu key.
# WRONG — missing instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY, "method": "bls",
    "image_base64_1": img1, "json": 1
})

# CORRECT — include instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY, "method": "bls",
    "instructions": "Select all images with a car",
    "image_base64_1": img1, "json": 1
})

ERROR_WRONG_FILE_EXTENSION

Causa: los datos de la imagen no son base64 válido o vienen en un formato no compatible.

  • Asegúrate de que las imágenes sean PNG o JPEG codificadas en base64.
  • Elimina el prefijo data:image/...;base64,.
  • Comprueba que la cadena base64 no esté truncada.
import base64

# Strip the data URI prefix
src = img_element.get_attribute("src")
if src.startswith("data:image"):
    b64 = src.split(",")[1]
else:
    # Download and encode
    img_data = requests.get(src).content
    b64 = base64.b64encode(img_data).decode()

ERROR_CAPTCHA_UNSOLVABLE

Causa: las imágenes son de muy baja calidad, están borrosas o las instrucciones resultan ambiguas.

  • Captura las imágenes a máxima resolución.
  • Verifica que el texto de las instrucciones se extraiga completo y sin recortes.
  • Reintenta: algunos desafíos son intrínsecamente más difíciles y salen en un segundo intento.

Consejo: guarda cada imagen en disco antes de enviarla. Un ERROR_CAPTCHA_UNSOLVABLE que se repite casi siempre delata una extracción defectuosa, no un límite de CaptchaAI.


Problemas al extraer las imágenes del navegador

Muchos errores que parecen de "envío" nacen en realidad aquí: si el DOM no tiene lo que esperas, todo lo demás falla en cascada.

Las imágenes se cargan de forma dinámica

Problema: las imágenes no están en el DOM cuando la página carga por primera vez.

Solución: espera a que el CAPTCHA termine de renderizarse antes de leer nada.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Wait for captcha images to load
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".captcha-image img"))
)

Las imágenes son lienzos, no elementos img

Problema: algunas implementaciones de BLS dibujan las imágenes en elementos <canvas>.

Solución: extrae los datos del lienzo como base64.

canvas_elements = driver.find_elements(By.CSS_SELECTOR, ".captcha-canvas")
for i, canvas in enumerate(canvas_elements, 1):
    b64 = driver.execute_script(
        "return arguments[0].toDataURL('image/png').split(',')[1];",
        canvas
    )
    payload[f"image_base64_{i}"] = b64

Imágenes protegidas contra hotlinking

Problema: las URL de las imágenes devuelven 403 cuando se descargan fuera del navegador.

Solución: extrae las imágenes dentro del propio contexto del navegador.

# Get image data from within the browser
b64 = driver.execute_script("""
    var img = arguments[0];
    var canvas = document.createElement('canvas');
    canvas.width = img.naturalWidth;
    canvas.height = img.naturalHeight;
    canvas.getContext('2d').drawImage(img, 0, 0);
    return canvas.toDataURL('image/png').split(',')[1];
""", img_element)

Regla práctica: si una imagen se ve bien en el navegador pero da 403 al descargarla por separado, extráela siempre desde el contexto del navegador.


Errores al aplicar la solución en el formulario

Aquí CaptchaAI ya devolvió una respuesta correcta, pero tu código la interpreta o la aplica mal.

Se seleccionan las imágenes equivocadas

Causa: el orden de las imágenes no coincide entre la extracción y lo que se muestra en pantalla.

Solución: mantén un orden consistente de principio a fin.

# Ensure images are indexed in display order
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
# The order of find_elements matches DOM order = display order
for i, img in enumerate(captcha_imgs, 1):
    payload[f"image_base64_{i}"] = extract_base64(img)

Los índices de la solución no cuadran

Causa: CaptchaAI devuelve índices que empiezan en 1, pero tu código accede a los arreglos empezando en 0.

Solución: convierte cada índice antes de usarlo.

solution = result["request"]  # e.g., "1,3,5"
indices = [int(i) for i in solution.split(",")]

# Convert to 0-based for array access
for idx in indices:
    captcha_imgs[idx - 1].click()  # 1-based → 0-based

El formulario falla tras seleccionar bien las imágenes

Causa: faltan tokens o campos de formulario adicionales que deben enviarse junto al CAPTCHA.

Solución: localiza los campos ocultos que viajan con el envío.

# Look for hidden captcha tokens
hidden_fields = driver.find_elements(By.CSS_SELECTOR, "input[type='hidden']")
for field in hidden_fields:
    name = field.get_attribute("name")
    value = field.get_attribute("value")
    print(f"Hidden field: {name}={value}")

Errores por caducidad del BLS CAPTCHA

El BLS CAPTCHA tiene una ventana de validez corta, así que la velocidad importa tanto como la corrección.

El CAPTCHA caduca antes de terminar

Problema: el desafío expira mientras aún esperas la solución.

  • Extrae las imágenes y envíalas a CaptchaAI de inmediato.
  • No extraigas las imágenes para luego esperar antes de enviarlas.
  • Si la resolución tarda más de 60 segundos, es probable que ya haya caducado: refresca y vuelve a intentarlo.

El reloj empieza al generarse el CAPTCHA, no al enviarlo. Extrae y envía en la misma pasada, sin pausas intermedias.

El sondeo tarda demasiado

Solución: consulta el resultado con el patrón correcto.

# Standard polling pattern
for _ in range(30):  # 30 attempts × 5 seconds = 150 seconds max
    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:
        return result["request"]
    if result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
        # Don't keep polling — start over
        raise Exception("Unsolvable")

Preguntas frecuentes

Estas son las dudas que más aparecen cuando el BLS CAPTCHA deja de resolverse en producción.

¿ERROR_BAD_PARAMETERS siempre significa que faltan las instrucciones?

No siempre. Es la causa más habitual, pero el mismo error aparece si falta cualquier parámetro obligatorio: la key, el method=bls o al menos una imagen. Registra el payload completo antes de enviarlo y compáralo campo por campo.

¿Cómo sé si el problema está en la extracción o en la resolución?

Guarda cada base64 en un archivo y ábrelo. Si la imagen se ve bien, el fallo está en la resolución o en cómo aplicas los índices; si sale en negro, truncada o vacía, el problema es la extracción y ahí debes concentrarte.

¿Qué timeout de sondeo debería configurar para BLS?

Un límite de unos 150 segundos (30 intentos con 5 segundos entre consultas) cubre la mayoría de los casos. Como el CAPTCHA caduca rápido, si superas ese margen conviene abandonar la tarea, refrescar el desafío y empezar de nuevo en lugar de seguir sondeando.

¿CaptchaAI resuelve instrucciones que no están en inglés?

Sí. Envía el texto exactamente como aparece en pantalla, sin traducirlo ni reescribirlo. CaptchaAI interpreta instrucciones en varios idiomas, así que reformularlas por tu cuenta solo introduce ruido.


Guías relacionadas

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