Les CAPTCHA d'images complexes utilisent des lettres connectées, des caractères qui se chevauchent, des polices variées et du bruit pour empêcher l'OCR. Voici comment les aborder avec CaptchaAI.
Types de complexité courants
| Tapez | Descriptif | Difficulté |
|---|---|---|
| Texte propre | Aucune distorsion, police uniforme | Facile |
| Texte déformé | Lettres tournées individuellement/scaled | Moyen |
| Lettres connectées | Les caractères se chevauchent ou se touchent | Difficile |
| Multi-police | Différentes polices par caractère | Difficile |
| Bruit + lignes | Bruit de fond, lignes barrées | Moyen |
| Variation de couleur | Différentes couleurs par personnage | Moyen |
| Expression mathématique | Nombres + opérateurs, résultat attendu | Moyen |
Soumission de CAPTCHA complexes
Pour les CAPTCHA multi-caractères standard, soumettez-les via base64 avec les astuces appropriées :
import requests
import base64
import time
import os
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_complex_image(image_b64, hints=None):
"""Solve a complex multi-character image CAPTCHA."""
payload = {
"key": API_KEY,
"method": "base64",
"body": image_b64,
"json": 1,
}
if hints:
payload.update(hints)
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data=payload,
timeout=30,
)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(f"Submit failed: {result.get('request')}")
task_id = result["request"]
time.sleep(8)
for _ in range(24):
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(5)
raise TimeoutError("Solve timeout")
Stratégie : lettres connectées
Les lettres connectées sont les plus difficiles pour l'OCR de base mais pas pour CaptchaAI :
def solve_connected_letters(image_path):
"""Solve CAPTCHA with connected/overlapping characters."""
with open(image_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("ascii")
return solve_complex_image(b64, hints={
"textinstructions": "Characters may be connected or overlapping",
"minLen": 4,
"maxLen": 8,
})
Stratégie : cas mixte avec bruit
def solve_noisy_mixed(image_path):
"""Solve CAPTCHA with background noise and mixed case."""
with open(image_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("ascii")
return solve_complex_image(b64, hints={
"regsense": 1, # Case-sensitive
"language": 2, # Latin characters
"textinstructions": "Ignore background lines and noise",
})
Stratégie : texte multi-polices
def solve_multi_font(image_path):
"""Solve CAPTCHA using multiple fonts per character."""
with open(image_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("ascii")
return solve_complex_image(b64, hints={
"textinstructions": "Each character may use a different font or style",
"minLen": 5,
"maxLen": 7,
})
Prétraitement des images pour de meilleurs résultats
Le prétraitement avant la soumission peut améliorer la précision :
# preprocess.py
from PIL import Image, ImageFilter, ImageEnhance
import io
import base64
def preprocess_for_ocr(image_path):
"""Preprocess image to improve OCR accuracy."""
img = Image.open(image_path)
# Convert to grayscale
img = img.convert("L")
# Increase contrast
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(2.0)
# Sharpen
img = img.filter(ImageFilter.SHARPEN)
# Binarize (threshold)
threshold = 128
img = img.point(lambda p: 255 if p > threshold else 0)
# Encode back to base64
buffer = io.BytesIO()
img.save(buffer, format="PNG")
return base64.b64encode(buffer.getvalue()).decode("ascii")
Stratégie de nouvelle tentative avec création de rapports
# retry_strategy.py
def solve_with_retry(image_b64, hints, max_retries=3):
"""Retry solving with fallback strategies."""
strategies = [
hints, # Original hints
{**hints, "textinstructions": ""}, # Without instructions
{**hints, "numeric": 0, "regsense": 0}, # Relaxed constraints
]
for i, strategy in enumerate(strategies[:max_retries]):
try:
result = solve_complex_image(image_b64, strategy)
return {"text": result, "strategy": i, "success": True}
except RuntimeError:
continue
return {"text": None, "strategy": -1, "success": False}
def report_bad_answer(task_id):
"""Report incorrect answer for quality feedback."""
requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "reportbad",
"id": task_id,
}, timeout=10)
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
| Caractères manquants | Lettres connectées mal lues | Ajouter textinstructions à propos du texte connecté |
| Caractères supplémentaires | Bruit interprété comme texte | Prétraitement : supprimez le bruit avant la soumission |
| Mauvais cas | Cas non conservé | Définir regsense=1 |
| Résultat mathématique renvoyé sous forme d'expression | calc=1 manquant |
Activer le mode calcul pour les CAPTCHA mathématiques |
| Toujours faux sur un site spécifique | Police spécifique au site | Signaler les mauvaises réponses pour améliorer le modèle |
FAQ
Dois-je prétraiter les images avant de les soumettre ?
Seulement si vous obtenez de mauvais résultats. CaptchaAI gère nativement la plupart des distorsions. Le prétraitement est utile pour les images très bruyantes ou à faible contraste.
Que se passe-t-il si le même type d'image continue d'échouer ?
Signalez les mauvaises réponses avec reportbad pour améliorer la précision. Essayez également d'ajouter un textinstructions spécifique décrivant les caractéristiques du CAPTCHA.
Y a-t-il une limite de caractères pour les CAPTCHA d’image ?
CaptchaAI peut gérer les CAPTCHA jusqu'à environ 20 caractères. La plupart comportent de 4 à 8 caractères.
Guides connexes
Résolvez des CAPTCHA d'images complexes -commencer par CaptchaAI.