Use Cases

BLS CAPTCHA em Portais Governamentais: Estratégias de Tratamento

Quem agenda vistos ou protocola documentos em portais de governo — BLS International é um dos mais comuns, usado para vistos Schengen, do Reino Unido e dos EUA — esbarra cedo ou tarde no BLS CAPTCHA, que protege horários escassos e trava scripts pensados só para reCAPTCHA. A API da CaptchaAI resolve esse desafio com alta taxa de sucesso, e instructions separa um script genérico de um que funciona nesses portais.

Como identificar um desafio BLS CAPTCHA

O BLS CAPTCHA não segue um padrão visual único — o mesmo portal alterna entre formatos:

  • Desafios de imagem com texto distorcido
  • Expressões matemáticas
  • Seleção personalizada de imagens
  • Quebra-cabeças baseados em texto

Cada variante exige um instructions específico — é esse parâmetro, mais que o tipo de imagem, que decide se a resposta volta certa.

Onde o BLS CAPTCHA aparece nos portais de agendamento

O desafio aparece nos pontos em que o portal mais quer barrar automação:

  • Agendamento de visto — antes da escolha do horário: impede a captura automática de vagas.
  • Envio de documentos — antes do upload: confirma interação humana.
  • Consulta de status — antes de exibir o status: limita consultas automatizadas.
  • Formulários de inscrição — antes do envio: impede submissões automatizadas.

Perguntas frequentes

Antes de meter a mão no código, vale resolver as dúvidas mais comuns.

O que diferencia o BLS CAPTCHA de um reCAPTCHA ou Turnstile comum?

Não é um widget padronizado: cada portal define seu próprio desafio, e a API usa instructions para interpretar cada variante.

Quanto tempo leva para resolver um BLS CAPTCHA com a API da CaptchaAI?

A resolução em si fica abaixo de 1 segundo; o tempo de ponta a ponta depende de carregar a imagem e reenviar o formulário. Prefira requests.Session() ao Puppeteer sempre que o portal não exigir JavaScript.

Um plano com mais threads ajuda a agendar vários horários em paralelo?

Sim. Mais threads resolvem mais desafios em paralelo sem fila interna — planos como ADVANCE (US$ 90/mês, 50 threads) fazem sentido para quem agenda em volume; o rate limit do portal vira o limite real.

Como resolver o BLS CAPTCHA com a API da CaptchaAI

Três etapas: capturar a imagem, enviar para a API e reaproveitar a resposta no formulário.

Passo 1: capturar a imagem do CAPTCHA e as instruções

import requests
from bs4 import BeautifulSoup
import base64

session = requests.Session()

# Load the portal page
page = session.get("https://portal.example.gov/appointment")
soup = BeautifulSoup(page.text, "html.parser")

# Find the CAPTCHA image
captcha_img = soup.select_one("img#captcha-image, img.captcha")
captcha_url = captcha_img["src"]

# Download the CAPTCHA image
if captcha_url.startswith("data:"):
    # Base64 encoded inline image
    img_data = captcha_url.split(",")[1]
else:
    # URL-referenced image
    img_response = session.get(captcha_url)
    img_data = base64.b64encode(img_response.content).decode()

Passo 2: enviar a imagem para a CaptchaAI

import time

def solve_bls_captcha(image_base64, instructions=""):
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": "YOUR_API_KEY",
        "method": "base64",
        "body": image_base64,
        "instructions": instructions,
        "json": 1
    })
    task_id = resp.json()["request"]

    for _ in range(30):
        time.sleep(3)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": "YOUR_API_KEY",
            "action": "get",
            "id": task_id,
            "json": 1
        })
        data = result.json()
        if data["status"] == 1:
            return data["request"]
    raise TimeoutError("BLS solve timed out")

# Solve
captcha_answer = solve_bls_captcha(img_data)

Passo 3: enviar o formulário com a resposta

# Find form fields
form_data = {
    "captcha_response": captcha_answer,
    "appointment_type": "visa",
    "location": "embassy-city",
    # ... other form fields
}

# Submit with the same session (cookies preserved)
result = session.post(
    "https://portal.example.gov/appointment/submit",
    data=form_data
)

if "success" in result.text.lower():
    print("Form submitted successfully")

Padrões comuns em portais de governo

Alguns comportamentos se repetem entre portais BLS International e equivalentes.

Padrão 1: formulários em várias etapas

Portais de governo dividem o fluxo em várias submissões, com o CAPTCHA na etapa final:

# Step 1: Select service type
session.post(url, data={"service": "passport"})

