So beheben Sie ERROR_WRONG_USER_KEY und 3 weitere Request-Fehler

error_wrong_user_key - How to Fix ERROR_WRONG_USER_KEY and 3 Request Errors

error_wrong_user_key bedeutet, dass Ihr API-Schlüssel Ihren Code nie verlassen hat. Das ist die gesamte Diagnose, und es lohnt sich, das vorweg zu sagen, weil fast jeder es als „mein Schlüssel ist falsch“ liest und anfängt, einen neuen einzusetzen. Für einen Schlüssel, der falsch ist, hat CapSkip einen anderen Code. error_wrong_user_key und die drei daneben werden zurückgegeben, bevor der Löser überhaupt ein Captcha angesehen hat: Sie beschreiben die Form der HTTP-Anfrage, die Sie gesendet haben, nicht die Challenge, um die es dabei ging.

Die vier Codes und der, mit dem sie verwechselt werden

Sie kommen vom Submit-Endpunkt oder vom Poll-Endpunkt als reiner Text zurück, anstelle der üblichen OK-Antwort. Jeder von ihnen ist deterministisch. Eine identische Anfrage erneut zu senden liefert eine identische Antwort, eine Retry-Schleife um einen dieser Codes ist also verlorene Zeit. Die zweite Zeile unten ist der verwandte Code, der nicht zu den vieren gehört, denn diese beiden auseinanderzuhalten macht den Großteil der Arbeit aus.

CodeOffizielle BedeutungWas es in der Praxis bedeutet
ERROR_WRONG_USER_KEYAPI-Schlüssel fehlt oder ist leerDer Parameter key fehlte, oder er war mit leerem Wert vorhanden
ERROR_KEY_DOES_NOT_EXISTUngültiger API-SchlüsselEin Schlüssel kam an, und CapSkip erkennt ihn nicht
ERROR_WRONG_METHODUngültige HTTP-Methode oder ungültiger action-ParameterDer Wert von method ist keiner, den CapSkip kennt, oder action ist nicht get
ERROR_WRONG_ID_FORMATUngültiges Format der Captcha-IDDie id, mit der Sie gepollt haben, ist keine reine Zahl
ERROR_BAD_PARAMETERSFehlende oder ungültige PflichtparameterEin für diesen Captcha-Typ erforderliches Feld fehlt oder ist fehlerhaft

Die vollständige Liste, einschließlich der Codes für den Bild-Upload und der reCAPTCHA-spezifischen Codes, finden Sie in der CapSkip-API-Dokumentation.

ERROR_WRONG_USER_KEY: Der Schlüssel fehlt, er ist nicht falsch

Fehlend und ungültig sind zwei verschiedene Fehler mit zwei verschiedenen Lösungen, und CapSkip trennt sie mit Absicht. Wenn ein Schlüssel den Server erreicht hat und nicht erkannt wurde, erhalten Sie error_key_does_not_exist, beschrieben in dem Leitfaden zu diesem Code. Wenn Sie stattdessen error_wrong_user_key erhalten, ist nichts Erkennbares angekommen, hören Sie also auf, den Wert zu prüfen, und prüfen Sie stattdessen, ob er überhaupt gesendet wurde.

# No key parameter at all. This is what produces it.
curl -X POST \
  -d "method=userrecaptcha" \
  -d "googlekey=YOUR_SITEKEY" \
  -d "pageurl=https://example.com/page-with-recaptcha" \
  http://127.0.0.1:8080/in.php

ERROR_WRONG_USER_KEY

Vier Dinge verursachen ihn, ungefähr nach Häufigkeit geordnet:

  • Eine Umgebungsvariable, die dort, wo der Code läuft, nicht gesetzt ist. Eine Shell, die sie hat, und ein Dienst, der sie nicht hat: Das ist der Klassiker dieser Sorte. Der Wert wird als leere Zeichenkette gelesen, und der Client sendet key mit nichts dahinter.
  • Ein Schlüssel, der aus einer Konfigurationsdatei gelesen wird, die nicht zusammen mit dem Code ausgerollt wurde.
  • Ein selbst gebauter Client, der key nur dann hinzufügt, wenn eine Variable truthy ist, sodass eine leere Zeichenkette den Parameter stillschweigend fallen lässt.
  • Ein Client, der die Parameter irgendwohin schreibt, wo die Anfrage sie nicht mitträgt, etwa in einen JSON-Body an einem Endpunkt, der Formularfelder liest.

