Einen CAPTCHA-Solver mit Selenium verwenden

Von solvethree4 Min. Lesezeit

Rufen Sie mit solvethree ein reCAPTCHA Enterprise-Token ab und tragen Sie anschließend mit Selenium solution.token in das Formular Ihrer Anwendung ein, um es abzusenden. Das SDK löst die Aufgabe; es füllt das Browserformular nicht für Sie aus.

Das Beispiel verwendet ein HTTPS-Formular mit einem Token-Feld und einer Schaltfläche zum Absenden. Passen Sie diese Selektoren an die Anwendung an, die Sie testen.

Auf dieser Seite

Formular und Python-Umgebung vorbereiten

  1. 1.

    Abhängigkeiten installieren

    Verwenden Sie Python 3.10 oder neuer mit Chrome. Installieren Sie das Paket selenium über pip und anschließend das offizielle solvethree Python SDK über dessen herunterladbare Wheel-Datei. Verwenden Sie die Anleitung zur Installation per direktem Download in der Python-Integration; ersetzen Sie sie nicht durch eine angenommene Installation aus einer Paket-Registry.

  2. 2.

    Zielprofil konfigurieren

    Richten Sie den Hostnamen des eigenen Formulars in der solvethree-Konsole ein und stellen Sie sicher, dass sein Profil für Ihren Workspace aktiv ist. Das Senden eines Hostnamens in einer Aufgabe erstellt dieses Profil nicht. Das Beispiel fordert die Aktion login an; ändern Sie sie, wenn Ihre Anwendung eine andere Aktion verwendet.

  3. 3.

    Umgebungsvariablen festlegen

    Setzen Sie TARGET_URL auf die vollständige HTTPS-URL Ihres Formulars, SOLVETHREE_PROXY auf Ihre HTTP- oder HTTPS-Proxy-URL und SOLVETHREE_API_KEY auf den API-Schlüssel Ihres Workspace. Bewahren Sie den Schlüssel im Python-Prozess auf, nicht im JavaScript der Seite.

Zuerst lösen, dann Chrome mit der zurückgegebenen Identität starten

Dieses Chrome-Beispiel erfordert einen Proxy mit IP-Freigabeliste ohne Benutzername oder Passwort. Es lehnt Proxy-URLs mit Zugangsdaten ab und implementiert keine Einrichtung authentifizierter Proxys.

Die Aufgabe verwendet den aus TARGET_URL extrahierten Hostnamen, die Aktion login und einen Proxy. Nachdem solve ein bereites Ergebnis zurückgegeben hat, startet Chrome mit demselben Proxy und dem zurückgegebenen userAgent. Vor der Navigation setzt das Beispiel außerdem den zurückgegebenen Header secChUa.

Selenium + Python · Chrome mit einem Proxy mit IP-Freigabeliste
# Install selenium and the official solvethree Python SDK first.
import os
from urllib.parse import urlsplit
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from solvethree import Solvethree

target = os.environ["TARGET_URL"]  # Your configured HTTPS form page.
proxy_url = os.environ["SOLVETHREE_PROXY"]
proxy = urlsplit(proxy_url)
if proxy.username or proxy.password:
    raise ValueError("This Chrome example requires an IP-allowlisted proxy without URL credentials")
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
result = client.solve({"site": urlsplit(target).hostname, "action": "login", "proxy": proxy_url})
solution = result["solution"]
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=" + proxy_url)
options.add_argument("--user-agent=" + solution["userAgent"])
driver = webdriver.Chrome(options=options)
try:
    driver.execute_cdp_cmd("Network.enable", {})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
        "headers": {"sec-ch-ua": solution["secChUa"]}
    })
    driver.get(target)
    # Adapt the field and button to your application's form contract.
    field = WebDriverWait(driver, 20).until(
        lambda browser: browser.find_element(By.NAME, "g-recaptcha-response")
    )
    driver.execute_script("""
        arguments[0].value = arguments[1];
        arguments[0].dispatchEvent(new Event('input', {bubbles:true}));
    """, field, solution["token"])
    driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
    # Check your application's success response here.
finally:
    driver.quit()

