Tutoriels API

Comment résoudre automatiquement Grid Image CAPTCHA

Les CAPTCHA d'image en grille présentent une grande image divisée en grille (généralement 3 × 3 ou 4 × 4) et demandent aux utilisateurs de sélectionner des cellules correspondant à une description. Bien que reCAPTCHA utilise ce format, de nombreux sites utilisent des défis de grille personnalisés qui ne font pas partie du système de Google.

Ce guide explique comment résoudre les problèmes d'image de grille non reCAPTCHA à l'aide du point de terminaison method=grid de CaptchaAI.


Exigences

Article Valeur
Clé API CaptchaAI Depuiscaptchaai.com
Image de grille Capture d'écran ou base64 de la grille complète
Langue Python 3.7+ ou Node.js 14+

Étape 1 : Capturer l'image de la grille

Méthode A : capture d'écran de l'élément 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éthode B : extraire l’image de l’attribut 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()

Étape 2 : Envoyez l'image à CaptchaAI

Utilisation du téléchargement de fichiers (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}")

Utiliser 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"]

Noeud.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;
}

Étape 3 : Sonder la solution

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

Étape 4 : Appliquer la solution

Cliquez par index de cellule

# 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()

Cliquez par coordonnées

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()

Dépannage

Erreur Parce que Corriger
ERROR_WRONG_FILE_EXTENSION Format d'image invalide Utilisez PNG ou JPEG ; vérifier que base64 est valide
ERROR_CAPTCHA_UNSOLVABLE Image trop petite ou floue Capturez en pleine résolution
Mauvaises cellules sélectionnées Incompatibilité du format de la solution Vérifiez si la solution est constituée d'indices et de coordonnées
ERROR_TOO_BIG_CAPTCHA_FILESIZE L'image dépasse la limite de taille Redimensionner à moins de 600 Ko

Exemple entièrement exécutable

Besoin d'un projet de travail complet avec configuration de l'environnement, interrogation, tentatives et gestion des erreurs ?

Voir l'exemple exécutable complet sur GitHub →


FAQ

Quand dois-je utiliser la résolution de grille ou la résolution de jetons ?

Utilisez la résolution de jetons (method=userrecaptcha) pour les défis reCAPTCHA standard : c'est plus simple et plus fiable. Utilisez la résolution de grille (method=post avec recaptcha=1) pour les défis de grille non reCAPTCHA ou les grilles d'images autonomes.

Quelles tailles de grille sont prises en charge ?

CaptchaAI gère les dispositions de grille 3×3, 4×4 et non standard. L'image est analysée dans son ensemble, quelle que soit la structure de la grille.

Quelle est la précision de la résolution de grille ?

La précision dépend de la qualité de l'image. Des images claires et haute résolution permettent d'obtenir les meilleurs résultats. Le temps de résolution moyen est de 15 à 30 secondes.

Puis-je résoudre des grilles dynamiques où les tuiles changent ?

Pour les grilles dynamiques reCAPTCHA (où les vignettes cliquées sont remplacées), utilisez la méthode du jeton (method=userrecaptcha). La méthode de la grille résout une seule image statique.


Guides associés

Les commentaires sont désactivés pour cet article.