Anwendungs-Cookies beim Übermitteln eines gelösten Tokens beibehalten
Ein gelöstes reCAPTCHA-Token ersetzt weder die Session-Cookies noch den CSRF-Wert der Anwendung. Rufen Sie das Formular über dieselbe requests.Session ab, über die Sie es übermitteln, damit der POST die beim GET empfangenen Cookies beibehält.
Verwenden Sie für beide Anwendungsanfragen die vom Solver zurückgegebenen Browser-Header und denselben Proxy. Im Beispiel wird zuerst die Lösung ermittelt, damit diese Header vor dem Öffnen des Formulars verfügbar sind.
Auf dieser Seite
GET und POST des Formulars in derselben Session ausführen
Verwenden Sie Python 3.10+ mit installiertem requests und dem offiziellen solvethree Python SDK. Der Zielhostname benötigt ein aktives Profil in Ihrem Workspace. Die Angabe des Hostnamens in einem Task erstellt kein Profil. Falls es noch nicht konfiguriert ist, lesen Sie Websiteprofil einrichten.
- Setzen Sie
TARGET_URLauf die Formular-URL Ihrer Anwendung. Diese Demo unter eigener Kontrolle verwendet dieselbe URL für GET und POST. - Setzen Sie
SOLVETHREE_PROXYauf den einzelnen Proxy, der für den Lösungsvorgang und beide Anwendungsanfragen verwendet wird. - Setzen Sie
SOLVETHREE_API_KEYauf den API-Schlüssel Ihres Workspaces. Führen Sie diesen Code serverseitig aus.
# This owned demo form has an input named csrf_token and g-recaptcha-response.
import os
from html.parser import HTMLParser
from urllib.parse import urlsplit
import requests
from solvethree import Solvethree
class FormParser(HTMLParser):
csrf = None
def handle_starttag(self, tag, attributes):
values = dict(attributes)
if tag == "input" and values.get("name") == "csrf_token":
self.csrf = values.get("value")
target = os.environ["TARGET_URL"]
proxy = os.environ["SOLVETHREE_PROXY"]
request = {"site": urlsplit(target).hostname, "action": "login", "proxy": proxy}
# Obtain the solver's browser headers before opening the application session.
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
with requests.Session() as session:
session.headers.update({"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
proxies = {"http": proxy, "https": proxy}
page = session.get(target, proxies=proxies, timeout=20, allow_redirects=False)
page.raise_for_status()
parser = FormParser(); parser.feed(page.text)
if not parser.csrf: raise RuntimeError("The expected demo CSRF input was not found")
response = session.post(target, proxies=proxies, timeout=20, allow_redirects=False,
data={"csrf_token": parser.csrf, "g-recaptcha-response": solution["token"]})
print("Application HTTP status:", response.status_code)
# Use the actual form's submit URL, fields and session rules. Inspect its result.Der SDK-Aufruf solve erstellt den Task und fragt seinen Status ab, bis er fertig ist oder eine Ausnahme ausgelöst wird. Anschließend wendet das Beispiel solution.userAgent und solution.secChUa auf die Session an. Der GET füllt ihren Cookie-Speicher; der POST verwendet diesen Speicher erneut und übermittelt solution.token zusammen mit dem aus dem Formular ausgelesenen CSRF-Wert.
Passen Sie die Aktion login, die Übermittlungs-URL und die Formularfelder der Demo an Ihre Anwendung an. csrf_token ist der Feldname dieses Formulars, keine Vorgabe von solvethree. Passen Sie den HTML-Parser an, falls Ihr Formular einen anderen Namen oder eine andere Struktur verwendet, und fügen Sie alle weiteren erforderlichen Felder hinzu, etwa Anmeldedaten. Verwenden Sie auch dann dieselbe Session, wenn sich die Übermittlungs-URL von der Formular-URL unterscheidet.
Wenn die Anwendung den POST ablehnt
Der ausgegebene HTTP-Status ist ein Ausgangspunkt, kein Beleg für eine erfolgreiche Anmeldung. Prüfen Sie die Antwort der Anwendung und die ausgehende Anfrage, bevor Sie für einen weiteren Lösungsvorgang bezahlen. Ein fertiger Task bedeutet, dass eine Lösung erzeugt wurde; die Anwendung entscheidet weiterhin, ob sie die Übermittlung akzeptiert.
- Das CSRF-Eingabefeld wird nicht gefunden.
Prüfen Sie Status und Inhalt der GET-Antwort. Das Folgen von Weiterleitungen ist deaktiviert; eine Weiterleitungsantwort ist daher nicht das erwartete Formular.
Probiere Folgendes: Rufen Sie gezielt das richtige Formular über dieselbe Session ab und passen Sie den Parser anschließend an dessen tatsächliches CSRF-Feld an.
- Die Anwendung meldet eine fehlende Session oder einen ungültigen CSRF-Wert.
Prüfen Sie, ob der GET Cookies empfangen hat, ob der POST die zutreffenden Cookies gesendet hat und ob sein CSRF-Wert aus dieser Formularantwort stammt.
Probiere Folgendes: Führen Sie beide Anfragen in derselben requests.Session aus. Rufen Sie das Formular nicht mit einem Client ab, um es dann mit einem anderen zu übermitteln.
- Die Anwendung lehnt das CAPTCHA ab.
Prüfen Sie das ausgehende Token-Feld, action, Proxy, User-Agent und sec-ch-ua. Vergewissern Sie sich, dass Sie solution.token senden und nicht die Task-ID oder ein älteres Token.
Probiere Folgendes: Verwenden Sie das aktuelle Token, denselben Proxy wie beim Lösungsvorgang und die zurückgegebenen Browser-Header. Falls das Token abgelaufen ist oder bereits bewertet wurde, beschaffen Sie kurz vor der Übermittlung ein neues.
- Der POST wird abgeschlossen, die Anmeldung jedoch nicht.
Prüfen Sie den Antwortinhalt und ein mögliches Weiterleitungsziel sowie die tatsächliche Übermittlungs-URL und die erforderlichen Formularfelder.
Probiere Folgendes: Passen Sie die Formulardaten der Demo an die Anforderungen der Anwendung an. Ein CAPTCHA-Token liefert weder Zugangsdaten noch andere fehlende Anwendungsfelder.
Quellen und API-Referenz
Führe deinen ersten Task aus.
Starte mit $5 Workspace-Guthaben.