Geben Sie vor dem Aufruf die Länge des Werts aus statt des Werts selbst. Eine Länge von null sagt Ihnen, was Sie wissen müssen, und schreibt kein Credential in eine Logdatei.

Warum das erst auf einem Server anfängt

Und hier ist der Teil, der Leute verwirrt, die denselben Code seit Monaten betreiben. CapSkip verlangt den Schlüssel nur dann, wenn die API-Schlüssel-Validierung in der App eingeschaltet ist. Bei einer frischen lokalen Installation ist sie aus, eine Anfrage ganz ohne Schlüssel wird also angenommen, und nichts beschwert sich jemals. Ihr Client sendet möglicherweise seit dem Tag, an dem Sie ihn geschrieben haben, einen leeren Schlüssel.

Dann verlegen Sie den Löser auf einen Rechner, der nicht Ihr Schreibtisch ist. CapSkip hat zwei Verbindungsmodi: Der Lokal-Modus bindet an 127.0.0.1 und antwortet nur diesem Gerät, während der Server-Modus an Ihre Netzwerkadresse oder öffentliche IP bindet, sodass eine andere Maschine, ein VPS oder ein gehosteter Worker ihn über die API erreichen kann. Eine statische öffentliche IP hält die Adresse stabil. Beide werden beschrieben unter Verbindungseinstellungen. Die Schlüsselvalidierung bei diesem Schritt einzuschalten ist richtig, und es ist zugleich der Moment, in dem jeder schlummernde Schlüsselfehler in Ihrem Code auf einmal sichtbar wird. Es bleibt so oder so Ihre Hardware und bleibt ohne Verbrauchsabrechnung, das ist also eine Konfigurationsänderung und keine Änderung dessen, was Sie zahlen.

Wenn Sie Schlüssel an mehrere Worker verteilen, geben Sie jedem einen eigenen, damit sich ein einzelner Schlüssel widerrufen lässt, ohne die übrigen anzufassen. Diese Seite davon behandeln wir in dem Leitfaden zum Bereitstellen von Captcha-API-Schlüsseln.

ERROR_WRONG_ID_FORMAT: Sie haben wahrscheinlich die ganze Antwort gesendet

Dieser Code hat eine einzige dominante Ursache, und sie ist leicht zu erkennen, sobald man sie kennt. Der Submit-Endpunkt antwortet nicht mit einer reinen Zahl. Er antwortet mit OK und der id, getrennt durch einen Pipe-Strich, und ein Client, der diese Zeichenkette direkt in die Poll-Anfrage weitergibt, sendet eine id, die keine Zahl ist.

# What in.php actually returns:
OK|212

# Wrong. The whole reply went into id.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=OK|212"
ERROR_WRONG_ID_FORMAT

# Right. Split on the pipe and send the number.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=212"

Fordern Sie JSON an, dann wird das Parsen weniger anfällig, weil die id als Feld ankommt und nicht als Hälfte einer getrennten Zeichenkette. So oder so gilt: Prüfen Sie das Präfix, bevor Sie splitten, denn ein Fehlercode enthält keinen Pipe-Strich, und blindes Splitten gibt Ihnen den Fehlercode als id zurück.

# A hand rolled client has to do this itself. The SDK does not,
# which is most of why it is worth using.
reply = httpx.post(IN_URL, data=payload).text     # "OK|212"

if not reply.startswith("OK|"):
    raise RuntimeError(reply)                     # it is an error code

captcha_id = reply.split("|", 1)[1]               # "212"

Ein durchgerechnetes Beispiel für den rohen Anfrage- und Poll-Zyklus, mit derselben Behandlung des Trennzeichens, finden Sie in der Schritt-für-Schritt-Anleitung zum Lösen eines Captchas mit curl.

