Eine CAPTCHA-Lösung mit Playwright für Python übermitteln
Lösen Sie zuerst das CAPTCHA und erstellen Sie dann einen Playwright-Kontext mit demselben Proxy und der zurückgegebenen Browseridentität. Übermitteln Sie solution.token über das Feld, das Ihre Anwendung tatsächlich sendet.
Das folgende Beispiel sendet ein Formular auf einer Seite, die Sie kontrollieren. Es wartet auf die POST-Antwort der Anwendung; es fängt reCAPTCHA nicht ab und ist nicht von einem universellen CAPTCHA-Callback abhängig.
Auf dieser Seite
Ziel und Umgebung vorbereiten
Verwenden Sie Python 3.10+, installieren Sie Playwright und dessen Chromium-Browser sowie das offizielle Wheel des solvethree Python SDK. Halten Sie den Workspace-API-Schlüssel im Python-Prozess, nicht im Browser-JavaScript.
TARGET_URL: die vollständige URL Ihrer Formularseite. Das Beispiel extrahiert daraus den Hostnamen für die Lösungsanfrage.SOLVETHREE_PROXY: die Proxy-URL, bei Bedarf einschließlich Authentifizierungsdaten. Derselbe Proxy wird zum Lösen und für den Browserdatenverkehr verwendet.SOLVETHREE_API_KEY: Ihr Workspace-API-Schlüssel.
Für den Zielhostnamen muss ein aktives Profil für Ihren Workspace verfügbar sein. Richten Sie das Website-Profil ein, bevor Sie das Beispiel ausführen. Ändern Sie die Aktion login im Beispiel in die Aktion, die Ihre Integration benötigt; durch das Senden eines Hostnamens und einer Aktion wird kein Profil erstellt. Die Anfrage verwendet standardmäßig reCAPTCHA Enterprise v3.
Lösen, Chromium konfigurieren und übermitteln
# Install playwright and the official Python SDK; run playwright install chromium.
import asyncio
import os
from urllib.parse import urlsplit, unquote
from playwright.async_api import async_playwright
from solvethree import Solvethree
async def main():
target = os.environ["TARGET_URL"]
proxy = urlsplit(os.environ["SOLVETHREE_PROXY"])
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
task = {"site": urlsplit(target).hostname, "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
result = await asyncio.to_thread(client.solve, task, timeout=180)
solution = result["solution"]
async with async_playwright() as playwright:
browser = await playwright.chromium.launch()
try:
netloc = proxy.netloc.rsplit("@", 1)[-1]
context = await browser.new_context(
proxy={"server": f"{proxy.scheme}://{netloc}", "username": unquote(proxy.username or ""), "password": unquote(proxy.password or "")},
user_agent=solution["userAgent"], extra_http_headers={"sec-ch-ua": solution["secChUa"]})
page = await context.new_page()
await page.goto(target)
field = page.locator('[name="g-recaptcha-response"]')
await field.wait_for(state="attached")
await field.evaluate("(field, token) => { field.value=token; field.dispatchEvent(new Event('input',{bubbles:true})); }", solution["token"])
async with page.expect_response(lambda r: r.request.method == "POST" and urlsplit(r.url).netloc == urlsplit(target).netloc) as outcome:
await page.get_by_role("button", name="Submit", exact=True).click()
print("Application HTTP status:", (await outcome.value).status)
# Check the application's actual response; adapt form/CSRF/session setup.
await context.close()
finally:
await browser.close()
asyncio.run(main())Solvethree ist synchron. Der Aufruf von client.solve über asyncio.to_thread verhindert, dass dessen Erstellungs- und Polling-Vorgang die Ereignisschleife von Playwright blockiert. Er gibt ein fertiges Ergebnis zurück oder löst eine Ausnahme aus; das SDK hat keinen nativen asynchronen Client.
Der Browserkontext verwendet solution.userAgent und solution.secChUa. Das Beispiel trennt außerdem den Proxyserver von dessen Benutzername und Passwort und dekodiert die Zugangsdaten, bevor es sie an Playwright übergibt. Da dieser Task einen Proxy verwendet, ist keine Kandidatenauswahl erforderlich.
- 1.
An das Token-Eingabefeld der Anwendung anpassen
Das Beispiel wartet, bis das Feld im DOM vorhanden ist, weist solution.token zu und löst ein Eingabeereignis aus. Das Feld muss dafür nicht sichtbar sein. Wenn Ihre Anwendung ein anderes Feld übermittelt oder den Token-Zustand an anderer Stelle ausliest, passen Sie diese Übergabe an die ausgehende Anfrage an.
- 2.
Sitzungsanforderungen des Formulars ergänzen
Das Beispiel beginnt mit einem neuen Browserkontext. Ergänzen Sie vor dem Absenden alle von Ihrer Anwendung benötigten Schritte für die Sitzung, die Formularvorbereitung oder die CSRF-Behandlung.
- 3.
Auf die richtige POST-Anfrage warten
Das Warten auf die Antwort wird vor dem Klick auf Submit registriert. Das Prädikat erfasst eine POST-Anfrage an die Netzwerkadresse der Ziel-URL. Wenn die Seite weitere POST-Anfragen dorthin sendet, grenzen Sie das Prädikat auf Ihren Formularendpunkt ein.
Anwendungsantwort auswerten
Der ausgegebene HTTP-Status bestätigt, dass eine passende Antwort eingegangen ist. Prüfen Sie den Antwort-Body der Anwendung oder den resultierenden Seitenzustand, um festzustellen, ob die Übermittlung akzeptiert wurde. Ein fertiger solvethree-Task bedeutet, dass eine Lösung generiert wurde, nicht, dass das Ziel sie akzeptiert hat.
- Die Anwendung lehnt ein fertiges Token ab.
Prüfen Sie die ausgehende Formularanfrage, bevor Sie für einen weiteren Lösungsvorgang bezahlen.
Probiere Folgendes: Vergewissern Sie sich, dass sie solution.token enthält und nicht die Task-ID oder einen alten Wert. Prüfen Sie, ob die Übermittlung den Proxy des Lösungsvorgangs, den zurückgegebenen User-Agent und die Client Hints sowie das vorgesehene Ziel verwendet.
- Beim Warten auf die Antwort wird eine nicht zugehörige Anfrage erfasst.
Vergleichen Sie die erfasste POST-URL mit dem tatsächlichen Formularendpunkt.
Probiere Folgendes: Grenzen Sie das Antwortprädikat auf diesen Endpunkt ein, statt jede POST-Anfrage an dieselbe Netzwerkadresse zu erfassen.
- Der Lösungsaufruf löst vor der Übermittlung im Browser eine Ausnahme aus.
Unterscheiden Sie zwischen einem HTTP-Anfragefehler und einem endgültig fehlgeschlagenen Task.
Probiere Folgendes: Behandeln Sie HTTP-Antworten, die keinen Erfolg anzeigen, separat. Prüfen Sie bei einem fehlgeschlagenen Task errorCode und error und beheben Sie die Ursache, statt es mit unveränderten Eingaben erneut zu versuchen. Die solve-Methode des SDK beendet den Vorgang bei einem Fehlschlag bereits.
Quellen und API-Referenz
Führe deinen ersten Task aus.
Starte mit $5 Workspace-Guthaben.