Comparisons

BLS CAPTCHA vs grade reCAPTCHA: diferenças e como resolver

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) Google
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=bls com extração de imagens.
  • Qualquer site com reCAPTCHA: method=userrecaptcha com 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

Os comentários estão desativados para este artigo.