Troubleshooting

Erros de coordenadas de imagem de grade: diagnóstico e correção

Se a CaptchaAI devolve células erradas num desafio de imagem em grade, o problema está quase sempre em um destes cinco pontos: grid_size, corte na imagem, texto da instrução, indexação da célula ou formato do arquivo.

Antes de abrir um chamado, confira nesta ordem — é a sequência que mais resolve na prática:

  • grid_size bate com a grade que a página está renderizando agora (3×3 ou 4×4)?
  • Imagem enviada é a captura original do iframe, sem corte nem redimensionamento?
  • Instrução repete o texto exato do desafio, não uma paráfrase genérica?
  • Indexação da automação já converteu o retorno base 1 para base 0?
  • Formato do arquivo é JPG, PNG ou GIF — nunca WebP?

Como o CaptchaAI numera as células da grade

O CaptchaAI recebe sua imagem de grade, analisa cada célula e devolve uma matriz de índices correspondentes à instrução. A numeração segue da esquerda para a direita, de cima para baixo:

3×3 Grid:          4×4 Grid:
1 2 3              1  2  3  4
4 5 6              5  6  7  8
7 8 9              9  10 11 12
                   13 14 15 16

A resposta chega no formato [1, 3, 6, 9] — as células 1, 3, 6 e 9 contêm os objetos pedidos.

Se seu código clica nas células erradas, o defeito raramente está no solver: está em algum dado da requisição.


As 5 causas mais comuns de coordenadas erradas

1. O grid_size não bate com a grade real

É o erro mais frequente. Se o desafio é uma grade 4×4 mas você envia grid_size=3x3, a numeração inteira fica deslocada e o solver marca os blocos errados.

Sinais de que é isso:

  • Todo clique sai deslocado da mesma forma, em todo desafio.
  • O erro apareceu logo depois de uma mudança de layout responsivo ou de breakpoint.
# WRONG — 4×4 grid sent as 3×3
data = {
    "key": "YOUR_API_KEY",
    "method": "post",
    "grid_size": "3x3",      # Wrong!
    "img_type": "recaptcha",
    "instructions": "traffic lights",
    "json": 1
}

# CORRECT — match the actual grid
data = {
    "key": "YOUR_API_KEY",
    "method": "post",
    "grid_size": "4x4",      # Correct
    "img_type": "recaptcha",
    "instructions": "traffic lights",
    "json": 1
}

Detecte o tamanho da grade por código, sem confiar em suposição.

from PIL import Image

img = Image.open("grid_captcha.png")
width, height = img.size

