Se o seu fluxo automatizado esbarra em um BLS CAPTCHA ou na grade do reCAPTCHA, a decisão de integração cabe em uma frase: o BLS obriga você a extrair e enviar cada imagem, enquanto a grade do reCAPTCHA se resolve por token, sem tocar em nenhuma imagem. Isso define quanto código você escreve e se precisa de um navegador aberto.
Os dois mostram imagens e pedem que o usuário selecione as corretas conforme um texto de instrução — por isso parecem iguais à primeira vista. Mas o BLS CAPTCHA é sob medida, usado só nos sistemas de agendamento de visto da BLS International, e o reCAPTCHA é a solução global do Google.
BLS CAPTCHA e reCAPTCHA lado a lado
| Recurso | BLS CAPTCHA | Grade do reCAPTCHA |
|---|---|---|
| Provedor | BLS International (implementação personalizada) | |
| Formato | Imagens distintas e separadas (3–9) | Imagem única dividida em grade (3×3 ou 4×4) |
| Blocos dinâmicos | Não — conjunto fixo de imagens | Sim — novos blocos surgem após a seleção |
| Análise comportamental | Mínima | Ampla (mouse, tempo, IP) |
| Sistema de pontuação | Nenhum | Análise de risco a cada requisição |
| Método da API | method=bls |
method=userrecaptcha |
| Parâmetros necessários | instructions, image_base64_1..9 |
googlekey, pageurl |
| Formato da resposta | Índices das imagens (ex.: 1,3,5) |
Cadeia de token |
| Resolução por token | Não — resolve as imagens diretamente | Sim — o token cuida da grade internamente |
| Navegador necessário | Sim (extrai as imagens do DOM) | Opcional (o token funciona sem navegador) |
| Onde aparece | Apenas portais de agendamento de visto da BLS | Milhões de sites no mundo todo |
| Tempo de resolução típico | 5–15 segundos | 10–30 segundos |
Qual método escolher para cada situação
A regra é direta: BLS é sempre extração de imagens; reCAPTCHA é sempre token. E o volume não pesa no custo — em qualquer plano da CaptchaAI você paga por threads simultâneas, a partir do BASIC (US$ 15/mês, 5 threads), não por resolução.
- Agendamento de visto no BLS:
method=blscom extração de imagens. - Qualquer site com reCAPTCHA:
method=userrecaptchacom a sitekey. - Site BLS com reCAPTCHA embutido: veja qual dos dois protege a ação — portais BLS às vezes usam os dois.
- CAPTCHA de imagem desconhecido: confirme antes se é da marca BLS; se não for, tente os métodos reCAPTCHA ou OCR.
Esforço de integração: quantas etapas cada um exige
O token do reCAPTCHA elimina três etapas que o BLS exige: extração, codificação e cliques por índice.
| Aspecto | BLS | Grade do reCAPTCHA |
|---|---|---|
| Extração de imagem | Extrai cada imagem do DOM manualmente | Não é necessário — o token cuida disso |
| Tratamento das instruções | Extrai o texto de instrução da página | Não é necessário |
| Codificação base64 | Obrigatória para todas as imagens | Não é necessário |
| Aplicação da solução | Clicar nas imagens pelos índices retornados | Injetar o token no campo oculto ou via HTTP POST |
| Automação de navegador | Obrigatória — não há alternativa em modo headless | Opcional — dá para usar requisições HTTP puras |
| Recuperação de erros | Reextrair as imagens em caso de falha | Solicitar um novo token em caso de falha |
| Resolução simultânea | Limitada — imagens presas à sessão do navegador | Fácil — as requisições de token não têm estado |
| Linhas de código (típico) | 40–60 linhas | 15–25 linhas |
Resolvendo o BLS CAPTCHA com a CaptchaAI
O BLS não entrega token. Você captura cada imagem da página, converte para base64 e envia com o texto de instrução. A resposta vem como índices (ex.: 1,3,5), e o código clica nas imagens na ordem certa.
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
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 a grade do reCAPTCHA com a CaptchaAI
O reCAPTCHA segue o caminho oposto: a CaptchaAI parte da sitekey e do endereço da página e devolve um token pronto. Você injeta esse token no campo g-recaptcha-response ou o envia por HTTP, sem extrair imagens.
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"})
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");
}
Onde você encontra cada CAPTCHA no dia a dia
No Brasil e em Portugal, muita gente cruza com o BLS CAPTCHA pela primeira vez em fluxos de agendamento de visto — a BLS International opera esses portais. Já o reCAPTCHA está em quase todo formulário público.
- BLS: portais de agendamento de visto, com imagens e instruções próprias.
- reCAPTCHA: cadastro, login e finalização de compra em milhões de sites.
Num projeto de QA autorizado, validar um fluxo BLS exige preparar a extração de imagens desde o início. Ao coletar dados, considere a LGPD (ou o RGPD, em Portugal) e trabalhe sempre em staging ou ambiente próprio.
Erros comuns e como corrigir
| Problema | Correção no BLS | Correção no reCAPTCHA |
|---|---|---|
| Resposta errada retornada | Confira se o texto de instrução bate com o que a página mostra | Confirme se a sitekey e o pageurl estão corretos |
| Imagens não carregam | Adicione User-Agent e cookies ao buscar as URLs das imagens |
Não se aplica — não há imagens para buscar |
| Token recusado | Clique nos índices na ordem certa da página | Injete em g-recaptcha-response e execute o callback |
| Resolução muito lenta | Reduza a quantidade de imagens — envie só as visíveis | Use um proxy próximo ao site de destino |
Perguntas frequentes
Como sei se o CAPTCHA da página é BLS ou reCAPTCHA?
Olhe o DOM. O reCAPTCHA geralmente aparece como uma <div class="g-recaptcha" data-sitekey="..."> e carrega recursos do Google. O BLS não tem sitekey nem widget do Google: são imagens soltas com instrução própria.
Preciso de um navegador para resolver a grade do reCAPTCHA?
Não. O método por token funciona com requisições HTTP puras: você envia a sitekey e o pageurl e recebe o token. O navegador só é indispensável no BLS, para extrair as imagens.
Por que o BLS exige codificar as imagens em base64?
Porque não existe token do lado do BLS. A CaptchaAI precisa ver as próprias imagens, então cada uma vai como base64 com o texto de instrução. A resposta volta como índices para o seu código clicar.
Posso tratar os dois tipos no mesmo fluxo?
Sim. Alguns portais BLS usam o CAPTCHA próprio na verificação inicial e o reCAPTCHA no envio do formulário. Detecte cada tipo e chame o método adequado da CaptchaAI para cada etapa.
Guias relacionados
- Como resolver o BLS CAPTCHA passo a passo — o passo a passo completo da integração BLS
- Como resolver o reCAPTCHA v2 pela API — tutorial completo do reCAPTCHA v2
- Como funciona o desafio de grade do reCAPTCHA — a mecânica por trás da grade
- Erros comuns e solução de problemas no BLS CAPTCHA — correções de erros específicos do BLS