Troubleshooting

Baisse du taux de résolution CAPTCHA : diagnostic de régression des performances

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_BALANCE renvoie à la facturation ;
  • ERROR_NO_SLOT_AVAILABLE renvoie à vos threads ;
  • ERROR_CAPTCHA_UNSOLVABLE renvoie 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-sitekey ou l'appel grecaptcha.render
  • Cloudflare Turnstile : data-sitekey dans le widget Turnstile
  • GeeTest : le paramètre gt dans 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_UNSOLVABLE dé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

Prochaines étapes

Gardez votre pipeline CAPTCHA en bonne santé — récupérez votre clé API CaptchaAI.

Guides associés :

Les commentaires sont désactivés pour cet article.