Reference

Migrer de EndCaptcha vers CaptchaAI : guide de mappage d'API

La migration d'EndCaptcha vers CaptchaAI tient en une idée : vous remplacez des appels SOAP/XML authentifiés par identifiant et mot de passe par de simples requêtes REST signées avec une clé API. Les endpoints in.php et res.php couvrent la soumission et l'interrogation du résultat. Ce guide établit la correspondance appel par appel.

SOAP côté EndCaptcha, REST côté CaptchaAI

La première différence est structurelle : EndCaptcha sépare soumission et récupération par des méthodes dédiées ; CaptchaAI en expose deux, REST.

  • Protocole : SOAP/XML ou POST HTTP côté EndCaptcha ; REST (POST/GET) côté CaptchaAI.
  • Soumission : /Captcha/Upload (ou WSDL) devient https://ocr.captchaai.com/in.php.
  • Résultat : /Captcha/GetText (ou WSDL) devient https://ocr.captchaai.com/res.php.
  • Authentification : la paire identifiant + mot de passe cède la place à une clé API unique.
  • Réponse : XML propriétaire d'un côté, JSON (json=1) ou texte brut de l'autre.

Correspondance des paramètres d'API

Chaque paramètre EndCaptcha a un équivalent direct. Le changement le plus visible : l'identifiant et le mot de passe cèdent la place à une clé API unique dans key.

Paramètre EndCaptcha Paramètre CaptchaAI Remarques
username key CaptchaAI n'utilise qu'une seule clé API
password Inutile ; la clé API porte l'authentification
captchaData (base64) body (base64) Mêmes données d'image en base64
captchaType method Identifiants de type différents
siteKey googlekey Pour les types reCAPTCHA
pageUrl pageurl Même concept, casse différente
captchaId id ID de tâche pour l'interrogation

Types de CAPTCHA équivalents

Les identifiants numériques d'EndCaptcha (captchaType) deviennent des noms de méthode explicites :

  • Image CAPTCHAmethod=base64 avec body={base64_image}.
  • reCAPTCHA v2method=userrecaptcha avec googlekey et pageurl.
  • Cloudflare Turnstilemethod=turnstile avec sitekey et pageurl.
  • hCaptcha et FunCaptcha (Arkose Labs) : non pris en charge par CaptchaAI ; prévoyez une autre approche si votre flux en dépendait.

Réécrire le code : avant et après

Python — avant (EndCaptcha)

import requests

USERNAME = "your_endcaptcha_user"
PASSWORD = "your_endcaptcha_pass"

def solve_image_endcaptcha(image_base64):
    # EndCaptcha image solve
    resp = requests.post("https://api.endcaptcha.com/Captcha/Upload", data={
        "username": USERNAME,
        "password": PASSWORD,
        "captchaData": image_base64,
        "captchaType": "1"
    })
    result = resp.json()
    captcha_id = result.get("captchaId")

    import time
    for _ in range(30):
        time.sleep(5)
        poll = requests.post("https://api.endcaptcha.com/Captcha/GetText", data={
            "username": USERNAME,
            "password": PASSWORD,
            "captchaId": captcha_id
        })
        poll_result = poll.json()
        if poll_result.get("text"):
            return {"solution": poll_result["text"]}
        if poll_result.get("error"):
            return {"error": poll_result["error"]}

    return {"error": "TIMEOUT"}

Python — après (CaptchaAI)

import os
import time
import requests

API_KEY = os.environ["CAPTCHAAI_API_KEY"]

def solve_image_captchaai(image_base64):
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "base64",
        "body": image_base64,
        "json": 1
    })
    data = resp.json()
    if data.get("status") != 1:
        return {"error": data.get("request")}

    captcha_id = data["request"]

    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": captcha_id,
            "json": 1
        }).json()
        if result.get("status") == 1:
            return {"solution": result["request"]}
        if result.get("request") != "CAPCHA_NOT_READY":
            return {"error": result.get("request")}

    return {"error": "TIMEOUT"}

Python — reCAPTCHA v2 (CaptchaAI)

def solve_recaptcha_v2(sitekey, pageurl):
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1
    })
    data = resp.json()
    if data.get("status") != 1:
        return {"error": data.get("request")}

    captcha_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get",
            "id": captcha_id, "json": 1
        }).json()
        if result.get("status") == 1:
            return {"solution": result["request"]}
        if result.get("request") != "CAPCHA_NOT_READY":
            return {"error": result.get("request")}

    return {"error": "TIMEOUT"}

JavaScript — avant (EndCaptcha)

const axios = require("axios");

const USERNAME = "your_endcaptcha_user";
const PASSWORD = "your_endcaptcha_pass";

