Contents
EndCaptcha verwendet eine SOAP/XML-based-API mit eindeutigen Methodennamen. CaptchaAI verwendet eine einfachere REST-API mit in.php/BEISPIEL_TOKEN-Endpunkten. Dieser Leitfaden ordnet jeden EndCaptcha-Aufruf seinem CaptchaAI-Äquivalent zu.
Unterschied in der API-Architektur
Aspekt
EndCaptcha
CaptchaAI
Protokoll
SOAP/XML oder HTTP POST
HTTP POST/GET (REST)
Senden
/Captcha/Upload oder WSDL
https://ocr.captchaai.com/in.php
Ergebnis
/Captcha/GetText oder WSDL
https://ocr.captchaai.com/res.php
Auth
Benutzername + Passwort
API-Schlüssel
Antwort
XML/custom
JSON (json=1) oder einfacher Text
Parameterzuordnung
EndCaptcha-Parameter
CaptchaAI-Parameter
Notizen
username
key
CaptchaAI verwendet einen einzelnen API-Schlüssel
password
—
Nicht erforderlich; Der API-Schlüssel deckt die Authentifizierung ab
captchaData (base64)
body (base64)
Gleiche Base64-Bilddaten
captchaType
method
Verschiedene Typbezeichner
siteKey
googlekey
Für reCAPTCHA-Typen
pageUrl
pageurl
Gleiches Konzept, anderes Gehäuse
captchaId
id
Aufgaben-ID für die Abfrage
CAPTCHA-Typzuordnung
EndCaptcha-Typ
CaptchaAI-Methode
CaptchaAI-Parameter
Bild-CAPTCHA
method=base64
body={base64_image}
reCAPTCHA v2
method=userrecaptcha
googlekey, pageurl
hCaptcha
method=hcaptcha
sitekey, pageurl
Codemigration Python – Vorher (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 – Nachher (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 – Vorher (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 – Nachher (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" };
}
Wichtige Unterschiede, die es zu beachten gilt
Bereich
EndCaptcha
CaptchaAI
Authentifizierung
Benutzername + Passwort-Paar
Einzelner API-Schlüssel
Fehlerformat
Benutzerdefiniertes JSON mit dem Feld error
Standardfeld request mit Fehlercodes
Umfrage
POST an separaten Endpunkt senden
GET zu res.php mit Abfrageparametern
Kontostandsprüfung
Separate SOAP-Methode
res.php?action=getbalance&key=KEY
Schlecht melden
Separate Methode
res.php?action=reportbad&id=ID&key=KEY
Checkliste für die Migration
Schritt
Status
Erstellen Sie ein CaptchaAI-Konto
☐
Ordnen Sie alle EndCaptcha-Aufrufe CaptchaAI-Äquivalenten zu
☐
Authentifizierung ersetzen (Benutzername/password → API-Schlüssel)
☐
Übermittlungsendpunkt aktualisieren (/Captcha/Upload → /in.php)
☐
Umfrageendpunkt aktualisieren (/Captcha/GetText → /res.php)
☐
Antwortanalyse aktualisieren
☐
Führen Sie einen parallelen Test mit beiden Anbietern durch
☐
Wechseln Sie den Produktionsverkehr
☐
EndCaptcha-Anmeldeinformationen entfernen
☐
Fehlerbehebung
Problem
Ursache
Lösung
Ergebnis passt nicht zum eigenen Fall
Solver-Typ oder Eingabeparameter wurden falsch auf den Zieltyp gemappt
Vergleiche Zielseite, Solver-Methode und Pflichtparameter noch einmal systematisch
Beispiel läuft, aber Produktion scheitert
Session, Header oder Proxy-Kontext weichen vom Test ab
Übertrage erfolgreiche Testbedingungen möglichst unverändert in den Live-Workflow
Fehler bleiben unklar
Logs enthalten zu wenig Kontext für eine belastbare Diagnose
Protokolliere Solver-Typ, Latenz, Fehlercode und Downstream-Reaktion gemeinsam
Verwandte Leitfäden