Referenz

EndCaptcha zu CaptchaAI migrieren: API-Endpunkte zuordnen

Der Wechsel von EndCaptcha zu CaptchaAI ist technisch überschaubar: Im Kern tauschen Sie zwei Endpunkte und ein Authentifizierungsmodell aus. EndCaptcha arbeitet mit einer SOAP/XML-Schnittstelle und einer Benutzername-Passwort-Anmeldung; CaptchaAI nutzt eine schlanke REST-API mit den Endpunkten in.php und res.php sowie einem einzelnen API-Schlüssel. Wer seinen Solver-Aufruf sauber gekapselt hat, ist die eigentliche Umstellung meist in wenigen Stunden durch – und kann beide Dienste vorher im Parallelbetrieb gegeneinander messen.

Dieser Leitfaden ordnet jeden EndCaptcha-Aufruf seinem CaptchaAI-Äquivalent zu – Endpunkte, Parameter, Antwortformat, Fehlercodes – und schließt mit Checkliste und Praxisbeispiel für einen risikoarmen Umstieg.

Was sich bei der Migration konkret ändert

Drei Dinge ändern sich beim Umstieg, alles andere bleibt Ihrer Anwendungslogik überlassen:

  • Endpunkte: Aus /Captcha/Upload und /Captcha/GetText werden in.php (Übermittlung) und res.php (Ergebnisabfrage).
  • Authentifizierung: Das Benutzername-Passwort-Paar entfällt; stattdessen übergeben Sie bei jedem Request Ihren API-Schlüssel als key.
  • Antwortformat: EndCaptchas benutzerdefiniertes XML/JSON weicht dem einheitlichen Muster {"status": 1, "request": "..."}.

Polling-Rhythmus, Wiederholungslogik und Proxy-Konfiguration übernehmen Sie weitgehend.

API-Architektur im Vergleich

Auf Protokollebene wird die Schnittstelle schlanker: keine WSDL, kein XML-Parsing, sondern HTTP-Requests mit JSON-Antwort.

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/benutzerdefiniert JSON (json=1) oder einfacher Text

Parameter zuordnen

Die meisten Parameter haben ein direktes Gegenstück; einige heißen anders oder entfallen.

EndCaptcha-Parameter CaptchaAI-Parameter Hinweis
username key CaptchaAI nutzt einen einzelnen API-Schlüssel
password Nicht erforderlich; der API-Schlüssel deckt die Auth ab
captchaData (base64) body (base64) Identische Base64-Bilddaten
captchaType method Andere Typbezeichner
siteKey googlekey Für reCAPTCHA-Typen
pageUrl pageurl Gleiches Konzept, andere Schreibweise
captchaId id Task-ID für die Statusabfrage

CAPTCHA-Typen zuordnen

EndCaptcha-Typ CaptchaAI-Methode CaptchaAI-Parameter
Bild-CAPTCHA (OCR) method=base64 body={base64_image}
reCAPTCHA v2 method=userrecaptcha googlekey, pageurl
reCAPTCHA v3 method=userrecaptcha googlekey, pageurl
Cloudflare Turnstile method=turnstile sitekey, pageurl

Wichtig für Umsteiger: EndCaptcha bot Lösungen für hCaptcha an – CaptchaAI unterstützt hCaptcha derzeit nicht, dafür gibt es also keine Migration. Abgedeckt sind reCAPTCHA v2/v3 (inkl. Enterprise), Cloudflare Turnstile und Challenge, GeeTest v3, Bild-/OCR- und Raster-CAPTCHAs sowie BLS; CaptchaFox, Friendly Captcha und Lemin laufen in der Beta, GeeTest v4 ist noch nicht verfügbar. Prüfen Sie vor dem Wechsel, ob Ihre aktiven Typen dabei sind.

Codemigration

Die Beispiele zeigen dieselbe Aufgabe – Bild-CAPTCHA lösen – vorher (EndCaptcha) und nachher (CaptchaAI). Die Ablaufstruktur bleibt gleich: übermitteln, Task-ID merken, Status abfragen.

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)

Statt Benutzername und Passwort geht nur noch key mit; das Ergebnis prüfen Sie über status und request.

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 mit CaptchaAI

Token-CAPTCHAs brauchen länger: Erhöhen Sie das Polling-Fenster (hier 60 statt 30 Durchläufe) und übergeben Sie den Sitekey als googlekey.

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)

Die Node.js-Fassung übergibt die Parameter als Query-String; die Kontrollstruktur bleibt identisch.

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" };
}

Weitere Unterschiede im Betrieb

Bereich EndCaptcha CaptchaAI
Authentifizierung Benutzername-Passwort-Paar Einzelner API-Schlüssel
Fehlerformat Benutzerdefiniertes JSON mit Feld error Standardfeld request mit Fehlercodes
Statusabfrage POST an separaten Endpunkt GET an res.php mit Query-Parametern
Guthaben prüfen Separate SOAP-Methode res.php?action=getbalance&key=KEY
Fehllösung melden Separate Methode res.php?action=reportbad&id=ID&key=KEY

Abrechnung: pro Thread statt pro Lösung