Solvethree.solve erstellt die Aufgabe einmal und fragt ihren Status ab, bis sie bereit ist oder eine Ausnahme ausgelöst wird. Erst dann navigiert der Browser zum Formular. Das Skript wartet auf das Token-Feld, weist solution.token zu, löst ein Eingabeereignis aus und klickt auf die Schaltfläche zum Absenden. Chrome wird im Block finally geschlossen.

Formularannahmen der Demo ersetzen

  • TARGET_URL ist die Formularseite Ihrer Anwendung. site der Aufgabe ist deren Hostname, nicht die vollständige URL; reCAPTCHA-Anfragen verwenden kein Feld url oder type.
  • login ist die Beispielaktion. Ersetzen Sie sie durch die Aktion, die von der Anwendung und ihrem konfigurierten Profil verwendet wird.
  • By.NAME mit g-recaptcha-response findet die Textarea der Demo. Verwenden Sie das Feld oder den Übermittlungsparameter, den Ihre Anwendung tatsächlich ausliest. Die Wertzuweisung und das Auslösen eines Eingabeereignisses bilden die Übergabe der Demo, keinen universellen reCAPTCHA-Callback.
  • button[type="submit"] identifiziert die Schaltfläche zum Absenden in der Demo. Ersetzen Sie den Selektor durch einen eindeutigen Selektor für Ihr Formular und behalten Sie das erforderliche Sitzungs-, CSRF- und Callback-Verhalten der Anwendung bei.

Die explizite Wartezeit von 20 Sekunden im Beispiel prüft nur, ob die Textarea existiert. Ergänzen Sie nach dem Klick auf die Schaltfläche zum Absenden eine bedingte Warteoperation für das tatsächliche Ergebnis Ihrer Anwendung, etwa ihren Erfolgszustand oder einen Validierungsfehler. Verwenden Sie eine vom Solver-Timeout unabhängige Gesamtfrist für den Browserablauf; ersetzen Sie Zustandsprüfungen nicht durch feste Pausen und mischen Sie implizite und explizite Wartezeiten nicht unbedacht.

Fehlgeschlagenen Schritt prüfen, bevor Sie einen weiteren Lösungsvorgang kaufen

Die Solver-Aufgabe schlägt fehl, bevor Chrome startet.

Prüfen Sie errorCode und error der abgeschlossenen Aufgabe. Unterscheiden Sie zwischen einer fehlgeschlagenen Aufgabe und einem HTTP-Anfragefehler.

Probiere Folgendes: Beheben Sie das gemeldete Eingabe-, Profil- oder Verbindungsproblem, bevor Sie es erneut versuchen. Beenden Sie die Statusabfrage einer fehlgeschlagenen Aufgabe; unveränderte ungültige Eingaben werden durch eine weitere Anfrage nicht besser.

Selenium überschreitet bei der Suche nach der Textarea das Zeitlimit.

Stellen Sie sicher, dass Chrome das vorgesehene Formular erreicht hat und die Seite tatsächlich das benannte Feld der Demo enthält.

Probiere Folgendes: Ersetzen Sie den Demo-Locator durch die Token-Übergabe Ihrer Anwendung und warten Sie auf den Zustand, in dem diese verfügbar ist. Ein längeres Zeitlimit behebt keinen falschen Selektor.

Das Token ist bereit, aber die Anwendung lehnt die Übermittlung ab.

Prüfen Sie zuerst die ausgehende Anwendungsanfrage. Stellen Sie sicher, dass sie solution.token enthält – nicht die Aufgaben-ID oder einen alten Wert – und dass Aktion, Proxy, Browseridentität und Sitzung zum vorgesehenen Ablauf passen.

Probiere Folgendes: Korrigieren Sie den übermittelten Parameter oder die Anwendungsanforderungen, bevor Sie ein weiteres Token anfordern. Eine fertige Aufgabe liefert eine Lösung; die Antwort der Anwendung bestimmt, ob die Übermittlung akzeptiert wurde.

Führe deinen ersten Task aus.

Starte mit $5 Workspace-Guthaben.

Workspace erstellen
Einen CAPTCHA-Solver mit Selenium verwenden · solvethree