ERROR_WRONG_METHOD: das falsche Verb oder das falsche Wort

Zwei verschiedene Fehler teilen sich diesen Code, deshalb wirkt er so vage. Der erste ist das HTTP-Verb: Parameter, die als Formular-Body an einen Endpunkt gehen, den Sie mit GET aufgerufen haben, kommen nirgends an. Der zweite ist der Parameter method selbst, der einer der Werte sein muss, die CapSkip für den Typ kennt, den Sie lösen: post oder base64 für ein Bild, userrecaptcha für reCAPTCHA in beiden Versionen, turnstile für Cloudflare, geetest für GeeTest v3.

Zwei Schreibweisen machen den Großteil aus: sitekey an den reCAPTCHA-Endpunkt zu senden, der googlekey will, und recaptcha oder userecaptcha statt userrecaptcha zu senden. Derselbe Code deckt auch die Poll-Seite ab, wo action die wörtliche Zeichenkette get sein muss.

ERROR_BAD_PARAMETERS: Typ und Felder passen nicht zusammen

Die Methode wurde verstanden, und etwas dafür Erforderliches fehlte oder war fehlerhaft. Das gilt pro Typ, die nützliche Frage lautet also immer, welchen Typ CapSkip bei Ihnen erkannt hat.

  • reCAPTCHA braucht sowohl googlekey als auch pageurl, und pageurl muss die vollständige URL der Seite sein, auf der das Widget lädt, inklusive Schema.
  • reCAPTCHA v3 braucht version auf v3. invisible zusätzlich zu senden bedeutet ein v2-Feld in einer v3-Anfrage.
  • Turnstile-Challenge-Seiten brauchen neben dem sitekey auch data und pagedata. Der Widget-Modus braucht beides nicht.
  • GeeTest braucht gt und challenge zusammen, und challenge läuft nach etwa einer Minute ab, ein veralteter Wert scheitert also hier und nicht erst später.
  • Bild-Captchas brauchen file für einen Multipart-Upload oder body für base64, und niemals beides.

Loggen Sie den Payload, den Sie gleich senden, mit geschwärztem Schlüssel, und lesen Sie ihn gegen die Parametertabelle für diesen Typ. In neun von zehn Fällen steht die Antwort in dieser einen Zeile.

Die leere Antwort gehört nicht dazu

Ein Poll, der überhaupt nichts zurückgibt, ist eine andere Situation, und die sollte man benennen, weil eine leere Antwort für eine falsche id gehalten wird. Ein leerer Body heißt, dass das Ergebnis bereits abgeholt wurde oder dass die id nicht existiert. CapSkip lässt Sie ein Ergebnis genau einmal lesen. Eine Retry-Schleife, die Erfolg hat und dann erneut durchläuft, weil der Code das break vergessen hat, liest beim zweiten Mal eine leere Zeichenkette und meldet einen Fehlschlag für ein Captcha, das korrekt gelöst wurde.

Speichern Sie das Ergebnis gleich beim ersten Mal, wenn Sie es bekommen. Und verwechseln Sie eine leere Antwort nicht mit CAPCHA_NOT_READY, das ein normaler Polling-Zustand und kein Fehlschlag ist, beschrieben in dem Leitfaden zu dieser Antwort.

Diese Codes aus dem SDK auslesen

Alle vier Codes kommen als ApiException an, mit dem Code als Nachricht. Das ist die Exception, auf die Sie zuerst prüfen sollten, denn sie bedeutet, dass CapSkip Sie verstanden und abgelehnt hat, und das ist eine andere Klasse von Problem, als CapSkip gar nicht erreichen zu können.

# pip install capskip
from capskip import CapSkip, ApiException, NetworkException

solver = CapSkip(host="127.0.0.1", port=8080, apiKey=API_KEY)

try:
    token = solver.recaptcha(sitekey=SITEKEY, url=PAGE_URL)["code"]
except ApiException as err:
    # CapSkip answered and rejected the request. Do not retry.
    print("Rejected:", err)
