Ambos presentan imágenes que los usuarios deben seleccionar según un mensaje de texto. Pero BLS CAPTCHA es una implementación personalizada utilizada exclusivamente en los sistemas de visas BLS International, mientras que reCAPTCHA es la solución implementada globalmente de Google. Los enfoques de resolución, los requisitos de integración y los métodos de la API CaptchaAI difieren significativamente.
Comparación lado a lado
| Característica | BLS CAPTCHA | Cuadrícula reCAPTCHA |
|---|---|---|
| Proveedor | BLS Internacional (personalizado) | |
| Formato | Imágenes separadas (3–9) | Imagen única dividida en cuadrícula (3×3 o 4×4) |
| Mosaicos dinámicos | No: conjunto fijo de imágenes | Sí, aparecen nuevas tras cada selección |
| Análisis de comportamiento | Mínimo | Extensivo (ratón, timing, IP) |
| Sistema de puntuación | Ninguno | Análisis de riesgo por solicitud |
| Método API | method=bls |
method=userrecaptcha |
| Parámetros necesarios | instructions, image_base64_1..9 |
googlekey, pageurl |
| Formato de respuesta | Índices de imágenes (ej. 1,3,5) |
Cadena de token |
| Resolución basada en tokens | No: resuelve imágenes directamente | Sí, el método token gestiona la cuadrícula internamente |
| Se requiere navegador | Sí (extraer imágenes del DOM) | Opcional (el método token funciona sin navegador) |
| Dónde se usa | Solo sitios de citas para visa BLS | Millones de sitios en todo el mundo |
| Tiempo típico de resolución | 5-15 segundos | 10-30 segundos |
Resolviendo BLS CAPTCHA con CaptchaAI
BLS requiere extraer cada imagen de la página, codificarlas como base64 y enviarlas con el texto de instrucciones.
Python:
import requests
import base64
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example-bls-site.com/appointment")
# Step 1: Extract instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
# Example: "Select all images with a motorcycle"
# Step 2: Extract and encode each image
images = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
image_data = {}
for i, img in enumerate(images, 1):
# Get image source and convert to base64
src = img.get_attribute("src")
if src.startswith("data:image"):
b64 = src.split(",")[1]
else:
img_bytes = requests.get(src).content
b64 = base64.b64encode(img_bytes).decode()
image_data[f"image_base64_{i}"] = b64
# Step 3: Submit to CaptchaAI
payload = {
"key": "YOUR_API_KEY",
"method": "bls",
"instructions": instruction,
**image_data
}
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload)
task_id = resp.text.split("|")[1]
# Step 4: Poll for result
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
indices = result.text.split("|")[1] # e.g., "1,3,5"
break
# Step 5: Click the correct images
for idx in indices.split(","):
images[int(idx) - 1].click()
time.sleep(0.3) # Small delay between clicks
Nodo.js:
const axios = require("axios");
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto("https://example-bls-site.com/appointment");
// Extract instruction text
const instruction = await page.$eval(
".captcha-instruction",
(el) => el.textContent,
);
// Extract images as base64
const imageElements = await page.$$(".captcha-image img");
const imageData = {};
for (let i = 0; i < imageElements.length; i++) {
const src = await imageElements[i].evaluate((el) => el.src);
let b64;
if (src.startsWith("data:image")) {
b64 = src.split(",")[1];
} else {
const resp = await axios.get(src, { responseType: "arraybuffer" });
b64 = Buffer.from(resp.data).toString("base64");
}
imageData[`image_base64_${i + 1}`] = b64;
}
// Submit to CaptchaAI
const formData = new URLSearchParams({
key: "YOUR_API_KEY",
method: "bls",
instructions: instruction,
...imageData,
});
const submitResp = await axios.post(
"https://ocr.captchaai.com/in.php",
formData.toString(),
);
const taskId = submitResp.data.split("|")[1];
// Poll for result
let indices;
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: "YOUR_API_KEY", action: "get", id: taskId },
});
if (result.data.startsWith("OK|")) {
indices = result.data.split("|")[1];
break;
}
}
// Click correct images
for (const idx of indices.split(",")) {
await imageElements[parseInt(idx) - 1].click();
await new Promise((r) => setTimeout(r, 300));
}
await browser.close();
})();
Resolviendo la cuadrícula reCAPTCHA con CaptchaAI
reCAPTCHA utiliza un enfoque basado en tokens: no es necesaria extracción de imágenes.
Python:
import requests
import time
# Step 1: Extract sitekey from page
# <div class="g-recaptcha" data-sitekey="6Le-wvkS..."></div>
sitekey = "6Le-wvkSAAAAAPBMRTvw..."
page_url = "https://example.com/form"
# Step 2: Submit to CaptchaAI
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# Step 3: Poll for token
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
# Step 4: Inject token (no clicking needed)
# Option A: Hidden field injection
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# Option B: Pure HTTP submission
requests.post(page_url, data={"g-recaptcha-response": token, "other_field": "value"})
Nodo.js:
const axios = require("axios");
async function solveRecaptchaGrid(sitekey, pageUrl) {
// Submit
const submitResp = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: "YOUR_API_KEY",
method: "userrecaptcha",
googlekey: sitekey,
pageurl: pageUrl,
},
});
const taskId = submitResp.data.split("|")[1];
// Poll for token
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: "YOUR_API_KEY", action: "get", id: taskId },
});
if (result.data.startsWith("OK|")) {
return result.data.split("|")[1];
}
}
throw new Error("Solve timed out");
}
Comparación de complejidad de integración
| Aspecto | BLS | Cuadrícula reCAPTCHA |
|---|---|---|
| Extracción de imágenes | Debe extraer cada imagen del DOM manualmente | No es necesario: el método del token se maneja internamente |
| Manejo de instrucciones | Debe extraer instrucciones de texto de la página. | No es necesario |
| Codificación base64 | Requerido para cada imagen | No es necesario |
| Aplicación de solución | Haga clic en imágenes individuales según los índices devueltos | Inyecte token en un campo oculto o HTTP POST |
| Automatización del navegador | Requerido: no hay alternativa sin cabeza | Opcional: puede utilizar solicitudes HTTP puras |
| Recuperación de errores | Vuelva a extraer imágenes en caso de error | Volver a solicitar el token en caso de error |
| resolución concurrente | Limitado: imágenes vinculadas a la sesión del navegador | Fácil: las solicitudes de token no tienen estado |
| Líneas de código (típico) | 40-60 líneas | 15-25 líneas |
Cuándo usar qué solucionador
| Escenario | Enfoque recomendado |
|---|---|
| Reserva de cita para la visa BLS | Utilice method=bls con extracción de imágenes |
| Cualquier sitio con reCAPTCHA | Utilice method=userrecaptcha con la clave del sitio |
| Sitio BLS con reCAPTCHA integrado | Compruebe cuál protege la acción: los sitios BLS a veces usan ambos |
| Captcha de imagen desconocido | Primero verifique si es de la marca BLS; si no, prueba los métodos reCAPTCHA u OCR |
Solución de problemas
| problema | Arreglo BLS | corrección de reCAPTCHA |
|---|---|---|
| Se devolvió la respuesta incorrecta | Verifique que el texto de las instrucciones coincida con lo que muestra la página | Verifique que la clave del sitio y la URL de la página sean correctas |
| Las imágenes no se cargan | Agregue User-Agent y cookies al buscar URL de imágenes |
No aplicable: no hay imágenes para recuperar |
| Token rechazado | Haga clic en los índices en el orden correcto en la página. | Inyectar en g-recaptcha-response Y ejecutar devolución de llamada |
| Resolver demasiado lento | Reduzca el recuento de imágenes: envíe solo imágenes visibles | Utilice proxy cerca del sitio de destino |
Preguntas frecuentes
¿Cuál es más difícil de resolver?
BLS requiere más trabajo de integración (extracción de imágenes, análisis de instrucciones y clics basados en índices), pero las imágenes suelen ser más claras y simples. reCAPTCHA es más fácil de integrar (método de token), pero los desafíos de Google pueden ser más complejos con mosaicos dinámicos.
¿Puedo utilizar el método del token reCAPTCHA para BLS?
No. BLS no es una implementación de reCAPTCHA. Debe utilizar method=bls con imágenes individuales codificadas en base64 y el texto de instrucciones.
¿Ambos utilizan la tecnología de Google?
No. BLS CAPTCHA es una implementación personalizada y patentada creada para los servicios de visas de BLS International. reCAPTCHA es el producto de Google que se utiliza globalmente en millones de sitios web.
¿Qué es más rentable resolver a escala?
Las soluciones de tokens reCAPTCHA son generalmente más rentables para operaciones de gran volumen porque la integración es más simple (sin gastos generales de extracción de imágenes) y puede ejecutar solicitudes sin estado simultáneas. La resolución de BLS requiere una sesión de navegador para cada resolución.
¿Puedo resolver ambos tipos en la misma página?
Sí. Algunos sitios BLS utilizan su CAPTCHA personalizado para la verificación inicial y reCAPTCHA para el envío de formularios. Detecte cada tipo por separado y utilice el método CaptchaAI apropiado para cada uno.
Guías relacionadas
- Cómo resolver BLS CAPTCHA paso a paso
- Cómo resolver reCAPTCHA v2 usando API
- Errores y solución de problemas de BLS CAPTCHA