ERROR_GOOGLEKEY und ERROR_PAGEURL beim Einreichen beheben

Kurze Antwort: ERROR_GOOGLEKEY bedeutet, dass der Wert googlekey abgelehnt wurde, den Sie gesendet haben, und ERROR_PAGEURL bedeutet, dass der Wert pageurl abgelehnt wurde. Beide kommen von /in.php beim Einreichen, es wurde also keine Aufgabe angelegt und es gibt keine Captcha-ID zum Abfragen. In neun von zehn Fällen liegt es am Parameternamen: reCAPTCHA will googlekey, Turnstile will sitekey, und wer den falschen sendet, bekommt genau das. So unterscheiden Sie die beiden und beheben jeden Fall.
Was die beiden Codes tatsächlich prüfen
| Code | Dokumentierte Bedeutung | Welcher Parameter |
|---|---|---|
ERROR_GOOGLEKEY | Ungültig googlekey -Parameter ist ungültig | Der sitekey, den Sie von der Seite lesen |
ERROR_PAGEURL | Ungültig pageurl -Parameter ist ungültig | Die URL der Seite, auf der das Widget sitzt |
Das sind Validierungsfehler, keine Lösungsfehler. Es wurde noch nichts versucht und nichts steht in der Warteschlange.
Einreichzeit, nicht Abfragezeit
Diese Unterscheidung spart viel Debugging. Die API hat zwei Stufen, und jede erzeugt ihre eigene Fehlerfamilie.
# Stage 1: submit. These codes appear HERE. curl -X POST http://127.0.0.1:8080/in.php \ -d "key=YOUR_API_KEY" -d "method=userrecaptcha" \ -d "sitekey=YOUR_SITEKEY" \ -d "pageurl=https://example.com/page-with-recaptcha" ERROR_GOOGLEKEY # no ID came back, so there is nothing to poll
Vergleichen Sie das mit einem gesunden Einreichen, das OK|2122988149 zurückgibt und dann, wenn überhaupt, erst bei /res.phpscheitert. Ein Fehlschlag zur Abfragezeit heißt, dass Ihre Parameter akzeptiert wurden und die Lösung selbst nicht geklappt hat, was eine völlig andere Untersuchung ist. Siehe ERROR_CAPTCHA_UNSOLVABLE dazu, und ERROR_KEY_DOES_NOT_EXIST , falls der Schlüssel selbst schon vor beiden Prüfungen abgelehnt wird.
Warum der Wert abgelehnt wird
Drei Ursachen decken fast alle Fälle ab, in dieser Reihenfolge.
Ursache eins: googlekey gegen sitekey
Die 2captcha-kompatible API verwendet je Methode einen anderen Parameternamen, und die sind nicht austauschbar.
| Methode | Schlüsselparameter | Falscher Name ergibt |
|---|---|---|
userrecaptcha | googlekey | ERROR_GOOGLEKEY |
turnstile | sitekey | ERROR_BAD_PARAMETERS |
geetest | gt plus challenge | ERROR_BAD_PARAMETERS |
Die Falle: Im Gespräch nennen alle den Wert sitekey, und das HTML-Attribut heißt bei reCAPTCHA wie bei Turnstile buchstäblich data-sitekey . Nur der Einreich-Parameter von reCAPTCHA ist nach Google benannt. Wenn Sie einen funktionierenden Turnstile-Aufruf kopiert und dabei method zu userrecaptchageändert haben, ist das Ihr Fehler.
Die SDKs verbergen den Unterschied vollständig. solver.recaptcha(sitekey, url) und solver.turnstile(sitekey, url) nehmen dasselbe erste Argument und bilden es für Sie auf den richtigen Namen auf der Leitung ab, was ein guter Grund ist, eines davon zu nutzen.
Ursache zwei: Der Schlüssel ist veraltet, abgeschnitten oder leer
Wenn der Parametername stimmt, ist der Wert selbst der nächste Verdächtige.
- Sie haben ihn fest einkodiert. Seiten wechseln ihre sitekeys. Eine Konstante, die letzten Monat funktionierte, kann heute tot sein.
- Er stammt aus zwischengespeichertem Seitenquelltext. Die Quelltextansicht im Browser kann Ihnen eine ältere Kopie liefern als die, aus der das Widget tatsächlich gerendert wurde.
- Sie haben das falsche Attribut gegriffen. Der Wert steht in
data-sitekey, nicht inid,nameoder im iframe-Attributtitle. - Eine Shell-Variable hat einen Zeilenumbruch mitgebracht. Kommandosubstitution behält abschließende Leerzeichen, und Leerzeichen gehören nicht zu einem gültigen Schlüssel.
- Er ist leer. Eine nicht gesetzte Variable expandiert zu nichts, und die Anfrage geht raus mit
googlekey=.
Lesen Sie ihn aus dem lebenden DOM, statt einer Konstante zu vertrauen:
// Run in the page, or via your automation tool's evaluate().
// reCAPTCHA and Turnstile both expose it as data-sitekey.
const recaptchaKey = document.querySelector('.g-recaptcha')?.dataset.sitekey;
const turnstileKey = document.querySelector('.cf-turnstile')?.dataset.sitekey;
// Fallback: reCAPTCHA also carries it as k= in the widget iframe URL.
const iframe = document.querySelector('iframe[src*="/recaptcha/"]');
const fromSrc = iframe ? new URL(iframe.src).searchParams.get('k') : null;
console.log(recaptchaKey || fromSrc);The k= -Fallback ist auf Seiten wichtig, die das Widget per JavaScript rendern und nie ein .g-recaptcha -Element im DOM hinterlassen.
Ursache drei: Was eine pageurl ungültig macht
ERROR_PAGEURL ist ein engeres Problem und meist mechanisch.
- Kein Schema.
example.com/loginist keine URL. Senden Siehttps://example.com/login. - Ein relativer Pfad.
/loginist das, was Ihr Scraper zur Hand hatte, nicht das, was die API braucht. - GET-Abschneidung. Wenn die Seiten-URL eine eigene Query-Zeichenkette enthält und Sie sie unkodiert per GET einreichen, wird alles nach dem ersten Und-Zeichen als Parameter Ihres API-Aufrufs gelesen. Nehmen Sie POST, oder nutzen Sie
--data-urlencode. - Leerzeichen oder Anführungszeichen. Eine aus einer Konfigurationsdatei gelesene URL kann in Anführungszeichen ankommen, die nie entfernt wurden.
Die URL muss von der Maschine, auf der CapSkip läuft, nicht erreichbar sein, und sie muss nicht die URL sein, an die Sie das Formular am Ende schicken. Sie muss die Seite sein, in die das Widget eingebettet ist, denn daran wird das Token gebunden.
Wie das aus einem SDK aussieht
Die SDKs prüfen offensichtliche Probleme, bevor irgendetwas Ihren Prozess verlässt, und reichen den Rest durch. Zwei verschiedene Ausnahmen, zwei verschiedene Lösungen.
# pip install capskip
from capskip import CapSkip, ApiException, ValidationException
solver = CapSkip(host="127.0.0.1", port=8080)
try:
result = solver.recaptcha(
sitekey=sitekey_from_dom,
url="https://example.com/page-with-recaptcha",
)
except ValidationException:
# Caught locally: empty sitekey, malformed URL, missing argument.
print("fix the values before sending")
except ApiException as e:
# Came back from the API: GOOGLEKEY or PAGEURL rejected.
print(f"rejected at submit: {e}")A ValidationException heißt, Sie haben die API nie erreicht. Eine ApiException mit einem dieser Codes heißt, Sie haben sie erreicht, und der Wert wurde abgewiesen. Dieselbe Idee in C#, wobei der Basistyp die Arbeit macht:
using CapSkip;
var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);
try
{
var result = await solver.RecaptchaAsync(sitekey, pageUrl);
}
catch (ApiException ex)
{
// ERROR_GOOGLEKEY or ERROR_PAGEURL arrives here.
Console.WriteLine(ex.Message);
}
catch (CapSkipError ex)
{
// Everything else the SDK can throw.
Console.WriteLine(ex.Message);
}Eine Zwei-Minuten-Checkliste
- Geben Sie den exakten Anfrage-Body aus, den Sie senden. Nicht die Variablen, den Body.
- Gleichen Sie den Parameternamen mit der Methode ab:
googlekeyfür reCAPTCHA,sitekeyfür Turnstile. - Prüfen Sie, dass der Wert nicht leer ist und keinen abschließenden Zeilenumbruch hat.
- Lesen Sie den sitekey erneut von der lebenden Seite und vergleichen Sie ihn mit dem gesendeten.
- Prüfen Sie, dass
pageurlmit einem der folgenden Präfixe beginnt:http://oderhttps://. - Stellen Sie den Aufruf auf POST um, wenn die Seiten-URL eine Query-Zeichenkette hat.
Schritt eins löst das häufiger als die anderen fünf zusammen, weil die Abweichung meist zwischen dem liegt, was Sie zu senden glauben, und dem, was auf der Leitung ist.
Verwandte Codes und was sie stattdessen bedeuten
| Code | Bedeutet |
|---|---|
ERROR_WRONG_USER_KEY | Der API-Schlüssel fehlt oder ist leer, wird vor beiden geprüft |
ERROR_WRONG_METHOD | The method oder action -Wert ist keiner, den die API kennt |
ERROR_BAD_PARAMETERS | Ein für diese Methode erforderlicher Parameter fehlt ganz |
ERROR_CAPTCHA_UNSOLVABLE | Das Einreichen hat geklappt, die Lösung nicht. Abfragezeit, nicht Einreichzeit |
CAPCHA_NOT_READY | Kein Fehler. Dieselbe ID weiter abfragen |
Jeder Code mit seinem genauen Wortlaut steht in der API-Dokumentation.
Häufig gestellte Fragen
Soll ich nach ERROR_GOOGLEKEY erneut versuchen?
Nein. Dieselben Werte werden jedes Mal gleich abgelehnt, eine Wiederholungsschleife verschwendet also nur Zeit und verdeckt das eigentliche Problem. Korrigieren Sie den Wert und reichen Sie einmal ein. Wiederholen ist die richtige Antwort auf einen Fehlschlag zur Abfragezeit, nicht zur Einreichzeit.
Mein sitekey stimmt und wird trotzdem abgelehnt. Was jetzt?
Suchen Sie zuerst nach unsichtbarem Schaden: ein abschließender Zeilenumbruch aus einer Kommandosubstitution, Anführungszeichen aus einer Konfigurationsdatei oder ein Wert, den eine Datenbankspalte fester Breite abgeschnitten hat. Geben Sie die Länge der Zeichenkette aus, die Sie senden. Ein normaler reCAPTCHA-sitekey hat 40 Zeichen, alles Kürzere wurde also irgendwo abgeschnitten.
Muss die pageurl öffentlich erreichbar sein?
Nein. Sie benennt die Seite, zu der das Widget gehört, eine Seite hinter einem Login funktioniert also. Was sie nicht sein darf, ist ein Platzhalter: Eine andere Domain als die, auf der das Widget läuft, ergibt ein Token, das die Seite ablehnt, selbst wenn das Einreichen klappt.
Liefern Turnstile-Lösungen jemals ERROR_GOOGLEKEY?
Sollten sie nicht, denn die Methode turnstile liest nie einen Parameter googlekey . Kommt er von einem Turnstile-Aufruf zurück, heißt das fast immer, dass method noch auf userrecaptcha aus einer kopierten Anfrage steht. Korrigieren Sie die Methode und senden Sie dann sitekey statt googlekey.
Zusammenfassung
Betrachten Sie error_googlekey und ERROR_PAGEURL als Tippfehler und nicht als Fehlschläge. Es wurde keine Aufgabe angelegt, kein Versuch gemacht, und nichts muss wiederholt werden. Gleichen Sie den Parameternamen mit der Methode ab, lesen Sie den sitekey aus dem lebenden DOM statt aus einer Konstante, und senden Sie eine Seiten-URL samt Schema. Vollständige Parametertabellen für jede Methode stehen auf der Seite reCAPTCHA-Löser .
Das zu debuggen ist günstig mit einem unbegrenzter Captcha-Löser , der lokal läuft. Abgelehnte Einreichungen verbrennen kein Guthaben und verbrauchen kein Kontingent, Sie können dieselbe Anfrage also zwanzigmal abfeuern, während Sie eingrenzen, welches Zeichen falsch ist.