# reCAPTCHA grids are square. 3×3 tiles are ~100px each, 4×4 tiles are ~75px each
tile_width = width // 3
if width % 4 == 0 and (width // 4) < 100:
    grid_size = "4x4"
else:
    grid_size = "3x3"

print(f"Detected grid size: {grid_size}")

2. A imagem foi cortada, redimensionada ou é um print de tela inteira

  • Enviar uma imagem recortada, redimensionada ou capturada com print da página inteira desalinha a grade.
  • O CaptchaAI precisa da imagem original, exatamente como foi renderizada.

Correção:

  • Capture direto do iframe do reCAPTCHA — nunca um print da página inteira.
  • Não redimensione, comprima nem recorte a imagem antes de enviar.
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com")

# Switch to reCAPTCHA iframe
iframe = driver.find_element(By.CSS_SELECTOR, 'iframe[title*="recaptcha"]')
driver.switch_to.frame(iframe)

# Get the grid image element
grid_img = driver.find_element(By.CSS_SELECTOR, "img.rc-image-tile-wrapper img")
grid_img.screenshot("grid_captcha.png")  # Captures just the grid, not the whole page

3. A instrução está vaga ou não corresponde ao desafio

O texto de instrução precisa espelhar exatamente o que o CAPTCHA está pedindo. Instrução genérica gera seleção genérica — e errada.

# WRONG — too vague
data["instructions"] = "select images"

# CORRECT — specific instruction from the CAPTCHA
data["instructions"] = "crosswalks"

Valores de instrução comuns no dia a dia:

  • crosswalks, traffic lights, cars, buses
  • motorcycles, bicycles, fire hydrants
  • stairs, bridges, parking meters

4. Confusão entre índice base 0 e base 1

O CaptchaAI devolve índices de célula baseados em 1. Se sua automação usa listas base 0 (padrão em Python), falta subtrair 1 de cada valor antes de clicar.

Como confirmar:

  • O clique cai sempre uma célula antes ou depois da esperada.
  • O deslocamento é constante — nunca aleatório.
import json

# CaptchaAI returns 1-based indices
solution = json.loads(result["request"])  # e.g., [1, 3, 6, 9]

# Convert to 0-based for Selenium click automation
zero_based = [cell - 1 for cell in solution]

# Click grid cells using 0-based index
tiles = driver.find_elements(By.CSS_SELECTOR, ".rc-image-tile-wrapper img")
for idx in zero_based:
    tiles[idx].click()

5. Formato de imagem fora do suportado

Formatos aceitos e não aceitos:

  • ✅ JPG, JPEG, PNG, GIF.
  • ❌ WebP (formato padrão de muitos navegadores headless), BMP e qualquer outro — retorna ERROR_WRONG_FILE_EXTENSION.
# WRONG — WebP or BMP
files = {"file": open("grid.webp", "rb")}  # Not supported

# CORRECT — convert to PNG first
from PIL import Image
img = Image.open("grid.webp")
img.save("grid.png", "PNG")
files = {"file": open("grid.png", "rb")}

Referência rápida: causa, sintoma e correção

Causa Sintoma mais comum Correção
grid_size errado Todas as células saem deslocadas do mesmo jeito Detecte o tamanho por código (seção 1)
Imagem cortada ou redimensionada Erro instável, muda entre execuções Capture direto do iframe do reCAPTCHA
Instrução vaga Seleção nunca bate com o desafio pedido Copie o texto exato da instrução
Índice base 0 vs base 1 Clique sempre uma célula à frente ou atrás Subtraia 1 do índice antes de clicar
Formato não suportado ERROR_WRONG_FILE_EXTENSION Converta para PNG antes de enviar

Cenário comum: pipeline de QA travando por coordenada errada

Um time de QA que roda suítes Selenium noturnas em staging costuma bater nesse erro depois de uma mudança discreta: o breakpoint responsivo muda, o reCAPTCHA passa a renderizar em 3×3 em vez de 4×4, e o grid_size fixo no código segue apontando para o valor antigo. O sintoma é sempre o mesmo — ERROR_CAPTCHA_UNSOLVABLE intermitente, só em algumas execuções. Raramente é o solver; quase sempre é o parâmetro hardcoded.

Dica: leia o tamanho da grade a partir da própria imagem (seção 1) em vez de fixar 3x3 ou 4x4 no código — isso elimina essa classe inteira de regressão silenciosa.


Árvore de decisão para depurar em 30 segundos

Siga a ordem abaixo antes de abrir um chamado — na prática ela resolve a maioria dos casos sem precisar olhar logs:

Grid cells are wrong
    ↓
Is grid_size correct (3x3 or 4x4)? → No → Fix grid_size parameter
    ↓ Yes
Is the image the original CAPTCHA (not cropped)? → No → Capture directly from iframe
    ↓ Yes
Is instruction text specific? → No → Use exact CAPTCHA instruction text
    ↓ Yes
Using 1-based indexing for clicks? → No → Convert solution to 0-based
    ↓ Yes
Image in supported format (JPG/PNG)? → No → Convert image format
    ↓ Yes
Report tiles to CaptchaAI via reportbad

Como reportar uma solução incorreta

Se as coordenadas continuam erradas mesmo com parâmetros corretos, reporte a solução:

requests.get("https://ocr.captchaai.com/res.php", params={
    "key": "YOUR_API_KEY",
    "action": "reportbad",
    "id": task_id,
    "json": 1
})

Isso ajuda a refinar a precisão do solver e, quando o erro é confirmado, pode gerar o reembolso do custo daquela resolução.

Checklist antes de confiar na resposta

  • Confira se as dimensões da grade batem com as coordenadas esperadas antes de enviar qualquer clique.
  • Normalize o dimensionamento da imagem e o cálculo do viewport, para o clique sobreviver a zoom e a densidade de pixel do dispositivo.
  • Rejeite respostas fora da grade declarada — falhar rápido custa menos do que depurar um clique fantasma depois.

Perguntas frequentes

O erro de coordenada também aparece fora do reCAPTCHA v2 com imagem?

Não no cenário típico. O desafio de grade é específico do reCAPTCHA v2 com imagem; reCAPTCHA v3 não tem esse challenge visual.

ERROR_CAPTCHA_UNSOLVABLE em grid sempre significa imagem ruim?

Nem sempre. Além de qualidade baixa, esse código aparece quando a instrução não bate com o desafio ou a imagem não é reconhecível como grade — confira se está enviando o arquivo original, sem corte, com a instrução exata.

Reportar com reportbad devolve o custo automaticamente?

Não é automático. A CaptchaAI analisa o reporte e, ao confirmar o erro, pode devolver o custo — caso a caso, sem garantia.

Minhas células vêm sempre deslocadas por uma posição. É bug do CaptchaAI?

Não é bug: é índice base 1. O CaptchaAI numera a partir de 1, então código que espera base 0 (padrão em listas Python) precisa subtrair 1 de cada valor antes de clicar.


Elimine as coordenadas erradas de vez

Valide o grid_size por código, capture a imagem direto do iframe e teste com a API da CaptchaAI no seu ambiente antes de colocar em produção.


Guias relacionados

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