Tutoriais de API

Como resolver CAPTCHA de imagem de grade automaticamente

Imagem de grade CAPTCHAs apresentam uma imagem grande dividida em uma grade (normalmente 3×3 ou 4×4) e pedem aos usuários que selecionem células que correspondam a uma descrição. Embora o reCAPTCHA use esse formato, muitos sites usam desafios de grade personalizados que não fazem parte do sistema do Google.

Este guia aborda a solução de desafios de imagem de grade não reCAPTCHA usando o endpoint method=grid do CaptchaAI.


Requisitos

Artigo Valor
Chave de API CaptchaAI Decaptchaai.com
Imagem de grade Captura de tela ou base64 da grade completa
Idioma Python 3.7+ ou Node.js 14+

Etapa 1: capturar a imagem da grade

Método A: captura de tela do elemento captcha

from selenium import webdriver
from selenium.webdriver.common.by import By

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

# Screenshot just the captcha container
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
captcha_element.screenshot("captcha_grid.png")

Método B: extrair imagem do atributo src

import base64
import requests

captcha_img = driver.find_element(By.CSS_SELECTOR, ".grid-captcha img")
src = captcha_img.get_attribute("src")

if src.startswith("data:image"):
    image_b64 = src.split(",")[1]
else:
    image_data = requests.get(src).content
    image_b64 = base64.b64encode(image_data).decode()

Passo 2: Envie a imagem para CaptchaAI

Usando upload de arquivo (Python)

import requests
import time

API_KEY = "YOUR_API_KEY"

with open("captcha_grid.png", "rb") as f:
    response = requests.post("https://ocr.captchaai.com/in.php",
        data={
            "key": API_KEY,
            "method": "post",
            "recaptcha": 1,
            "json": 1
        },
        files={"file": f}
    )

data = response.json()
task_id = data["request"]
print(f"Task: {task_id}")

Usando base64 (Python)

response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "post",
    "body": image_b64,
    "recaptcha": 1,
    "json": 1
})

task_id = response.json()["request"]

Node.js

const axios = require('axios');
const fs = require('fs');

async function submitGridCaptcha(imagePath) {
  const imageB64 = fs.readFileSync(imagePath).toString('base64');

  const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, {
    params: {
      key: 'YOUR_API_KEY',
      method: 'post',
      body: imageB64,
      recaptcha: 1,
      json: 1
    }
  });

  return data.request;
}

Passo 3: Pesquise a solução

def get_grid_solution(task_id):
    for _ in range(30):
        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") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {result['request']}")

    raise Exception("Timeout")

solution = get_grid_solution(task_id)
print(f"Solution: {solution}")
# Returns click coordinates or cell indices

Etapa 4: aplique a solução

Clique por índice de célula

# If solution returns cell indices (e.g., "2,5,6")
selected = [int(i) for i in solution.split(",")]
cells = driver.find_elements(By.CSS_SELECTOR, ".grid-cell")

for idx in selected:
    cells[idx - 1].click()
    time.sleep(0.2)

driver.find_element(By.CSS_SELECTOR, ".verify-button").click()

Clique por coordenadas

from selenium.webdriver.common.action_chains import ActionChains

# If solution returns coordinates (e.g., "x=120,y=80;x=250,y=200")
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
actions = ActionChains(driver)

for coord in solution.split(";"):
    parts = dict(p.split("=") for p in coord.split(","))
    x, y = int(parts["x"]), int(parts["y"])
    actions.move_to_element_with_offset(captcha_element, x, y).click()

actions.perform()

Solução de problemas

Erro Causa Correção
ERROR_WRONG_FILE_EXTENSION Formato de imagem inválido Utilize PNG ou JPEG; verifique se base64 é válido
ERROR_CAPTCHA_UNSOLVABLE Imagem muito pequena ou desfocada Capture em resolução máxima
Células erradas selecionadas Incompatibilidade de formato de solução Verifique se a solução são índices versus coordenadas
ERROR_TOO_BIG_CAPTCHA_FILESIZE A imagem excede o limite de tamanho Redimensionar para menos de 600 KB

Exemplo executável completo

Precisa de um projeto funcional completo com configuração de ambiente, pesquisas, novas tentativas e tratamento de erros?

Veja o exemplo executável completo no GitHub →


Perguntas frequentes

Quando devo usar a resolução de grade versus a resolução de token?

Use a resolução de tokens (method=userrecaptcha) para desafios reCAPTCHA padrão — é mais simples e confiável. Use a resolução de grade (method=post com recaptcha=1) para desafios de grade não reCAPTCHA ou grades de imagens independentes.

Quais tamanhos de grade são suportados?

CaptchaAI lida com layouts de grade 3×3, 4×4 e não padrão. A imagem é analisada como um todo, independentemente da estrutura da grade.

Quão precisa é a resolução da grade?

A precisão depende da qualidade da imagem. Imagens nítidas e de alta resolução alcançam os mais adequado resultados. O tempo médio de resolução é de 15 a 30 segundos.

Posso resolver grades dinâmicas onde os blocos mudam?

Para grades dinâmicas reCAPTCHA (onde os blocos clicados são substituídos), use o método token (method=userrecaptcha). O método da grade resolve uma única imagem estática.


Guias relacionados

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