# Step 2: Fill personal details
session.post(url, data={"name": "...", "dob": "..."})

# Step 3: Select appointment slot
session.post(url, data={"slot": "2026-04-10-09:00"})

# Step 4: Solve CAPTCHA and confirm
captcha_answer = solve_bls_captcha(get_captcha_image(session))
session.post(url, data={"captcha": captcha_answer, "confirm": "true"})

Padrão 2: novo CAPTCHA a cada erro

Quando a resposta está errada, o portal gera um CAPTCHA novo — cada tentativa precisa buscar uma imagem fresca:

max_attempts = 3
for attempt in range(max_attempts):
    # Get fresh CAPTCHA for each attempt
    captcha_image = get_captcha_image(session)
    answer = solve_bls_captcha(captcha_image)

    result = session.post(submit_url, data={"captcha": answer})
    if "incorrect" not in result.text.lower():
        break
    print(f"Attempt {attempt + 1} — CAPTCHA refreshed, retrying")

Padrão 3: sessões com tempo limitado

Sessões de portal de governo expiram após um período fixo — se o CAPTCHA for resolvido perto do limite, o envio chega tarde:

import time

session_start = time.time()
SESSION_TIMEOUT = 600  # 10 minutes typical

def check_session_valid():
    elapsed = time.time() - session_start
    if elapsed > SESSION_TIMEOUT - 60:  # 1 min safety margin
        print("Session expiring — refresh needed")
        return False
    return True

# Before CAPTCHA submission
if not check_session_valid():
    # Start a fresh session
    session = requests.Session()
    session.get(portal_url)
    session_start = time.time()

Boas práticas para gerenciar a sessão

Portais governamentais são rígidos com o estado da sessão — um cookie perdido ou token CSRF ausente derruba o fluxo:

  1. Manter os cookies exatamente — usar requests.Session() ou contexto persistente do navegador.
  2. Não exceder os limites de requisições — intervalos entre carregamentos de página (2 a 5 segundos).
  3. Tratar tokens CSRF — extrair e incluir o token em cada POST.
  4. Respeitar o tempo limite da sessão — concluir o fluxo dentro da janela disponível.
  5. Seguir as cadeias de redirecionamento — permitir redirecionamentos automáticos no cliente HTTP.

Em escala isso pesa: uma agência de vistos em São Paulo que agenda vários horários por semana via BLS International precisa de workers em paralelo — um plano como ADVANCE (US$ 90/mês, 50 threads) viabiliza isso, respeitando a LGPD (RGPD em Portugal) quanto aos dados coletados.

Automação com navegador para portais que exigem JavaScript

Quando o portal renderiza o CAPTCHA via JavaScript, requisições HTTP puras não bastam — é preciso um navegador real (ou headless):

const puppeteer = require('puppeteer');

async function handleBLSPortal() {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();

  await page.goto('https://portal.example.gov/appointment');

  // Wait for CAPTCHA to load
  await page.waitForSelector('img#captcha-image');

  // Get CAPTCHA image as base64
  const imgBase64 = await page.evaluate(() => {
    const img = document.querySelector('img#captcha-image');
    const canvas = document.createElement('canvas');
    canvas.width = img.naturalWidth;
    canvas.height = img.naturalHeight;
    const ctx = canvas.getContext('2d');
    ctx.drawImage(img, 0, 0);
    return canvas.toDataURL('image/png').split(',')[1];
  });

  // Solve with CaptchaAI
  const answer = await solveBLSCaptcha(imgBase64);

  // Type the answer
  await page.type('#captcha-input', answer);

  // Submit
  await page.click('#submit-button');

  // Wait for result
  await page.waitForNavigation();
}

Solução de problemas comuns

Os erros mais frequentes nesses portais têm causa conhecida:

Problema Causa Correção
"Sessão expirada" após a resolução Demora entre resolver e enviar Resolva o CAPTCHA imediatamente antes do envio
Imagem do CAPTCHA não carrega Exige um Referer específico Defina o Referer como a URL do portal
Resposta correta, formulário rejeitado CSRF ausente ou campo oculto faltando Extraia todos os campos ocultos
Portal bloqueia após várias tentativas Rate limiting Espace as tentativas e rotacione proxies
CAPTCHA diferente a cada carregamento Novo desafio a cada requisição Busque uma imagem nova a cada tentativa

Artigos relacionados

Próximos passos

Para lidar com o BLS CAPTCHA em portais de agendamento sem travar o fluxo, obtenha sua chave de API da CaptchaAI e teste a resolução no seu próprio ambiente antes de colocar em produção.

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