BLS CAPTCHA presenta una cuadrícula de imágenes de 3×3 con un código de instrucción numérico que especifica qué celdas seleccionar. Este tutorial le muestra cómo resolver BLS CAPTCHA desde Node.js usando elCaptchaAIAPI.
Requisitos previos
| Artículo | Valor |
|---|---|
| Clave API CaptchaAI | Decaptchaai.com |
| Nodo.js | 14+ |
| Biblioteca | axios (npm install axios) |
Cómo funciona BLS CAPTCHA
Una cuadrícula de 3×3 numerada de izquierda a derecha y de arriba a abajo:
1 | 2 | 3
---------
4 | 5 | 6
---------
7 | 8 | 9
Una instrucción numérica (por ejemplo, "664") especifica qué seleccionar. CaptchaAI devuelve los índices de las celdas coincidentes.
Paso 1: extraer imágenes de cuadrícula
const axios = require('axios');
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com/bls-form');
// Get instruction code
const instruction = await page.$eval('.bls-instruction', (el) => el.textContent.trim());
// Get all 9 cell image URLs and convert to base64
const cellImages = await page.$$eval('.bls-grid img', (imgs) =>
imgs.map((img) => img.src)
);
const images = [];
for (const src of cellImages) {
if (src.startsWith('data:')) {
images.push(src);
} else {
const { data } = await axios.get(src, { responseType: 'arraybuffer' });
const b64 = Buffer.from(data).toString('base64');
images.push(`data:image/png;base64,${b64}`);
}
}
Paso 2: enviar a CaptchaAI
const API_KEY = 'YOUR_API_KEY';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const params = new URLSearchParams({
key: API_KEY,
method: 'bls',
instructions: instruction,
json: '1',
});
// Add all 9 images
images.forEach((img, i) => {
params.append(`image_base64_${i + 1}`, img);
});
const { data: submitData } = await axios.post(
'https://ocr.captchaai.com/in.php',
params.toString()
);
if (submitData.status !== 1) throw new Error(submitData.request);
const taskId = submitData.request;
console.log(`Task submitted: ${taskId}`);
Paso 3: consulta para encontrar la solución
await sleep(5000);
let selectedCells;
for (let i = 0; i < 30; i++) {
const { data: pollData } = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: 1 },
});
if (pollData.status === 1) {
selectedCells = JSON.parse(pollData.request);
console.log('Selected cells:', selectedCells);
break;
}
if (pollData.request !== 'CAPCHA_NOT_READY') {
throw new Error(pollData.request);
}
await sleep(5000);
}
Paso 4: haga clic en las celdas correctas
// Click each identified cell
const gridCells = await page.$$('.bls-grid img');
for (const cellNum of selectedCells) {
await gridCells[cellNum - 1].click();
}
// Submit the form
await page.click('.bls-submit');
console.log(`Solved: clicked cells ${JSON.stringify(selectedCells)}`);
await browser.close();
Resultado esperado:
Selected cells: [1, 4, 7, 8]
Solved: clicked cells [1,4,7,8]
Errores comunes
| error | causa | Solución |
|---|---|---|
ERROR_BAD_PARAMETERS |
Faltan imágenes o instrucciones | Envíe las 9 imágenes y el código de instrucción. |
CAPCHA_NOT_READY |
Aún procesando | Sigue consultando cada 5 segundos |
ERROR_ZERO_BALANCE |
Sin fondos | Recarga tu cuenta CaptchaAI |
Preguntas frecuentes
¿BLS CAPTCHA admite cuadrículas de 4×4?
BLS CAPTCHA utiliza cuadrículas de 3×3 (9 celdas). Para cuadrículas de 4×4, utilice el método Imagen de cuadrícula.
¿Qué tan rápido resuelve BLS?
Normalmente entre 5 y 15 segundos.
¿Puedo usar Dramaturgo en lugar de Puppeteer?
Sí. La interacción API es la misma: simplemente cambie las llamadas de automatización del navegador.
Guías relacionadas
- Resolver BLS CAPTCHA con Python
- Cómo resolver BLS CAPTCHA
Comience a resolver BLS CAPTCHA con CaptchaAI →
Configuración recomendada para su pipeline
Use exactamente la misma configuración de navegador en todos sus entornos de QA, staging y CI. Esto evita que un test funcione en local y falle en CI sin razón aparente.
from selenium import webdriver
def make_driver(headless: bool = True) -> webdriver.Chrome:
options = webdriver.ChromeOptions()
if headless:
options.add_argument('--headless=new')
options.add_argument('--window-size=1280,800')
options.add_argument('--lang=es-ES')
return webdriver.Chrome(options=options)
Mantener viewport, idioma y user-agent por defecto idénticos en todos los runners reduce la varianza y facilita comparar resultados entre ejecuciones de su propio QA.
Cómo se integra CaptchaAI en su pipeline propio
El patrón de integración con CaptchaAI siempre es el mismo, independientemente del lenguaje o framework de pruebas que use:
- Su test detecta el widget de CAPTCHA en la página de su propia aplicación (formulario de QA, landing de staging, endpoint de preproducción).
- Su test envía a CaptchaAI los datos públicos del widget (
sitekey, URL de la página, tipo de CAPTCHA). - CaptchaAI devuelve un token válido para esa página.
- Su test inyecta ese token en el campo correspondiente y envía el formulario.
- Su backend verifica el token con el proveedor de CAPTCHA, exactamente igual que con un usuario real.
Este flujo se aplica únicamente a integraciones que usted controla. No se utiliza para sortear protecciones de sitios de terceros.
Métricas y observabilidad
Incluya métricas específicas para los pasos relacionados con CAPTCHA en sus pipelines de QA. Esto le permite detectar regresiones en su propia integración antes de que lleguen a producción:
- Tiempo de resolución por intento — desde la solicitud a CaptchaAI hasta la entrega del token.
- Tasa de éxito por endpoint propio — cuántas verificaciones backend pasan respecto al total de intentos.
- Distribución de errores — agrupados por código (
ERROR_*, timeouts internos, fallos de red). - Latencia extremo a extremo — incluyendo render de la página, resolución de CAPTCHA y respuesta de su backend.
Conserve trazas (logs, capturas, HAR) durante un período razonable para poder reproducir incidentes en su entorno QA cuando un test falle de forma intermitente.
Buenas prácticas en su entorno QA
- Pruebe siempre sobre su propia aplicación o sobre entornos explícitamente autorizados.
- Mantenga una API key de CaptchaAI separada para QA, distinta de la de producción, para no mezclar métricas.
- Defina timeouts y reintentos razonables (
backoffexponencial) para no acumular trabajos pendientes en CaptchaAI durante caídas. - Versione sus snapshots de configuración (sitekey, action, umbrales) junto al código de los tests.
- Revise periódicamente el changelog de su proveedor de CAPTCHA para anticipar cambios que afecten a su propia integración.
Solución de problemas
| Síntoma | Acción recomendada |
|---|---|
| El test no detecta el widget | Revise selectores y tiempos en su entorno staging |
CaptchaAI devuelve ERROR_NO_SLOT_AVAILABLE |
Reintente con backoff en su pipeline interna |
| La validación backend rechaza el token | Compare action/sitekey con su configuración real |
| El test funciona en local pero falla en CI | Iguale viewport, idioma y user-agent en ambos entornos |
| Tiempos de resolución muy variables | Revise concurrencia y límites de su API key de CaptchaAI |
Valide sus integraciones CAPTCHA en entornos propios con CaptchaAI.