Ambos apresentam imagens que os usuários devem selecionar com base em um prompt de texto. Mas o BLS CAPTCHA é uma implementação personalizada usada exclusivamente nos sistemas de vistos BLS International, enquanto o reCAPTCHA é a solução implantada globalmente pelo Google. As abordagens de resolução, os requisitos de integração e os métodos da API CaptchaAI diferem significativamente.
Comparação lado a lado
| Recurso | BLS CAPTCHA | Grade reCAPTCHA |
|---|---|---|
| Provedor | BLS Internacional (personalizado) | |
| Formato | Separe imagens distintas (3-9) | Imagem única dividida em grade (3×3 ou 4×4) |
| Blocos dinâmicos | Não – conjunto fixo de imagens | Sim – novos blocos aparecem gradualmente após a seleção |
| Análise comportamental | Mínimo | Extenso (mouse, temporização, IP) |
| Sistema de pontuação | Nenhum | Análise de risco em cada solicitação |
| Método API | method=bls |
method=userrecaptcha |
| Parâmetros necessários | instructions, image_base64_1..9 |
googlekey, pageurl |
| Formato de resposta | Índices de imagem (por exemplo, 1,3,5) |
Sequência de token |
| Solução baseada em token | Não – deve resolver as imagens diretamente | Sim – o método token lida com a grade internamente |
| Navegador necessário | Sim (deve extrair imagens do DOM) | Opcional (o método token funciona sem navegador) |
| Onde usado | Apenas sites de agendamento de visto BLS | Milhões de sites em todo o mundo |
| Tempo de resolução típico | 5-15 segundos | 10-30 segundos |
Resolvendo BLS CAPTCHA com CaptchaAI
O BLS requer extrair cada imagem da página, codificá-las como base64 e enviá-las com o texto de instrução.
Píton:
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
Node.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();
})();
Resolvendo grade reCAPTCHA com CaptchaAI
O reCAPTCHA usa uma abordagem baseada em token – sem necessidade de extração de imagem.
Píton:
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"})
Node.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");
}
Comparação de complexidade de integração
| Aspecto | BLS | Grade reCAPTCHA |
|---|---|---|
| Extração de imagem | Deve extrair cada imagem do DOM manualmente | Não é necessário — o método token trata internamente |
| Tratamento de instruções | Deve extrair instruções de texto da página | Não é necessário |
| Codificação Base64 | Obrigatório para todas as imagens | Não é necessário |
| Aplicação de solução | Clique em imagens individuais por índices retornados | Injetar token em campo oculto ou HTTP POST |
| Automação do navegador | Obrigatório - sem alternativa modo headless | Opcional – pode usar solicitações HTTP puras |
| Recuperação de erros | Extraia novamente as imagens em caso de falha | Solicitar novamente o token em caso de falha |
| Resolução simultânea | Limitado – imagens vinculadas à sessão do navegador | Fácil – as solicitações de token não têm estado |
| Linhas de código (típico) | 40-60 linhas | 15-25 linhas |
Quando usar qual solucionador
| Cenário | Abordagem recomendada |
|---|---|
| Reserva de visto BLS | Use method=bls com extração de imagem |
| Qualquer site com reCAPTCHA | Use method=userrecaptcha com sitekey |
| Site BLS com reCAPTCHA incorporado | Verifique qual deles protege a ação – os sites BLS às vezes usam ambos |
| Captcha de imagem desconhecido | Verifique primeiro se é da marca BLS; caso contrário, tente os métodos reCAPTCHA ou OCR |
Solução de problemas
| Problema | Correção de BLS | correção reCAPTCHA |
|---|---|---|
| Resposta errada retornada | Verifique se o texto das instruções corresponde ao que a página mostra | Verifique se a chave do site e o pageurl estão corretos |
| Imagens não carregando | Adicione User-Agent e cookies ao buscar URLs de imagens |
Não aplicável — não há imagens para buscar |
| Token rejeitado | Clique nos índices na ordem correta na página | Injete em g-recaptcha-response E execute o retorno de chamada |
| Resolva muito devagar | Reduza a contagem de imagens – envie apenas imagens visíveis | Use proxy próximo ao site de destino |
Perguntas frequentes
O que é mais difícil de resolver?
O BLS requer mais trabalho de integração (extração de imagens, análise de instruções e cliques baseados em índice), mas as imagens geralmente são mais claras e simples. O reCAPTCHA é mais fácil de integrar (método token), mas os desafios do Google podem ser mais complexos com blocos dinâmicos.
Posso usar o método de token reCAPTCHA para BLS?
Não. O BLS não é uma implementação do reCAPTCHA. Você deve usar method=bls com imagens individuais codificadas em base64 e o texto de instruções.
Ambos usam a tecnologia do Google?
Não. BLS CAPTCHA é uma implementação personalizada e proprietária desenvolvida para serviços de visto BLS International. O reCAPTCHA é um produto do Google usado globalmente em milhões de sites.
O que é mais econômico para resolver em escala?
As soluções de token reCAPTCHA geralmente são mais econômicas para operações de alto volume porque a integração é mais simples (sem sobrecarga de extração de imagem) e você pode executar solicitações simultâneas sem estado. A resolução BLS requer uma sessão do navegador para cada solução.
Posso resolver os dois tipos na mesma página?
Sim. Alguns sites BLS usam CAPTCHA personalizado para verificação inicial e reCAPTCHA para envio de formulário. Detecte cada tipo separadamente e use o método CaptchaAI apropriado para cada um.
Guias relacionados
- Como resolver BLS CAPTCHA passo a passo— passo a passo completo da integração BLS
- Como resolver reCAPTCHA v2 usando API- tutorial completo do reCAPTCHA v2
- Desafio da grade reCAPTCHA explicado— como funcionam os desafios da rede
- Erros e solução de problemas do BLS Captcha— Correções de erros específicos do BLS