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:
- Manter os cookies exatamente — usar
requests.Session()ou contexto persistente do navegador. - Não exceder os limites de requisições — intervalos entre carregamentos de página (2 a 5 segundos).
- Tratar tokens CSRF — extrair e incluir o token em cada POST.
- Respeitar o tempo limite da sessão — concluir o fluxo dentro da janela disponível.
- 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
- Como resolver o BLS CAPTCHA passo a passo
- Resolver BLS CAPTCHA com Node.js
- Como funciona a lógica de grade do BLS CAPTCHA
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.