Se a sua automação trava exatamente no envio ao BLS International, o problema quase sempre está em um destes quatro pontos: parâmetros ausentes, imagens capturadas do jeito errado, índices trocados na hora de clicar, ou o token expirando antes do envio. O CAPTCHA do BLS usa uma implementação própria — diferente de reCAPTCHA ou Turnstile — e isso muda onde as coisas costumam quebrar. Este guia mapeia cada erro comum e mostra como corrigir com a API da CaptchaAI.
Comece por aqui: checklist de depuração
Antes de mergulhar em cada erro específico, rode esta checklist. Na maioria dos casos, ela já aponta em qual das quatro categorias abaixo (envio da API, extração de imagem, aplicação da solução ou tempo limite) o problema está:
| Verifique | Ação |
|---|---|
| As instruções foram extraídas? | Imprima o texto e confirme que não veio cortado |
| As imagens são válidas? | Salve o base64 em arquivo e abra para conferir visualmente |
| A contagem de imagens está certa? | Compare quantas imagens você enviou com quantas apareceram na tela |
| A ordem das imagens está certa? | Confirme que a ordem do DOM é igual à ordem de exibição |
| O prefixo base64 foi removido? | Remova data:image/...;base64, antes de enviar |
| O formato da solução está correto? | Interprete os índices separados por vírgula, base 1 |
| A conversão de índice foi feita? | Subtraia 1 para acessar o array em base 0 |
Se a checklist não resolveu, siga para a categoria correspondente abaixo — cada uma traz a causa exata e o código de correção.
Erros ao enviar a tarefa para a API
ERROR_BAD_PARAMETERS aparece quando faltam parâmetros obrigatórios — instruções ou imagens. Sempre inclua instructions junto com cada image_base64_N:
# WRONG — missing instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "bls",
"image_base64_1": img1, "json": 1
})
# CORRECT — include instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "bls",
"instructions": "Select all images with a car",
"image_base64_1": img1, "json": 1
})
ERROR_WRONG_FILE_EXTENSION significa que os dados da imagem não são base64 válidos ou estão em um formato não suportado. Antes de enviar, confira três coisas:
- As imagens são PNG ou JPEG codificadas em base64
- O prefixo
data:image/...;base64,foi removido - A string base64 não está truncada
import base64
# Strip the data URI prefix
src = img_element.get_attribute("src")
if src.startswith("data:image"):
b64 = src.split(",")[1]
else:
# Download and encode
img_data = requests.get(src).content
b64 = base64.b64encode(img_data).decode()
ERROR_CAPTCHA_UNSOLVABLE costuma indicar imagens de baixa qualidade, desfocadas, ou uma instrução ambígua. Capture as imagens em resolução total, sem recorte, confirme que o texto da instrução foi extraído sem cortar palavras e, se o desafio realmente for difícil, tente novamente — alguns são, de fato, mais complicados que outros.
Por que a extração das imagens falha
Três causas respondem pela maioria dos casos.
Primeiro, as imagens ainda não estão no DOM quando a página termina de carregar. A correção é aguardar a renderização completa do captcha antes de extrair:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Wait for captcha images to load
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".captcha-image img"))
)
Segundo, o portal desenha as imagens em <canvas>, não em tags <img> comuns — algumas implementações do BLS fazem isso. Nesse caso, extraia os dados do canvas diretamente como base64:
canvas_elements = driver.find_elements(By.CSS_SELECTOR, ".captcha-canvas")
for i, canvas in enumerate(canvas_elements, 1):
b64 = driver.execute_script(
"return arguments[0].toDataURL('image/png').split(',')[1];",
canvas
)
payload[f"image_base64_{i}"] = b64
Terceiro, as URLs das imagens retornam 403 quando você tenta buscá-las diretamente, fora do contexto do navegador — proteção comum contra hotlinking. A solução é extrair as imagens de dentro do próprio navegador, via JavaScript injetado:
# Get image data from within the browser
b64 = driver.execute_script("""
var img = arguments[0];
var canvas = document.createElement('canvas');
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
canvas.getContext('2d').drawImage(img, 0, 0);
return canvas.toDataURL('image/png').split(',')[1];
""", img_element)
Erros ao aplicar a solução no formulário
Cliques na imagem errada acontecem quando a ordem em que você extraiu as imagens não é a mesma ordem em que elas aparecem na tela. Mantenha uma ordem consistente do começo ao fim:
# Ensure images are indexed in display order
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
# The order of find_elements matches DOM order = display order
for i, img in enumerate(captcha_imgs, 1):
payload[f"image_base64_{i}"] = extract_base64(img)
Índices que não batem com os cliques são o erro clássico de off-by-one: a CaptchaAI retorna índices começando em 1, mas o array do seu código começa em 0.
solution = result["request"] # e.g., "1,3,5"
indices = [int(i) for i in solution.split(",")]
# Convert to 0-based for array access
for idx in indices:
captcha_imgs[idx - 1].click() # 1-based → 0-based
Formulário rejeitado mesmo com a seleção certa costuma significar que há campos ou tokens ocultos que precisam ser enviados junto com a resposta do captcha, e o seu código está ignorando algum deles. Liste os campos ocultos antes de enviar:
# Look for hidden captcha tokens
hidden_fields = driver.find_elements(By.CSS_SELECTOR, "input[type='hidden']")
for field in hidden_fields:
name = field.get_attribute("name")
value = field.get_attribute("value")
print(f"Hidden field: {name}={value}")
Quando o captcha expira antes de você terminar
O CAPTCHA do BLS tem uma janela de validade curta — bem mais curta do que reCAPTCHA, por exemplo. Por isso:
- Extraia as imagens e envie para a CaptchaAI imediatamente, sem etapas intermediárias
- Nunca extraia as imagens e espere antes de enviar
- Se a resolução passar de 60 segundos, considere que o captcha expirou — atualize a página e recomece o fluxo
Se o tempo estourar durante a consulta de resultado (polling), confira se o padrão está correto:
# Standard polling pattern
for _ in range(30): # 30 attempts × 5 seconds = 150 seconds max
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
# Don't keep polling — start over
raise Exception("Unsolvable")
Um caso real: monitoramento de vagas de agendamento
Uma assessoria de vistos em São Paulo que acompanha datas de agendamento do BLS International para vários clientes ao mesmo tempo é um bom exemplo de onde esses erros aparecem na prática. Rodando primeiro em ambiente de staging, com dados fictícios, a equipe percebeu que boa parte das falhas não vinha da CaptchaAI, e sim da extração: imagens em <canvas> não capturadas corretamente, e captchas expirando porque o processo esperava alguns segundos antes de enviar. Depois de aplicar as correções acima — extração imediata, verificação de índice base 1 e a checklist do topo — a taxa de erro no fluxo de teste caiu de forma consistente.
Ao registrar dados de clientes em logs de depuração durante esses testes, as obrigações da LGPD sobre coleta e retenção de dados pessoais continuam valendo normalmente.
Perguntas frequentes
Quantas imagens preciso enviar para a CaptchaAI? Envie todas as imagens exibidas no captcha, normalmente entre 3 e 9. Use os campos image_base64_1 até image_base64_9, um por imagem.
Minha automação roda o dia inteiro — isso é seguro para o BLS? Trate o monitoramento contínuo como qualquer integração de produção: valide primeiro em staging, respeite intervalos razoáveis entre requisições e evite gerar volume desnecessário. O foco deve ser confiabilidade do seu fluxo de agendamento, não velocidade a qualquer custo.
As instruções aparecem em outro idioma — preciso traduzir antes de enviar? Não. Envie a instrução exatamente como ela aparece na tela, no idioma original. A CaptchaAI processa instruções multilíngues sem necessidade de tradução prévia.
Por que a extração funciona no Chrome normal mas falha no modo headless? Geralmente porque o navegador headless renderiza o <canvas> de forma diferente ou termina de carregar antes das imagens aparecerem. Aumente o tempo de espera explícito e confirme, com uma captura de tela, que os elementos realmente carregaram antes de extrair.
Quando faz sentido migrar para um plano CaptchaAI com mais threads? Se você processa vários agendamentos do BLS em paralelo — por exemplo, monitorando datas para diversos clientes ao mesmo tempo — o gargalo normalmente não é o captcha em si, mas o número de threads simultâneas do seu plano. O BASIC (US$ 15/mês, 5 threads) atende testes e volume baixo; para monitoramento contínuo em produção, considere o ADVANCE (US$ 90/mês, 50 threads) ou um plano superior.