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
- Comment fonctionnent les défis Grid Image CAPTCHA
- Erreurs et correctifs courants de Grid Image CAPTCHA
- Le défi de la grille reCAPTCHA expliqué