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_sizebate 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,busesmotorcycles,bicycles,fire hydrantsstairs,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
3x3ou4x4no 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.