solvethree aus einem FastAPI-Backend aufrufen
Geben Sie die Aufgabe nach der Erstellung zurück, nicht erst nach dem gesamten Lösungsvorgang. Der Aufrufer ruft ihren Status ab, bis er ready oder failed ist, und übermittelt das Token bei erfolgreicher Lösung anschließend an das Ziel.
Auf dieser Seite
Server und Ziel konfigurieren
Verwenden Sie Python 3.10 oder neuer. Installieren Sie FastAPI mit python -m pip install "fastapi[standard]" und anschließend das offizielle SDK mit python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl.
Setzen Sie diese Umgebungsvariablen im Serverprozess, bevor Sie die App starten:
SOLVETHREE_API_KEY: der API-Schlüssel Ihres Workspaces. Bewahren Sie ihn auf dem Server auf; das SDK verwendet ihn zur Authentifizierung bei solvethree.INTEGRATION_KEY: ein separates Geheimnis, das Aufrufer im HeaderX-Integration-Keysenden, um sich bei Ihren FastAPI-Routen zu authentifizieren.CAPTCHA_SITE: der Zielhostname, keine vollständige URL.SOLVETHREE_PROXY: die für diese Aufgabe verwendete HTTP- oder HTTPS-Proxy-URL, ohne Pfad, Query oder Fragment.
Erstellen Sie vor dem Aufruf der Route ein aktives Profil für das Ziel in Ihrem Workspace. Das Beispiel legt die Aktion auf login fest, daher müssen das Profil und die vorgesehene Zielanfrage zu diesem Einsatzzweck passen. Die Angabe eines Hostnamens erstellt kein Profil; siehe Website-Profil einrichten.
FastAPI-Routen hinzufügen und ausführen
Speichern Sie dieses Beispiel als main.py. Beide Routen erfordern X-Integration-Key. Die Erstellungsroute baut ihre Aufgabe vollständig aus der Serverkonfiguration auf; Aufrufer geben weder Website noch Aktion oder Proxy in einem Anfrage-Body an.
# pip install "fastapi[standard]" and the official solvethree SDK wheel.
import hmac
import os
from fastapi import FastAPI, HTTPException, Request
from fastapi.concurrency import run_in_threadpool
from solvethree import Solvethree, SolvethreeError
app = FastAPI()
def authorize(request):
if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
raise HTTPException(status_code=401, detail="Unauthorized")
@app.post("/captcha/tasks")
async def create(request: Request):
authorize(request)
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"]
def submit():
return Solvethree(os.environ["SOLVETHREE_API_KEY"]).create_task(task, wait_ms=0, timeout=20)
try:
return await run_in_threadpool(submit)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid task input")
except SolvethreeError as error:
raise HTTPException(status_code=502, detail={"requestId": error.request_id, "taskId": error.task_id})
@app.get("/captcha/tasks/{task_id}")
async def retrieve(task_id: str, request: Request):
authorize(request)
def fetch():
return Solvethree(os.environ["SOLVETHREE_API_KEY"]).get_task(task_id, wait_ms=15000, timeout=25)
try:
return await run_in_threadpool(fetch)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid task ID")
except SolvethreeError as error:
raise HTTPException(status_code=502, detail={"requestId": error.request_id, "taskId": error.task_id})Die Aufgabe verwendet standardmäßig reCAPTCHA Enterprise v3. Sie sendet site, action und einen proxy, ohne ein Feld type oder url.
Das Python-SDK ist synchron. Ein direkter Aufruf innerhalb von async def würde die Ereignisschleife blockieren, daher verwenden beide Handler run_in_threadpool. Die Erstellung verwendet wait_ms=0 mit einem SDK-Anfrage-Timeout von 20 Sekunden; der Abruf erlaubt eine Wartezeit von 15 Sekunden mit einem SDK-Anfrage-Timeout von 25 Sekunden. Keiner der Handler wartet mit client.solve den gesamten Lösungsvorgang ab.
Führen Sie für die lokale Entwicklung fastapi dev main.py im Verzeichnis aus, das die Datei enthält. Die Routen sind POST http://127.0.0.1:8000/captcha/tasks und GET http://127.0.0.1:8000/captcha/tasks/{task_id}. FastAPI erkennt das Objekt app; es muss keine separate URLconf registriert werden.
Eine Aufgabe erstellen, abrufen und unterbrochene Anfragen wiederherstellen
- 1.
Einmalig mit einer stabilen Anfrage-ID erstellen
Senden Sie POST /captcha/tasks mit X-Integration-Key und einer X-Request-ID, die Sie für diese logische Aufgabe beibehalten. Die Anfrage-ID muss 1–64 ASCII-Buchstaben, Ziffern, Unterstriche oder Bindestriche enthalten. Die Route übergibt sie als requestId an solvethree. Speichern Sie die zurückgegebene Aufgaben-ID.
- 2.
HTTP-Status vor dem Aufgabenstatus prüfen
Der Wrapper gibt 401 bei fehlgeschlagener Authentifizierung, 400 bei ValueError-Eingabefehlern und 502 bei abgefangenen SolvethreeError-Ausnahmen zurück. Die Fehlerdetails der 502-Antwort enthalten requestId und taskId aus dem SDK-Fehler. Behandeln Sie diesen HTTP-Fehler, bevor Sie die Antwort als Aufgabe interpretieren.
- 3.
Die bestehende Aufgabe abrufen
Rufen Sie GET /captcha/tasks/{task_id} mit X-Integration-Key auf. Prüfen Sie status nach jeder erfolgreichen HTTP-Antwort. Ein Abruf kann auch nach Ende seiner Wartezeit eine noch nicht abgeschlossene Aufgabe zurückgeben; rufen Sie dieselbe Aufgabe erneut ab, statt eine weitere zu erstellen.
- 4.
Erstellung mit ungewissem Ausgang wiederherstellen
Wenn bei der Erstellung ein Timeout auftritt und Sie eine Aufgaben-ID haben, rufen Sie die Aufgabe ab. Andernfalls wiederholen Sie den POST mit Ihrer ursprünglichen X-Request-ID und unveränderten serverseitigen Aufgabeneingaben. Die Wiederverwendung dieser ID mit derselben Aufgabe gibt die bestehende Aufgabe zurück; geänderte Eingaben führen zu einem Konflikt. Bewahren Sie die ursprüngliche ID separat auf, statt sie durch die requestId einer Fehlerantwort zu ersetzen.
| Aufgabenstatus | Aktion des Aufrufers |
|---|---|
| pending oder solving | Rufen Sie dieselbe Aufgabe weiter ab. Es ist noch keine nutzbare Lösung verfügbar. |
| ready | Lesen Sie solution aus und bereiten Sie die Zielanfrage vor. |
| failed | Beenden Sie die Abfragen. Prüfen Sie errorCode und error, bevor Sie entscheiden, ob eine neue Aufgabe sinnvoll ist; fehlgeschlagene Lösungsvorgänge werden erstattet. |
Das Token mit dem ursprünglichen Proxy und der zurückgegebenen Identität übermitteln
Diese Routen geben Aufgabendaten zurück; sie übermitteln nichts an die Zielwebsite. Sobald status ready ist, muss die Komponente, die die Zielanfrage sendet, solution.token verwenden, nicht die Aufgaben-ID.
Übermitteln Sie über denselben Proxy, der zum Erstellen dieser Aufgabe verwendet wurde, mit der zurückgegebenen Browseridentität aus solution.userAgent und solution.secChUa. Bewahren Sie die ursprüngliche Aufgabenkonfiguration auf, statt anzunehmen, dass die aktuelle Umgebung noch denselben Proxy enthält. Die SDK-Hilfsfunktion successful_proxy(original_task, ready_result) wählt den Proxy aus dieser ursprünglichen Aufgabe aus.
Binden Sie die Übermittlung an das vorgesehene Ziel und die vorgesehene Aktion. Eine Aufgabe mit dem Status ready bedeutet, dass solvethree eine Lösung erzeugt hat; erst die Antwort des Ziels zeigt, ob die Anwendungsanfrage akzeptiert wurde.
Quellen und API-Referenz
Führe deinen ersten Task aus.
Starte mit $5 Workspace-Guthaben.