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) devienthttps://ocr.captchaai.com/in.php. - Résultat :
/Captcha/GetText(ou WSDL) devienthttps://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 CAPTCHA →
method=base64avecbody={base64_image}. - reCAPTCHA v2 →
method=userrecaptchaavecgooglekeyetpageurl. - Cloudflare Turnstile →
method=turnstileavecsitekeyetpageurl. - 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
requeststandardisé avec des codes d'erreur, là où EndCaptcha exposait un champerrorpropriétaire. - Interrogation : un GET vers
res.phpavec 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 :
- La référence de correspondance des endpoints d'API
- Migrer depuis AZCaptcha
- Les tests en parallèle avant bascule