Scarnox · Blog

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

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

Häufige Fehler

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

  1. Geben Sie die Zeit zwischen der Rückgabe des Tokens und dem Formular-POST aus.
  2. Bestätigen Sie, dass site_url zu der Seite passt, die das Captcha zeigt.
  3. Bestätigen Sie, dass der Sitekey von der aktuellen Seite gelesen wurde und nicht aus einer alten Kopie stammt.
  4. Bestätigen Sie die Namen der Formularfelder. PopularCaptcha-Tokens gehen in h-captcha-response und oft zusätzlich in g-recaptcha-response.

Die vollständige Liste der Fehlerantworten und wie Sie jede behandeln, steht unter Fehlerbehandlung für Captcha-Solver.

Nächste Schritte