Captcha-Token abgelaufen: Ursachen und Lösung
Ein Captcha-Token ist ein kurzlebiger Nachweis, dass eine Challenge bestanden wurde. Die PopularCaptcha-Tokens von Scarnox laufen etwa zwei Minuten nach ihrer Ausstellung ab. Wenn Sie ein Token nach diesem Zeitfenster absenden, lehnt die Website das Formular ab, oft mit einer Meldung, dass das Captcha abgelaufen oder ungültig ist. Die Lösung betrifft fast immer das Timing: Lösen Sie das Captcha so nah am Absenden wie möglich, verwenden Sie jedes Token nur einmal und wiederholen Sie nur, wenn Sie wissen, dass der erste Versuch nicht angenommen wurde.
Warum Tokens ablaufen
Ein Token ist kein dauerhafter Berechtigungsnachweis. Die Website will wissen, dass eine Person (oder ein Solver im Auftrag einer Person) die Challenge kürzlich abgeschlossen hat, daher bekommt das Token eine kurze Lebensdauer. Die Uhr startet, wenn das Token ausgestellt wird, nicht, wenn Sie die API zum ersten Mal aufrufen. Alles, was zwischen Lösung und Absenden passiert, zehrt an den zwei Minuten.
Häufige Ursachen
- Zu früh lösen. Einen Batch von Tokens vorab zu lösen und für später aufzubewahren, ist die häufigste Ursache. Bis ein Token verwendet wird, ist es veraltet.
- Langsamer Code zwischen Lösung und Absenden. Ein langer Datenbankschreibvorgang, eine Warteschlange oder ein
time.sleepvor dem Absenden des Formulars kann das Token über sein Zeitfenster hinausschieben. - Ein Token wiederverwenden. Ein Token, das bereits akzeptiert wurde oder das ein fehlgeschlagener Versuch schon verbraucht hat, funktioniert nicht noch einmal. Behandeln Sie jedes Token als Einmal-Token.
- Die Seite neu laden. Wird die Seite nach der Lösung neu geladen, stellt das Formular unter Umständen eine neue Challenge und macht das Token ungültig, das Sie halten.
Die Lösung: direkt vor dem Absenden lösen
Das einfachste zuverlässige Muster ist, Lösung und Absenden zu einem Schritt zu machen. Fordern Sie ein Token an, legen Sie es in das Formular, senden Sie das Formular ab und tun Sie dazwischen nichts Langsames:
import requests
API_KEY = "scarnox_YOURAPIKEY"
CREATE_URL = "https://api.scarnox.com/api/tasks/create"
def fresh_token(sitekey: str, page_url: str) -> str:
r = requests.post(
CREATE_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"captcha_type": "PopularCaptchaTaskProxyless",
"site_key": sitekey,
"site_url": page_url,
},
timeout=185, # der Aufruf blockiert, bis das Token bereit ist
)
data = r.json()
if data.get("errorId") != 0:
raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
return data["solution"]["token"]
def submit_form(page_url: str, sitekey: str, form: dict) -> requests.Response:
token = fresh_token(sitekey, page_url) # direkt vor dem Absenden lösen
return requests.post(
page_url,
data={**form, "h-captcha-response": token, "g-recaptcha-response": token},
timeout=30,
)
Beachten Sie, dass submit_form kein Token in einem Cache oder einer Warteschlange aufbewahrt. Es fordert eines an, sendet es ab und macht weiter. Fehlgeschlagene Lösungen werden nicht berechnet, ein fehlgeschlagener Aufruf kostet Sie also auf der Lösungsseite nichts.
Sicher wiederholen
Manche Websites lehnen ein abgelaufenes Token mit einer klaren Antwort ab. Andere liefern eine normale Seite mit einer Fehlermeldung im Inhalt, sodass ein Statuscode allein nichts verrät. Schauen Sie sich an, welche Antwort die Website für ein abgelaufenes Token tatsächlich zurückgibt, und bauen Sie Ihre Prüfung darauf auf. Eine Wiederholungsschleife könnte so aussehen:
def submit_with_retry(page_url: str, sitekey: str, form: dict, attempts: int = 2):
for _ in range(attempts):
resp = submit_form(page_url, sitekey, form)
if resp.status_code < 400 and "captcha" not in resp.text.lower():
return resp # angenommen, soweit die Antwort dieser Website zeigt
raise RuntimeError("captcha token rejected after retries")
Seien Sie vorsichtig mit Wiederholungen bei Formularen, die etwas anlegen. Wurde der erste Versuch tatsächlich angenommen, Ihr Code die Antwort aber falsch gelesen hat, kann eine Wiederholung ein doppeltes Konto, eine doppelte Bestellung oder eine doppelte Nachricht erzeugen. Wiederholen Sie nur, wenn Sie sicher sind, dass der erste Post nicht angenommen wurde, und machen Sie die Prüfung spezifisch für die Website, mit der Sie arbeiten.
Das Timing sauber halten
- Lösen Sie nicht in einer Schleife mit Tokens, die Sie später verwenden wollen. Lösen Sie pro Absenden.
- Halten Sie die Arbeit zwischen Lösung und Absenden auf ein Minimum.
- Verwenden Sie für die Lösungsanfrage ein Timeout von etwa 185 Sekunden, weil der Aufruf blockiert, bis das Token bereit ist. Ein eigener Timer für Ihren Formular-POST sollte deutlich kürzer sein als die Lebensdauer des Tokens.
- Wenn Sie eine schnellere Pipeline brauchen, siehe Geschwindigkeit beim Captcha-Lösen, das parallele Lösungen ohne Zwischenspeicherung von Tokens behandelt.
Häufige Fehler
- Tokens in einem Dictionary oder in Redis für später zwischenspeichern. Der Cache wirkt harmlos, bis ein Token nach seinem Zeitfenster verwendet wird und jedes Absenden fehlschlägt.
- Einmal pro Sitzung lösen. Auch eine langlebige Sitzung braucht für jeden Formular-POST ein neues Token, weil jeder POST eine eigene Challenge-Prüfung auslösen kann.
- Zwischen Lösung und Absenden schlafen. Ein Rate-Limiter oder eine absichtliche Pause nach der Lösung verbraucht die Lebensdauer des Tokens. Legen Sie jede Drosselung stattdessen vor die Lösung.
- Jeden Fehler gleich behandeln. Ein Timeout auf Ihrer Seite, ein abgelehntes Token und ein Fehler der Website brauchen jeweils eine andere Behandlung. Protokollieren Sie sie getrennt.
Genug protokollieren, um es zu diagnostizieren
Wenn ein Absenden fehlschlägt, halten Sie fest, wann das Token ausgestellt wurde, wann das Formular abgesendet wurde, den HTTP-Status und die ersten paar hundert Zeichen der Antwort. Mit diesen vier Werten erkennen Sie auf einen Blick, ob das Token abgelaufen ist oder die Website es aus einem anderen Grund abgelehnt hat. Protokollieren Sie das vollständige Token nicht in gemeinsam genutzten Logs, denn ein gültiges Token ist ein Berechtigungsnachweis für genau diese eine Challenge.
Was zu prüfen ist, wenn es weiterhin fehlschlägt
- Geben Sie die Zeit zwischen der Rückgabe des Tokens und dem Formular-POST aus.
- Bestätigen Sie, dass
site_urlzu der Seite passt, die das Captcha zeigt. - Bestätigen Sie, dass der Sitekey von der aktuellen Seite gelesen wurde und nicht aus einer alten Kopie stammt.
- Bestätigen Sie die Namen der Formularfelder. PopularCaptcha-Tokens gehen in
h-captcha-responseund oft zusätzlich ing-recaptcha-response.
Die vollständige Liste der Fehlerantworten und wie Sie jede behandeln, steht unter Fehlerbehandlung für Captcha-Solver.