Mehrere CAPTCHAs in Python und Node.js lösen

Von solvethree4 Min. Lesezeit

Begrenzen Sie die Anzahl aktiver Lösungsvorgänge, nicht nur die Anzahl der gestarteten Anfragen. Die folgenden Beispiele führen acht unabhängige reCAPTCHA Enterprise-Aufgaben mit höchstens vier gleichzeitig aktiven Lösungsvorgängen aus und verarbeiten jedes Ergebnis, sobald es vorliegt.

Vier ist eine beispielhafte Einstellung für die Parallelität, keine Kapazitätsgrenze von solvethree. Wählen Sie ein Limit, das dazu passt, wie schnell Ihre Anwendung die zurückgegebenen Lösungen verwenden kann.

Auf dieser Seite

SDK und Aufgabeneingaben vorbereiten

Verwenden Sie Python 3.10+ oder Node.js 22+. Installieren Sie das offizielle SDK über die Download-URL in der Dokumentation; verwenden Sie den direkten Paketdownload. Bewahren Sie den Workspace-API-Schlüssel auf dem Server auf.

  • Setzen Sie SOLVETHREE_API_KEY und SOLVETHREE_PROXY in der Serverumgebung.
  • Ersetzen Sie accounts.example.com und login durch Ihren Zielhostnamen und Ihre Aktion. Für die Website muss bereits ein aktives Profil für Ihren Workspace verfügbar sein; die Übermittlung eines Hostnamens erstellt keines.
  • Behandeln Sie jeden Eintrag in jobs als separate logische Aufgabe. Die Beispiele verwenden dieselbe Website, Aktion und denselben Proxy, damit der Stapel übersichtlich bleibt, geben aber jeder Aufgabe eine eigene requestId.
  • Lassen Sie die Eingaben jeder Aufgabe während der Wiederherstellung unverändert. Ein neuer unabhängiger Lösungsvorgang benötigt eine neue ID; die Wiederherstellung eines unterbrochenen Lösungsvorgangs benötigt die ursprüngliche ID und identische Eingaben.

Stapel mit begrenzter Parallelität ausführen

Python · Vier gleichzeitige Lösungsvorgänge
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
from uuid import uuid4
from solvethree import Solvethree

# Each worker gets its own synchronous client.
def solve_one(job):
    client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
    return client.solve({**job, "requestId": str(uuid4())}, timeout=180)

jobs = [
    {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    for _ in range(8)
]
with ThreadPoolExecutor(max_workers=4) as pool:
    futures = [pool.submit(solve_one, job) for job in jobs]
    for future in as_completed(futures):
        try:
            result = future.result()
            print("Ready task:", result["id"])
            # Submit this solution promptly; don't wait for the whole batch.
        except Exception as error:
            print("One task failed:", type(error).__name__)

Python benötigt hier Threads, weil `Solvethree` synchron arbeitet. Jeder solve-Aufruf erstellt eine Aufgabe und wartet auf ein bereites Ergebnis oder löst eine Ausnahme aus. Es gibt keinen nativen asynchronen Client. Ein direkter Aufruf innerhalb einer asynchronen Funktion würde daher weiterhin den Event-Loop-Thread dieser Funktion blockieren. Das Beispiel verwendet vier Thread-Pool-Worker mit jeweils einem eigenen Client und verarbeitet abgeschlossene Futures, ohne auf den gesamten Stapel zu warten.

Node.js begrenzt die Parallelität durch vier Worker-Promises. Jeder Worker wartet auf einen Lösungsvorgang, bevor er den nächsten Auftrag übernimmt. Promise.all wartet auf diese Worker; es startet nicht alle Aufträge gleichzeitig. Wenn Sie dagegen eine unbegrenzte Auftragsliste direkt auf solve-Aufrufe abbilden, startet die gesamte Liste sofort, ohne wirksame Begrenzung der Parallelität.

Beide Beispiele fangen Fehler pro Aufgabe ab, damit ein fehlgeschlagener Lösungsvorgang die übrigen Aufträge nicht stoppt. Das Timeout von 180 Sekunden gilt für jeden solve-Aufruf, nicht für den gesamten Stapel.

Jedes bereite Ergebnis sofort verwenden

Ersetzen Sie den Kommentar im Erfolgspfad durch die Übermittlung an Ihr Ziel, bevor Sie einen echten Stapel ausführen. Die ausgegebene ID identifiziert die Aufgabe; sie ist nicht das reCAPTCHA-Token. Übermitteln Sie solution.token mit den zurückgegebenen Werten userAgent und secChUa und verwenden Sie dabei denselben Proxy, der für diese Aufgabe angegeben wurde.

Sammeln Sie nicht erst alle Tokens und warten Sie nicht auf den langsamsten Lösungsvorgang, bevor Sie sie verwenden. Verarbeiten Sie jedes bereite Ergebnis dort, wo es ankommt. Das SDK löst das CAPTCHA; es übermittelt die Lösung nicht an Ihr Ziel. Eine bereite Aufgabe beweist auch nicht, dass das Ziel die anschließende Anfrage akzeptiert hat.

Eine unterbrochene Aufgabe wiederherstellen – nicht den gesamten Stapel

Die Beispiele geben Fehlerklassennamen aus, um das Worker-Muster kurz zu halten. Bewahren Sie in einer Integration den betroffenen Auftrag und die von SDK-Fehlern bereitgestellten Wiederherstellungs-IDs auf: Python verwendet request_id und task_id; JavaScript verwendet requestId und taskId.

Bei einem Lösungsvorgang tritt ein Timeout auf oder die Verbindung geht verloren.

Prüfen Sie den Fehler auf eine Aufgaben-ID oder Anfrage-ID. Die entfernte Aufgabe kann weiterhin existieren.

Probiere Folgendes: Setzen Sie das GET-Polling fort, wenn Sie die Aufgaben-ID kennen. Andernfalls stellen Sie die Erstellung wieder her, indem Sie identische Eingaben mit derselben Anfrage-ID erneut senden.

Das SDK löst TaskFailedError aus.

Prüfen Sie errorCode und error der Aufgabe mit endgültigem Status.

Probiere Folgendes: Beenden Sie das Polling dieser Aufgabe und beheben Sie die gemeldete Ursache, bevor Sie einen weiteren Lösungsvorgang starten. Wiederholen Sie Anfragen mit unveränderten ungültigen Eingaben nicht blind.

Ein erneuter Durchlauf eines der Beispiele generiert neue Anfrage-IDs und startet neue logische Aufgaben; das ist keine Wiederherstellung. Beide SDKs wiederholen die Aufgabenerstellung bewusst nicht automatisch. Bewahren Sie daher genügend Informationen auf, um nur den unterbrochenen Auftrag wiederherzustellen, statt erfolgreiche Arbeit erneut einzureichen.

Führe deinen ersten Task aus.

Starte mit $5 Workspace-Guthaben.

Workspace erstellen
Mehrere CAPTCHAs in Python und Node.js lösen · solvethree