solvethree aus einem Flask-Backend aufrufen

Von solvethree4 Min. Lesezeit

Verwenden Sie separate Flask-Routen zum Erstellen und Abrufen einer solvethree-Aufgabe. Der folgende POST kehrt zurück, ohne den gesamten Lösungsvorgang abzuwarten; der Aufrufer behält die Aufgaben-ID und fragt die GET-Route ab, bis die Aufgabe bereit oder fehlgeschlagen ist.

Auf dieser Seite

Abhängigkeiten installieren und das Ziel konfigurieren

  1. 1.

    Python 3.10 oder neuer verwenden

    Installieren Sie Flask mit python -m pip install flask. Installieren Sie das offizielle Python-SDK mit python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl.

  2. 2.

    Server-Umgebungsvariablen setzen

    Setzen Sie SOLVETHREE_API_KEY auf den API-Schlüssel Ihres Workspaces und INTEGRATION_KEY auf das Geheimnis, das Ihr autorisierter Aufrufer in X-Integration-Key sendet. Setzen Sie CAPTCHA_SITE auf den Zielhostnamen, nicht auf eine vollständige URL, und SOLVETHREE_PROXY auf die für diese Aufgabe verwendete HTTP- oder HTTPS-Proxy-URL. Bewahren Sie diese Werte auf dem Server auf.

  3. 3.

    Websiteprofil aktivieren

    Konfigurieren Sie in der solvethree-Konsole ein aktives Profil für diesen Hostnamen, das Ihrem Workspace zur Verfügung steht. Das Setzen von CAPTCHA_SITE erstellt kein Profil. Siehe Website-Profil einrichten, falls das Ziel noch nicht konfiguriert ist.

Das Beispiel legt die Aktion auf login fest und verwendet die standardmäßige reCAPTCHA Enterprise v3-Aufgabe. Passen Sie diese Aktion vor der Ausführung an den Zielvorgang an. Der Aufrufer kann Website, Aktion oder Proxy nicht über den Anfrage-Body überschreiben.

Routen zum Erstellen und Abrufen hinzufügen

Flask · Dieselbe Aufgabe erstellen und abrufen
# pip install flask and the official solvethree SDK wheel.
import hmac
import os
from flask import Flask, abort, jsonify, request
from solvethree import Solvethree, SolvethreeError

app = Flask(__name__)

def client():
    return Solvethree(os.environ["SOLVETHREE_API_KEY"])

@app.before_request
def authorize():
    if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
        abort(401)

@app.errorhandler(SolvethreeError)
def task_error(error):
    return jsonify(requestId=error.request_id, taskId=error.task_id), 502

@app.errorhandler(ValueError)
def invalid_input(error):
    return jsonify(error="Invalid task input or ID"), 400