except NetworkException as err:
    # CapSkip did not answer. Wrong host, wrong port, or not running.
    print("Unreachable:", err)

ValidationException sollten Sie hier ebenfalls kennen, denn sie feuert, bevor überhaupt etwas gesendet wird. Das SDK weist Parameter zurück, die für den angeforderten Typ falsch sind, ein Fehler, der über rohes HTTP als ERROR_BAD_PARAMETERS zurückgekommen wäre, wird also stattdessen lokal abgefangen, mit einer Meldung, die das Argument benennt. Das SDK hat insgesamt vier Exception-Typen: ApiException, NetworkException, TimeoutException und ValidationException. Jeder von ihnen leitet sich von einer Basis namens CapSkipError ab, falls Sie sie lieber an einer Stelle behandeln. Dieselben vier gibt es in den Node.js-, PHP- und C#-Clients, aufgeführt auf Die Seite zu den SDKs fürs Captcha-Lösen.

FAQ

Was ist der Unterschied zwischen ERROR_WRONG_USER_KEY und ERROR_KEY_DOES_NOT_EXIST?

Ob ein Schlüssel angekommen ist. Der erste bedeutet, dass der Parameter key fehlte oder leer war, sehen Sie also in Ihre Konfiguration und Ihren Request-Builder. Der zweite bedeutet, dass ein Schlüssel ankam und CapSkip ihn nicht erkennt, sehen Sie sich also den Wert an und prüfen Sie, welchen Schlüssel die App tatsächlich ausgibt.

Brauche ich überhaupt einen API-Schlüssel?

Nur wenn die API-Schlüssel-Validierung in der CapSkip-App eingeschaltet ist. Sie ist standardmäßig aus, und das ist auf einer Maschine in Ordnung, auf der der Löser nur Loopback beantwortet. Schalten Sie sie ein, bevor der Löser auf einer Netzwerkadresse lauscht, und senden Sie ab dann einen Schlüssel.

Sollte ich einen davon erneut versuchen?

Nein. Alle vier sind deterministisch, der zweite Versuch scheitert also genau wie der erste. Wiederholen Sie stattdessen die vorübergehenden Fehler: einen Verbindungsfehler, einen Polling-Timeout oder ein Captcha, das als unlösbar zurückkam. Eine fehlerhafte Anfrage zu wiederholen verbraucht Ihr Backoff-Budget nur für einen Bug.

Lokal lief alles, auf dem Server ging es kaputt. Warum?

Fast immer, weil mit dem Umzug die Schlüsselvalidierung eingeschaltet wurde und der Schlüssel nie wirklich gesendet wurde. Die zweithäufigste Ursache ist eine Umgebungsvariable, die in Ihrer Shell existiert, aber nicht in dem Dienst, der den Code ausführt. Prüfen Sie die Länge des Werts an der Stelle des Aufrufs.

Die Kurzfassung

Diese vier Codes handeln von Ihrer Anfrage, nicht vom Captcha. error_wrong_user_key heißt, dass im Parameter key nichts ankam, und das ist ein Konfigurationsproblem und kein falscher Wert. ERROR_WRONG_ID_FORMAT heißt fast immer, dass die per Pipe getrennte Antwort komplett hineingegeben wurde. ERROR_WRONG_METHOD bedeutet ein falsches Verb oder eine falsche Schreibweise, und ERROR_BAD_PARAMETERS bedeutet ein Feld, das nicht zu dem Typ gehört, den Sie angefordert haben. Keinen davon lohnt es zu wiederholen.

Die Parametertabellen, die jeden dieser Fälle klären, finden Sie auf der API-Dokumentationsseite. Den Python-Client, der die meisten Gelegenheiten beseitigt, dabei etwas falsch zu machen, finden Sie auf der Python-Captcha-Solver-Seite.

Beim Debuggen daran denken: CapSkip ist ein Captcha-Umgehung Tool, das auf Ihrer eigenen Hardware läuft, sodass eine fehlerhafte Anfrage, die Sie hundertmal senden, während Sie das Problem eingrenzen, Sie nichts kostet außer der Zeit.