Une chute soudaine du taux de résolution a presque toujours une cause unique et identifiable : votre code, votre proxy, le site cible ou le service lui-même. La méthode qui fait gagner du temps consiste à remonter à la source par élimination, dans un ordre précis, avant même d'ouvrir un ticket d'assistance.
Le réflexe à éviter : changer plusieurs paramètres à la fois. Isolez une variable après l'autre, sinon vous ne saurez jamais laquelle a réglé le problème.
Par où commencer : l'arbre de diagnostic
Suivez cet arbre de haut en bas. Chaque branche renvoie à l'une des vérifications détaillées plus bas.
Solve rate dropped
├── Is the API returning errors? → Check error codes
│ ├── ERROR_WRONG_USER_KEY → API key issue
│ ├── ERROR_ZERO_BALANCE → Balance depleted
│ ├── ERROR_NO_SLOT_AVAILABLE → Rate limiting
│ └── ERROR_CAPTCHA_UNSOLVABLE → CAPTCHA changed
├── Are tokens returned but rejected by the target site?
│ ├── Token expired before submission → Speed up injection
│ ├── Sitekey changed → Re-extract from page
│ └── Domain mismatch → Check pageurl parameter
├── Are proxies failing?
│ ├── Proxy banned by target → Rotate proxies
│ └── Proxy timeout → Check proxy health
└── Did the target site change?
├── New CAPTCHA type → Update method parameter
├── JavaScript changes → Re-analyze page
└── Rate limiting by site → Reduce frequency
Premier réflexe : mesurez, ne supposez pas
Avant toute hypothèse, chiffrez le problème. Ce script vérifie le solde, lance des résolutions de test et compte les erreurs par type.
# diagnose_solve_rate.py
import os
import requests
from collections import Counter
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
def check_balance():
"""Verify API key and balance."""
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "getbalance", "json": "1",
})
result = resp.json()
print(f"Balance: {result}")
return result
def test_solve(sitekey, pageurl, runs=5):
"""Run test solves and collect error statistics."""
errors = Counter()
successes = 0
for i in range(runs):
# Submit
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": "1",
})
result = resp.json()
if result.get("status") != 1:
errors[result.get("request", "UNKNOWN")] += 1
print(f" Run {i+1}: Submit error: {result.get('request')}")
continue
task_id = result["request"]
import time
time.sleep(15)
# Poll
for _ in range(25):
poll = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": task_id, "json": "1",
})
poll_result = poll.json()
if poll_result.get("status") == 1:
successes += 1
print(f" Run {i+1}: Solved")
break
if poll_result.get("request") != "CAPCHA_NOT_READY":
errors[poll_result.get("request", "UNKNOWN")] += 1
print(f" Run {i+1}: Error: {poll_result.get('request')}")
break
time.sleep(5)
else:
errors["TIMEOUT"] += 1
print(f" Run {i+1}: Timeout")
print(f"\nResults: {successes}/{runs} solved")
if errors:
print(f"Errors: {dict(errors)}")
# Run diagnostics
print("=== Balance Check ===")
check_balance()
print("\n=== Test Solves ===")
test_solve("YOUR_SITEKEY", "https://your-target-site.com", runs=5)
Une distribution concentrée sur un seul code oriente aussitôt le diagnostic :
ERROR_ZERO_BALANCErenvoie à la facturation ;ERROR_NO_SLOT_AVAILABLErenvoie à vos threads ;ERROR_CAPTCHA_UNSOLVABLErenvoie au site cible.
Gardez ce décompte : il sert de fil conducteur à toutes les vérifications suivantes.
Le service renvoie-t-il des erreurs ?
Classez les erreurs du décompte par fréquence : le code le plus fréquent désigne la cause première.
| Erreur | Signification | Action |
|---|---|---|
ERROR_CAPTCHA_UNSOLVABLE |
CAPTCHA trop complexe ou modifié | Signalez-le à CaptchaAI ; vérifiez le sitekey |
ERROR_WRONG_CAPTCHA_ID |
Interrogation d'un mauvais ID de tâche | Corrigez le suivi de l'ID dans votre code |
ERROR_ZERO_BALANCE |
Plus de crédits | Rechargez le solde |
ERROR_NO_SLOT_AVAILABLE |
Limite de threads atteinte | Réduisez la simultanéité ou ajoutez un délai |
CAPCHA_NOT_READY (persistant) |
Résolution trop lente | Augmentez le délai de polling ; vérifiez la validité du sitekey |
Vos proxys sont-ils en cause ?
La qualité du proxy pèse directement sur le taux, surtout pour les CAPTCHA à token, où CaptchaAI passe par votre proxy pour dialoguer avec le site. Testez d'abord sans proxy, quand le type l'autorise : si le taux remonte aussitôt, vous tenez le coupable.
| Problème de proxy | Symptôme | Correctif |
|---|---|---|
| Proxy banni par la cible | Token résolu mais rejeté | Basculez sur des proxys résidentiels frais |
| Erreurs renvoyées par le proxy | ERROR_PROXY_NOT_FOUND |
Vérifiez que le proxy est actif et joignable |
| Proxy datacenter détecté | Taux de résolution en baisse | Passez à des proxys résidentiels |
| Zone géographique inadaptée | Résultats incohérents | Alignez le pays du proxy sur le site cible |
Cas concret. Une équipe fait tourner son pipeline de scraping sur une instance OVHcloud à Roubaix et voit son taux d'acceptation des tokens s'effondrer, sans le moindre changement de code. La cause : son fournisseur avait recyclé un lot d'IP désormais bloquées par le portail français ciblé. Une rotation vers des proxys résidentiels localisés en France rétablit le taux en quelques minutes.
Vos tokens expirent-ils avant l'injection ?
Un token CAPTCHA a une durée de vie courte.
Les chiffres ci-dessous reposent sur des mesures observées et des retours d'utilisateurs ; les résultats varient selon l'environnement, le volume et le moment de la journée.
Comptez, en ordre de grandeur, la fenêtre suivante selon le type :
- reCAPTCHA v2 : ~120 secondes
- reCAPTCHA v3 : ~120 secondes
- Cloudflare Turnstile : ~300 secondes
- GeeTest v3 : ~60 secondes
Si votre pipeline traîne entre la réception du token et son injection dans le formulaire, le token expire et le site le refuse. Chronométrez le délai entre getTaskResult et l'envoi du formulaire : au-delà de 60 secondes, injectez le token dès sa réception, sans étape intermédiaire coûteuse.
Le site cible a-t-il changé ?
C'est la cause numéro un des régressions brutales : un sitekey modifié ou une page restructurée, sans le moindre préavis. Ouvrez la page cible, lancez les DevTools (F12) et comparez la valeur active avec celle codée dans votre pipeline :
- reCAPTCHA : l'attribut
data-sitekeyou l'appelgrecaptcha.render - Cloudflare Turnstile :
data-sitekeydans le widget Turnstile - GeeTest : le paramètre
gtdans l'initialisation
Un seul caractère erroné fait échouer chaque tentative : vérifiez-le caractère par caractère. Et si le site a carrément changé de type — reCAPTCHA v2 vers reCAPTCHA v3 invisible, reCAPTCHA vers Cloudflare Turnstile, CAPTCHA image vers reCAPTCHA Enterprise — adaptez votre paramètre method (voir la FAQ pour une migration vers un type non pris en charge).
Où en êtes-vous par rapport à votre référence ?
Si vous aviez mesuré une référence, confrontez-y vos chiffres actuels. Sinon, ce tableau donne des seuils d'alerte raisonnables.
| Métrique | Référence | Actuel | Delta | Un souci ? |
|---|---|---|---|---|
| Taux de résolution | 95 % | ? | baisse > 5 % = à investiguer | |
| Temps de résolution médian | 15 s | ? | hausse > 50 % = à investiguer | |
| Taux d'erreur | 2 % | ? | > 5 % = à investiguer | |
| Taux d'acceptation des tokens | 98 % | ? | baisse > 3 % = site modifié |
Le mémo de dépannage
| Scénario | Cause la plus probable | Première action |
|---|---|---|
Échec total, systématiquement ERROR_WRONG_USER_KEY |
Clé API invalide | Revérifiez la clé API |
| Déclin progressif sur plusieurs jours | Dégradation des proxys | Faites tourner les proxys |
| Chute brutale à zéro | Sitekey ou page modifiée | Réextrayez les paramètres CAPTCHA |
| Tokens résolus mais rejetés | Expiration du token ou domaine incohérent | Vérifiez le timing et pageurl |
| Fonctionne en test, échoue en cible | Restrictions propres au site | Comparez les paramètres entre les deux sites |
Quand ouvrir un ticket d'assistance
Ouvrez un ticket CaptchaAI seulement une fois les vérifications passées, et si l'un de ces cas persiste :
- toutes les vérifications sont vertes mais le taux reste bas ;
- le taux d'
ERROR_CAPTCHA_UNSOLVABLEdépasse 20 % sur des sitekeys qui fonctionnaient la veille ; - le solde est correct mais les résolutions échouent quand même ;
- le problème dure depuis plus de 2 heures.
Joignez à votre demande le type de CAPTCHA et le sitekey, l'URL du site cible, la distribution des erreurs issue du script, l'heure de début du problème et toute modification récente de votre code.
FAQ
Comment distinguer un problème venant de mon code de celui du service CaptchaAI ?
Lancez le script de mesure sur un sitekey de test stable. S'il résout correctement, le service fonctionne et la régression vient de votre intégration ou du site cible. S'il échoue aussi, testez ensuite sans proxy pour écarter vos IP.
Que signifie un taux de tokens rejetés élevé ?
La résolution réussit mais le site refuse le token. Trois causes classiques : le token expire avant l'injection, le pageurl ne correspond pas au domaine réel, ou le proxy est banni. Commencez par le timing, c'est le plus fréquent.
Faut-il vraiment tester sans proxy pour diagnostiquer ?
Oui, quand le type le permet. C'est le moyen le plus rapide de confirmer ou d'écarter le proxy : si le taux remonte sans proxy, le problème vient de vos IP, pas du service ni du site.
CaptchaAI prend-il en charge hCaptcha si un site migre vers ce type ?
Non — hCaptcha et FunCaptcha (Arkose Labs) ne sont pas pris en charge. Si un site cible bascule vers l'un de ces formats, aucun réglage ne rétablira le taux tant qu'il reste en place ; il faut alors revoir la stratégie côté site.
Articles connexes
- Surveiller le taux de résolution avec des SLI/SLO
- Suivre les tendances de performance en séries temporelles
- Diagnostiquer une baisse du taux de réussite
Prochaines étapes
Gardez votre pipeline CAPTCHA en bonne santé — récupérez votre clé API CaptchaAI.
Guides associés :