Si CaptchaAI renvoie des réponses incorrectes pour les CAPTCHA d'image, le problème vient presque toujours de l'image soumise, et non de sa résolution. Voici comment le diagnostiquer et le réparer.
Causes courantes de mauvaises réponses
| Parce que | Fréquence | Corriger |
|---|---|---|
| Image mal recadrée | Très courant | Capturez l'élément CAPTCHA complet |
| Basse résolution / compression | Commun | Envoyer une image de meilleure qualité |
| Mauvais encodage d'image | Commun | Vérifier l'encodage base64 |
| Langue manquanteIndice/type | Occasionnel | Ajoutez language ou textinstructions |
| Image obsolète/expired | Occasionnel | Capturez une nouvelle image avant de la résoudre |
Correctif 1 : vérifier la qualité de l’image avant la soumission
import base64
from io import BytesIO
from PIL import Image
def validate_captcha_image(image_path):
"""Check image quality before submitting to CaptchaAI."""
img = Image.open(image_path)
width, height = img.size
issues = []
# Minimum resolution
if width < 50 or height < 20:
issues.append(f"Too small: {width}x{height}px (min 50x20)")
# Check if mostly blank
pixels = list(img.getdata())
if img.mode == "RGB":
white_count = sum(1 for p in pixels if p[0] > 250 and p[1] > 250 and p[2] > 250)
else:
white_count = sum(1 for p in pixels if p > 250)
blank_ratio = white_count / len(pixels)
if blank_ratio > 0.95:
issues.append(f"Image appears blank ({blank_ratio:.0%} white)")
# File size check
img_bytes = BytesIO()
img.save(img_bytes, format="PNG")
size_kb = img_bytes.tell() / 1024
if size_kb < 1:
issues.append(f"File too small ({size_kb:.1f} KB) — may be empty")
if size_kb > 600:
issues.append(f"File too large ({size_kb:.0f} KB) — submit under 600 KB")
return issues
issues = validate_captcha_image("captcha.png")
if issues:
for issue in issues:
print(f"WARNING: {issue}")
else:
print("Image quality OK")
Correctif 2 : Corriger l’encodage Base64
import base64
def encode_captcha(image_path):
"""Properly encode a CAPTCHA image to base64."""
with open(image_path, "rb") as f:
raw = f.read()
encoded = base64.b64encode(raw).decode("ascii")
# Verify round-trip
decoded = base64.b64decode(encoded)
assert decoded == raw, "Base64 encoding corrupted the image"
return encoded
# WRONG — encoding a file path string
bad = base64.b64encode(b"captcha.png").decode() # Encodes filename, not image!
# CORRECT — encoding file contents
with open("captcha.png", "rb") as f:
good = base64.b64encode(f.read()).decode()
Correctif 3 : prétraitement de l’image
from PIL import Image, ImageFilter, ImageEnhance
from io import BytesIO
import base64
def preprocess_captcha(image_path):
"""Improve image quality for better OCR accuracy."""
img = Image.open(image_path)
# Convert to RGB if needed
if img.mode != "RGB":
img = img.convert("RGB")
# Upscale small images
width, height = img.size
if width < 200:
scale = 200 / width
img = img.resize(
(int(width * scale), int(height * scale)),
Image.LANCZOS,
)
# Increase contrast
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(1.5)
# Sharpen
img = img.filter(ImageFilter.SHARPEN)
# Convert to PNG bytes
buffer = BytesIO()
img.save(buffer, format="PNG")
return base64.b64encode(buffer.getvalue()).decode()
Correctif 4 : ajouter des indications de type et de langue
import requests
def solve_image(api_key, image_base64, **hints):
"""Submit image CAPTCHA with quality hints."""
data = {
"key": api_key,
"method": "base64",
"body": image_base64,
"json": 1,
}
# Add optional hints for better accuracy
if "language" in hints:
data["language"] = hints["language"] # 0=default, 1=Cyrillic, 2=Latin
if "textinstructions" in hints:
data["textinstructions"] = hints["textinstructions"]
if "numeric" in hints:
data["numeric"] = hints["numeric"] # 1=digits only, 2=letters only
if "min_len" in hints:
data["min_len"] = hints["min_len"]
if "max_len" in hints:
data["max_len"] = hints["max_len"]
resp = requests.post("https://ocr.captchaai.com/in.php", data=data, timeout=30)
return resp.json()
# Example: Digits-only CAPTCHA, 4-6 characters
result = solve_image(
"YOUR_API_KEY",
encoded_image,
numeric=1,
min_len=4,
max_len=6,
)
# Example: Case-sensitive text
result = solve_image(
"YOUR_API_KEY",
encoded_image,
textinstructions="Case-sensitive, enter exactly as shown",
)
Correctif 5 : capturer l'élément CAPTCHA complet
from selenium import webdriver
from selenium.webdriver.common.by import By
import base64
def capture_captcha_element(driver, selector):
"""Screenshot only the CAPTCHA element, not the full page."""
element = driver.find_element(By.CSS_SELECTOR, selector)
# Element screenshot (better than page crop)
png_bytes = element.screenshot_as_png
# Verify it's not empty
if len(png_bytes) < 500:
raise ValueError("Screenshot too small — element may not be visible")
return base64.b64encode(png_bytes).decode()
# Usage
driver = webdriver.Chrome()
driver.get("https://example.com")
image_b64 = capture_captcha_element(driver, "img#captchaImage")
Correctif 6 : gérer les CAPTCHA Dynamic/Rotating
import time
def solve_with_fresh_image(driver, api_key, captcha_selector):
"""Capture and solve CAPTCHA immediately to avoid expiry."""
# Wait for CAPTCHA to load fully
time.sleep(2)
# Capture fresh
element = driver.find_element(By.CSS_SELECTOR, captcha_selector)
png_bytes = element.screenshot_as_png
body = base64.b64encode(png_bytes).decode()
# Submit immediately
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": "base64",
"body": body,
"json": 1,
}, timeout=30)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(result.get("request"))
task_id = result["request"]
# Poll — image CAPTCHAs solve fast
time.sleep(5)
for _ in range(12):
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
return data["request"]
if data["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(data["request"])
time.sleep(3)
raise TimeoutError("Image solve timeout")
Liste de contrôle de dépannage
| Symptôme | Diagnostic | Corriger |
|---|---|---|
| La réponse est du charabia | Encodage Base64 incorrect | Vérifier l'encodage aller-retour |
| La réponse est proche mais fausse | Faible qualité d'image | Prétraitement : mise à l'échelle, netteté, contraste |
| La réponse comporte un nombre de caractères incorrect | Indices de longueur manquants | Ajouter les paramètres min_len/max_len |
| La réponse mélange les lettres/digits | Indice de type manquant | Ajouter numérique=1 ou numérique=2 |
| Réponse vide renvoyée | Image Blank/corrupted | Valider l'image avant de la soumettre |
| Bonne réponse mais le site refuse | Sensibilité à la casse | Ajouter des instructions textuelles pour le cas |
FAQ
Quelle est la précision de CaptchaAI pour les CAPTCHA d’image ?
Avec des images correctement soumises, CaptchaAI prend en charge plus de 27 500 types CAPTCHA avec une grande précision. La plupart des échecs sont dus à une mauvaise qualité d’image ou à des paramètres incorrects.
Dois-je prétraiter les images avant de les soumettre ?
Uniquement si l'image originale est de mauvaise qualité. CaptchaAI gère bien les images CAPTCHA standard sans prétraitement. La mise à l'échelle de très petites images et l'augmentation du contraste peuvent aider dans les cas extrêmes.
Puis-je signaler des mauvaises réponses ?
Oui. Utilisez le point de terminaison reportbad avec l'ID de tâche pour signaler les réponses incorrectes. Cela contribue à améliorer la précision et peut créditer votre compte.
Guides connexes
- Résolvez les images avec précision -essayez CaptchaAI.*