@app.post("/captcha/tasks")
def create():
    task = {"site": os.environ["CAPTCHA_SITE"], "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    if request.headers.get("x-request-id"):
        task["requestId"] = request.headers["x-request-id"]
    return jsonify(client().create_task(task, wait_ms=0, timeout=20))

@app.get("/captcha/tasks/<task_id>")
def retrieve(task_id):
    return jsonify(client().get_task(task_id, wait_ms=15000, timeout=25))

Speichern Sie das Beispiel als app.py. Starten Sie es nach dem Setzen der Umgebungsvariablen lokal mit python -m flask --app app run. Die Routen sind POST /captcha/tasks und GET /captcha/tasks/<task_id>. Flask benötigt keine separate URLconf: Die Dekoratoren registrieren beide Routen. Einzelheiten zum lokalen Start finden Sie im Flask-Schnellstart; behalten Sie Ihre bestehende WSGI-Produktionskonfiguration bei.

Die Erstellung verwendet wait_ms=0 mit einem Netzwerk-Timeout von 20 Sekunden. Dadurch entfällt das Warten auf den Lösungsvorgang, nicht auf die HTTP-Anfrage selbst. Der Abruf erlaubt bis zu 15 Sekunden Wartezeit auf eine Aufgabenaktualisierung bei einem Netzwerk-Timeout von 25 Sekunden. Beide Views verwenden das synchrone SDK, sodass jede ihren Anfrage-Worker belegt, solange der SDK-Aufruf läuft.

Request-ID vor dem Senden der POST-Anfrage speichern

  1. 1.

    Eine Request-ID pro logischer Aufgabe erstellen

    Speichern Sie sie vor dem Aufruf von POST /captcha/tasks und senden Sie sie dann als X-Request-ID zusammen mit X-Integration-Key. Verwenden Sie 1–64 ASCII-Buchstaben, Ziffern, Unterstriche oder Bindestriche. Diese POST-Anfrage benötigt keinen Aufgaben-Body, da der Server die Aufgabe aus seiner festen Konfiguration erstellt.

  2. 2.

    Zurückgegebene Task-ID aufbewahren

    Speichern Sie nach einer erfolgreichen HTTP-Antwort die id des Ergebnisses. Rufen Sie die Aufgabe über GET /captcha/tasks/<task_id> ab und senden Sie dabei erneut X-Integration-Key.

  3. 3.

    Bei unklarer Erstellung die bestehende Aufgabe wiederfinden, statt eine weitere zu erstellen

    Bei einem Timeout der POST-Verbindung kann die Erstellung trotzdem erfolgreich gewesen sein. Rufen Sie die Aufgabe ab, wenn Sie ihre ID haben. Andernfalls wiederholen Sie die POST-Anfrage mit derselben X-Request-ID und unveränderten Aufgabeneingaben, um die bestehende Aufgabe wiederzufinden. Wenn Sie die ID nach einer Änderung von Website, Aktion oder Proxy wiederverwenden, entsteht ein Konflikt.

Der Header ist im Beispiel optional. Wenn Sie ihn weglassen, entfällt jedoch diese Wiederherstellungsmöglichkeit, falls die Erstellung erfolgreich ist und die Antwort verloren geht. Generieren Sie nicht allein deshalb eine neue ID, weil die erste Anfrage einen Timeout hatte.

HTTP-Fehler vor dem Aufgabenstatus behandeln

Prüfen Sie zuerst den HTTP-Status der Flask-Antwort. Das Beispiel gibt 401 bei einem fehlenden oder falschen Integrationsschlüssel zurück, 400 bei einem abgefangenen ValueError und 502 bei einem abgefangenen SolvethreeError. Der Body dieser 502-Antwort stellt requestId und taskId zur Wiederherstellung bereit; er ist keine Aufgabenstatus-Payload und bedeutet für sich genommen nicht, dass die Aufgabe fehlgeschlagen ist.

Prüfen Sie nach einer erfolgreichen HTTP-Antwort den Status der Aufgabe.
Prüfen Sie nach einer erfolgreichen HTTP-Antwort den Status der Aufgabe.
AufgabenstatusAktion des Aufrufers
AusstehendBehalten Sie dieselbe Aufgaben-ID bei und rufen Sie die Aufgabe erneut ab.
In BearbeitungBehalten Sie dieselbe Aufgaben-ID bei und rufen Sie die Aufgabe erneut ab.
readyBeenden Sie das Polling und lesen Sie die Lösung aus.
failedBeenden Sie das Polling und prüfen Sie errorCode und error. Fehlgeschlagene Lösungsversuche werden erstattet.

Das Token mit dem ursprünglichen Proxy und der zurückgegebenen Identität übermitteln

Nur ein ready-Ergebnis enthält eine verwendbare Lösung. Senden Sie solution.token an das vorgesehene Ziel – nicht die Aufgaben-ID – und verwenden Sie die zurückgegebene Browseridentität aus solution.userAgent und solution.secChUa.

Senden Sie die Anfrage über denselben Proxy, der zum Erstellen der Aufgabe verwendet wurde. Dieses Beispiel verwendet einen festen SOLVETHREE_PROXY. Speichern Sie daher die ursprüngliche Proxykonfiguration zusammen mit der Aufgabe, statt davon auszugehen, dass der aktuelle Umgebungswert später noch übereinstimmt. Die Flask-Routen geben das SDK-Ergebnis zurück; sie senden weder die Anfrage an das Ziel noch konfigurieren sie den Proxy des Aufrufers.

Halten Sie Token, Proxy, Browseridentität und vorgesehenes Ziel zusammen. Eine bereite Aufgabe bedeutet, dass solvethree eine Lösung generiert hat; ob sie akzeptiert wird, ergibt sich aus der Antwort des Ziels auf die nachfolgende Anwendungsanfrage.

Führe deinen ersten Task aus.

Starte mit $5 Workspace-Guthaben.

Workspace erstellen
solvethree aus einem Flask-Backend aufrufen · solvethree