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
instructionscon el texto exacto del desafío. - Envía al menos una imagen en
image_base64_1. - Mantén siempre
method=blsy tukey.
# 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_UNSOLVABLEque 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
- Cómo resolver el BLS CAPTCHA paso a paso y referencia de códigos de error de CaptchaAI.