Ein Detail, das bei der Migration oft untergeht: CaptchaAI rechnet nicht pro gelöstem CAPTCHA ab, sondern pro gleichzeitigem Thread. Ein Thread ist eine laufende Lösung; sobald sie fertig ist, nimmt derselbe Thread die nächste Aufgabe. Jeder Tarif enthält unbegrenzte Lösungen pro Thread – keine Tageslimits, keine Aufschläge nach CAPTCHA-Typ.

Der Einstieg beginnt bei BASIC (15 $/Monat, 5 Threads), gefolgt von STANDARD (30 $/Monat, 15 Threads) und ADVANCE (90 $/Monat, 50 Threads); nach oben reicht die Skala über PREMIUM und CORPORATE bis zu den VIP-Tarifen. Für Teams mit volumenabhängigem EndCaptcha-Modell ist das planbar: Die Kosten hängen an der Parallelität, nicht am Volumen. (Preise in US-Dollar.)

Checkliste für die Migration

Schritt Status
CaptchaAI-Konto erstellen
Alle EndCaptcha-Aufrufe CaptchaAI-Äquivalenten zuordnen
Authentifizierung ersetzen (Benutzername/Passwort → API-Schlüssel)
Übermittlungsendpunkt aktualisieren (/Captcha/Upload/in.php)
Abfrageendpunkt aktualisieren (/Captcha/GetText/res.php)
Antwort-Parsing auf status/request umstellen
Parallelbetrieb mit beiden Anbietern durchführen
Produktions-Traffic umschalten
EndCaptcha-Anmeldedaten entfernen

Parallelbetrieb: sicher umsteigen

Stellen Sie nicht schlagartig um. Der bewährte Weg ist ein Parallelbetrieb: Beide Solver laufen einige Tage gleichzeitig, und Sie vergleichen Erfolgsquote, Lösungszeit und Fehlercodes auf Ihren realen Workflows.

Ein typisches DACH-Setup: Ein Scraping-Team betreibt seine Worker auf Hetzner- oder netcup-VPS und stößt die Jobs über eine GitLab-CI-Pipeline an. Kapseln Sie den Solver-Aufruf hinter einer gemeinsamen Funktion und schalten Sie per Feature-Flag zwischen EndCaptcha und CaptchaAI um. So leiten Sie erst einen Teil des Traffics (etwa 10 %) auf CaptchaAI und erhöhen den Anteil schrittweise.

Bei Scraping- und Proxy-Themen gilt die DSGVO: IP-Adressen sind personenbezogene Daten. Prüfen Sie Datenflüsse und Rechtsgrundlage – Sorgfaltspflicht des Betreibers, keine Aussage über CaptchaAI.

Fehlerbehebung

Problem Ursache Lösung
ERROR_KEY_DOES_NOT_EXIST EndCaptcha-Benutzername statt API-Schlüssel verwendet API-Schlüssel aus dem CaptchaAI-Dashboard einsetzen
Antwort lässt sich nicht parsen Anderes JSON-Schema als bei EndCaptcha Auf die Felder status und request umstellen
method-Parameter fehlt EndCaptcha nutzt nummerierte captchaType-Werte Auf CaptchaAI-Methodennamen abbilden (base64, userrecaptcha …)
Timeout bei reCAPTCHA Token-CAPTCHAs brauchen länger als Bild-CAPTCHAs Polling auf 60 × 5 Sekunden erhöhen

Häufige Fragen

Wie lange dauert die Migration von EndCaptcha zu CaptchaAI?

Meist wenige Stunden. Ist Ihr Solver-Aufruf gekapselt, tauschen Sie nur zwei Endpunkte, das Auth-Modell und das Antwort-Parsing aus. Planen Sie zusätzlich einige Tage Parallelbetrieb ein, bevor Sie EndCaptcha abschalten.

Was kostet CaptchaAI im Vergleich zu EndCaptcha?

CaptchaAI rechnet Thread-basiert ab, nicht pro Lösung. Der Einstieg liegt bei BASIC (15 $/Monat, 5 Threads) mit unbegrenzten Lösungen pro Thread. Statt volumenabhängigem Verbrauch zahlen Sie einen planbaren Monatspreis, der von Ihrer Parallelität abhängt. Preise in US-Dollar.

Was passiert mit meinen hCaptcha-Aufgaben?

Dafür gibt es keine Migration: hCaptcha wird von CaptchaAI derzeit nicht unterstützt, ebenso wenig FunCaptcha. Abgedeckt sind reCAPTCHA v2/v3 (inkl. Enterprise), Cloudflare Turnstile und Challenge, GeeTest v3, Bild-/OCR- und Raster-CAPTCHAs sowie BLS; CaptchaFox, Friendly Captcha und Lemin laufen in der Beta. Prüfen Sie vor dem Wechsel, ob Ihre aktiven Typen dabei sind.

Kann ich beide Dienste parallel betreiben?

Ja, und genau das empfiehlt sich. Über ein Feature-Flag leiten Sie einen Teil des Traffics auf CaptchaAI und vergleichen die Metriken auf echten Workflows, bevor Sie vollständig umstellen.

Verwandte Leitfäden

Kommentare sind für diesen Artikel deaktiviert.