async function solveImageEndCaptcha(imageBase64) {
  const submit = await axios.post("https://api.endcaptcha.com/Captcha/Upload", {
    username: USERNAME,
    password: PASSWORD,
    captchaData: imageBase64,
    captchaType: "1",
  });
  const captchaId = submit.data.captchaId;

  for (let i = 0; i < 30; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const poll = await axios.post("https://api.endcaptcha.com/Captcha/GetText", {
      username: USERNAME,
      password: PASSWORD,
      captchaId,
    });
    if (poll.data.text) return { solution: poll.data.text };
    if (poll.data.error) return { error: poll.data.error };
  }
  return { error: "TIMEOUT" };
}

JavaScript — après (CaptchaAI)

const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;

async function solveImageCaptchaAI(imageBase64) {
  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: { key: API_KEY, method: "base64", body: imageBase64, json: 1 },
  });
  if (submit.data.status !== 1) return { error: submit.data.request };

  const captchaId = submit.data.request;

  for (let i = 0; i < 30; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const poll = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
    });
    if (poll.data.status === 1) return { solution: poll.data.request };
    if (poll.data.request !== "CAPCHA_NOT_READY") return { error: poll.data.request };
  }
  return { error: "TIMEOUT" };
}

Points de vigilance pendant la bascule

Quelques différences de comportement méritent une relecture attentive :

  • Authentification : une clé API unique remplace la paire identifiant + mot de passe.
  • Format d'erreur : CaptchaAI renvoie un champ request standardisé avec des codes d'erreur, là où EndCaptcha exposait un champ error propriétaire.
  • Interrogation : un GET vers res.php avec des paramètres de requête, au lieu d'un POST vers un endpoint distinct.
  • Vérification du solde : res.php?action=getbalance&key=KEY.
  • Signalement d'une résolution erronée : res.php?action=reportbad&id=ID&key=KEY.

Checklist de migration

Étape Statut
Créer un compte CaptchaAI
Recenser tous les appels EndCaptcha et leurs équivalents CaptchaAI
Remplacer l'authentification (identifiant/mot de passe → clé API)
Basculer l'endpoint de soumission (/Captcha/Upload/in.php)
Basculer l'endpoint d'interrogation (/Captcha/GetText/res.php)
Adapter l'analyse des réponses
Lancer un test en parallèle avec les deux fournisseurs
Basculer le trafic de production
Supprimer les identifiants EndCaptcha et purger les journaux qui les contiennent

Dépannage

Problème Cause Correctif
ERROR_KEY_DOES_NOT_EXIST Vous utilisez l'identifiant EndCaptcha au lieu de la clé API Utilisez la clé API CaptchaAI depuis le tableau de bord
L'analyse de la réponse échoue Structure JSON différente Vérifiez désormais les champs status et request
Paramètre method absent EndCaptcha numérote via captchaType Mappez vers les noms de méthode CaptchaAI (base64, userrecaptcha, etc.)
Timeout sur reCAPTCHA Délais par défaut différents Réglez l'interrogation sur 60 itérations × 5 secondes pour les CAPTCHA à token

FAQ

Combien de temps prend une migration d'EndCaptcha vers CaptchaAI ?

L'essentiel se résume à réécrire deux appels et l'analyse des réponses. Pour une intégration simple, comptez une demi-journée ; davantage avec plusieurs types de CAPTCHA ou une file de workers.

Puis-je faire tourner EndCaptcha et CaptchaAI en parallèle pendant la bascule ?

Oui, et c'est recommandé. Sur un pipeline de scraping hébergé chez OVHcloud ou Scaleway, déployez les workers CaptchaAI à côté de ceux d'EndCaptcha, envoyez-y un échantillon de trafic, comparez taux de réussite et temps de résolution, puis basculez par paliers.

CaptchaAI prend-il en charge hCaptcha comme EndCaptcha ?

Non — hCaptcha n'est pas encore pris en charge, et FunCaptcha (Arkose Labs) non plus. CaptchaAI couvre reCAPTCHA v2/v3, Cloudflare Turnstile et Challenge, GeeTest v3, ainsi que les CAPTCHA image/OCR et en grille.

Faut-il adapter ma configuration de proxy ?

Rarement. CaptchaAI accepte les paramètres proxy=user:pass@host:port et proxytype=HTTP|SOCKS5 ; vous transposez vos proxys existants sans les reconfigurer.

Comment CaptchaAI facture-t-il les résolutions ?

Par thread simultané, pas à la résolution : chaque forfait inclut des résolutions illimitées par thread sur le mois. Le forfait BASIC ($15/mois, 5 threads) suffit pour tester, facturation en dollars US.

Articles connexes

Prochaines étapes

Simplifiez votre résolution de CAPTCHA avec l'API REST de CaptchaAI : récupérez votre clé API et lancez votre migration dès aujourd'hui.

Guides associés :

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