Quand une grille d'images reCAPTCHA v2 renvoie les mauvaises cellules — ou pire, un ERROR_CAPTCHA_UNSOLVABLE —, la cause est presque toujours l'un de trois paramètres : la taille de grille déclarée, l'image que vous envoyez, ou la façon dont votre code interprète les indices renvoyés. La solution elle-même est rarement en cause. Avant de suspecter le service, vérifiez ces quelques points : dans la grande majorité des cas, le correctif tient en une ligne. Ce guide les passe en revue, du plus fréquent au plus rare.
Comment CaptchaAI numérote les cellules d'une grille
CaptchaAI reçoit votre image de grille, analyse chaque cellule et renvoie un tableau d'indices correspondant à l'instruction. Comprendre cette numérotation est indispensable, car toutes les erreurs de coordonnées en découlent. Les cellules sont numérotées de gauche à droite, puis de haut en bas :
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
La réponse ressemble à [1, 3, 6, 9] : les cellules 1, 3, 6 et 9 contiennent les objets cibles. Retenez ce point : les indices commencent à 1, pas à 0. C'est la source d'erreur la plus discrète, et nous y revenons plus bas.
Diagnostic express : repérer la cause en une minute
Avant de toucher au code, comparez le symptôme observé à sa cause la plus probable.
| Symptôme observé | Cause la plus probable |
|---|---|
| Les clics sont décalés mais le bon objet est bien présent | La taille de grille envoyée ne correspond pas au vrai défi |
| Toutes les réponses semblent fausses | L'image capturée n'est pas la grille brute attendue |
| Les résultats varient fortement d'un essai à l'autre | L'instruction textuelle est ambiguë ou tronquée |
| L'erreur ne survient que sur certains sites | Le rendu du widget ou la capture de l'iframe change selon la cible |
Les cinq causes de coordonnées fausses et leur correctif
La taille de grille envoyée ne correspond pas
C'est de loin l'erreur la plus courante. Si le défi est une grille 4×4 mais que vous envoyez grid_size=3x3, la numérotation des cellules est décalée et les mauvaises vignettes sont sélectionnées.
Prenons un cas concret : une équipe QA qui automatise le formulaire d'inscription d'un site hébergé chez OVHcloud voit ses clics se décaler dès que reCAPTCHA bascule d'une grille 3×3 vers une 4×4 sur les défis renforcés. Le code n'a pas changé, mais grid_size est resté figé.
# 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
}
Plutôt que de coder la taille en dur, détectez-la à partir des dimensions de l'image capturée :
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}")
Une image recadrée ou capturée hors de l'iframe
Envoyer une image recadrée, redimensionnée ou extraite d'une capture d'écran pleine page décale l'alignement de la grille. CaptchaAI a besoin de l'image du défi telle qu'elle est rendue, sans retouche. Le correctif consiste à capturer directement l'élément image à l'intérieur de l'iframe reCAPTCHA.
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
Au passage, ne conservez pas ces captures au-delà de la résolution : limiter les données stockées reste une bonne habitude au regard du RGPD.
Des instructions trop vagues
Le texte d'instruction doit reprendre exactement ce que demande le défi. Une consigne imprécise conduit à des sélections de cellules erronées.
# WRONG — too vague
data["instructions"] = "select images"
# CORRECT — specific instruction from the CAPTCHA
data["instructions"] = "crosswalks"
Valeurs d'instruction fréquentes : crosswalks, traffic lights, cars, buses, motorcycles, bicycles, fire hydrants, stairs, bridges, parking meters. Récupérez la consigne depuis le texte affiché par le widget plutôt que de la deviner.
Le décalage d'index entre base 1 et base 0
CaptchaAI renvoie des indices de cellule en base 1. Si votre automatisation manipule des tableaux en base 0 — le cas de la plupart des langages —, vous devez retrancher 1 avant de cliquer. Un oubli produit exactement le symptôme « mes cellules sont décalées d'une case ».
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()
Un format d'image non pris en charge
CaptchaAI accepte les formats JPG, JPEG, PNG et GIF. Tout autre format renvoie ERROR_WRONG_FILE_EXTENSION. Si votre pipeline produit du WebP ou du BMP, convertissez l'image avant l'envoi.
# 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")}
Arbre de décision
Si vous ne savez pas par où commencer, suivez cet enchaînement : chaque question élimine une cause avant de passer à la suivante.
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
Signaler une résolution incorrecte
Si les coordonnées restent fausses alors que tous vos paramètres sont corrects, signalez la résolution avec l'action reportbad :
requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "reportbad",
"id": task_id,
"json": 1
})
Ce signalement aide CaptchaAI à améliorer sa précision et peut rembourser le coût de la résolution concernée. Réservez-le aux cas réellement erronés.
FAQ
Comment savoir si le défi est une grille 3×3 ou 4×4 avant l'envoi ?
Mesurez les dimensions de l'image capturée : les grilles reCAPTCHA sont carrées, avec des vignettes d'environ 100 px en 3×3 et 75 px en 4×4. Le script de détection plus haut déduit grid_size de la largeur, ce qui évite de la coder en dur.
Le paramètre grid_size est-il obligatoire pour un défi en grille ?
Oui. C'est lui qui fixe la numérotation des cellules renvoyées. Sans valeur correcte, les indices de la réponse ne correspondent plus aux vignettes réellement affichées, et vos clics tombent à côté.
Que faire si les indices renvoyés sont toujours décalés d'une cellule ?
CaptchaAI numérote les cellules à partir de 1. Un décalage systématique d'une case signifie presque toujours que votre code attend une base 0 : retranchez 1 de chaque indice avant de cliquer.
L'action reportbad rembourse-t-elle une résolution aux coordonnées fausses ?
Elle peut donner lieu à un remboursement du coût de la résolution signalée, en plus d'améliorer la précision du service. Utilisez-la uniquement quand la solution est réellement incorrecte, jamais de façon systématique.
Résolvez vos grilles d'images avec CaptchaAI
Obtenez des résolutions de grilles d'images fiables sur captchaai.com.