Referenz

Migration von EndCaptcha zu CaptchaAI: API-Zuordnungshandbuch

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

Kommentare sind für diesen Artikel deaktiviert.