solvethree in einer Django-View verwenden

Von solvethree4 Min. Lesezeit

Erstellen Sie die Aufgabe in einer POST-View, geben Sie ihre ID zurück und lassen Sie den Aufrufer ihren Status abrufen. Halten Sie die Erstellungsanfrage nicht offen, bis der Lösungsversuch abgeschlossen ist.

Die bereitgestellten Views verwenden ein konfiguriertes reCAPTCHA Enterprise-Ziel und einen einzelnen Proxy. Sie sind für ein bestehendes Django-Projekt mit aktivierter Authentifizierung und standardmäßiger CSRF-Middleware vorgesehen.

Auf dieser Seite

SDK installieren und Ziel konfigurieren

  1. 1.

    In der Django-Umgebung installieren

    Das offizielle SDK benötigt Python 3.10+. Führen Sie in der Umgebung, in der Django läuft, python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl aus.

  2. 2.

    Server-Umgebungsvariablen setzen

    Setzen Sie SOLVETHREE_API_KEY auf den API-Schlüssel Ihres Workspace, CAPTCHA_SITE auf den Zielhostname – nicht auf eine vollständige URL – und SOLVETHREE_PROXY auf den Proxy, der zum Lösen und für die anschließende Übermittlung an das Ziel verwendet wird. Bewahren Sie den API-Schlüssel und die Proxy-Zugangsdaten auf dem Server auf.

  3. 3.

    Profil der Website aktivieren

    Konfigurieren Sie in der Konsole ein aktives Profil für diesen Hostnamen, das Ihrem Workspace zur Verfügung steht. Das Senden eines Hostnamens und einer Aktion erstellt kein Profil. Siehe Website-Profil einrichten.

Das Beispiel legt die Aktion auf login fest und übernimmt keine Zieleinstellungen vom Aufrufer. Ändern Sie diese Aktion, wenn Ihr konfiguriertes Ziel eine andere erfordert. Die Anfrage verwendet den Standardmodus enterprise-v3; sie benötigt site, action und genau eines von proxy oder proxyCandidates, nicht type oder url.

Authentifizierte Views hinzufügen

Django · Authentifizierte Views mit regulärem CSRF-Schutz
# views.py in an existing Django project with authentication/CSRF configured.
import os
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.views.decorators.http import require_GET, require_POST
from solvethree import Solvethree, SolvethreeError

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

@login_required
@require_POST
def create_captcha(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"]
    try:
        return JsonResponse(client().create_task(task, wait_ms=0, timeout=20))
    except ValueError:
        return JsonResponse({"error": "Invalid task input"}, status=400)
    except SolvethreeError as error:
        return JsonResponse({"requestId": error.request_id, "taskId": error.task_id}, status=502)

@login_required
@require_GET
def get_captcha(request, task_id):
    try:
        return JsonResponse(client().get_task(task_id, wait_ms=15000, timeout=25))
    except ValueError:
        return JsonResponse({"error": "Invalid task ID"}, status=400)
    except SolvethreeError as error:
        return JsonResponse({"requestId": error.request_id, "taskId": error.task_id}, status=502)

# urls.py: import these views and add to urlpatterns:
# path("captcha/tasks", create_captcha),
# path("captcha/tasks/<str:task_id>", get_captcha),

create_task verwendet wait_ms=0 und gibt die Aufgabe daher zurück, ohne auf den gesamten Lösungsversuch zu warten. Der HTTP-Aufruf hat einen Timeout von 20 Sekunden. Die Abruf-View kann bis zu 15 Sekunden auf eine Aufgabenaktualisierung warten, bei einem HTTP-Timeout von 25 Sekunden. Dies sind synchrone SDK-Aufrufe: Die Abrufanfrage belegt während des Wartens weiterhin ihren Django-Worker.

login_required beschränkt den Zugriff auf angemeldete Nutzer; die Methoden-Dekoratoren erlauben POST zum Erstellen und GET zum Abrufen. Behalten Sie den normalen CSRF-Schutz von Django bei und senden Sie dessen CSRF-Token bei POST-Anfragen mit. Fügen Sie kein csrf_exempt hinzu.

Routen einbinden und Django starten

  1. 1.

    Bestehende URLconf aktualisieren

    Importieren Sie path aus django.urls sowie create_captcha und get_captcha aus dem Views-Modul Ihrer App. Fügen Sie die beiden Routeneinträge am Ende des Beispiels zu den bestehenden urlpatterns hinzu. Wenn Sie eine App-URLconf verwenden, stellen Sie sicher, dass die Projekt-URLconf sie einbindet.

  2. 2.

    Entwicklungsserver starten

    Stellen Sie sicher, dass die Umgebungsvariablen für den Prozess verfügbar sind, und führen Sie python manage.py runserver im Verzeichnis mit manage.py aus. Nutzen Sie den bestehenden Anmeldeablauf Ihres Projekts, bevor Sie die Endpunkte aufrufen.

  3. 3.

    Registrierte Pfade verwenden

    Ohne übergeordnetes URL-Präfix erfolgt die Erstellung über POST /captcha/tasks und der Abruf über GET /captcha/tasks/<task_id>. Die bereitgestellten Routen haben keinen abschließenden Schrägstrich. Berücksichtigen Sie alle Präfixe aus Ihrer Projekt-URLconf.

Einmal erstellen, dann die Aufgabe abrufen

  1. 1.

    ID vor dem Senden der POST-Anfrage speichern

    Wählen Sie für jede logische Aufgabe eine neue X-Request-ID und bewahren Sie sie auf, bis die Erstellung geklärt ist. Verwenden Sie 1–64 ASCII-Buchstaben, Ziffern, Unterstriche oder Bindestriche. Die View leitet diesen Header als requestId der Aufgabe weiter.

  2. 2.

    HTTP-Erfolg vor dem Aufgabenstatus prüfen

    Das Beispiel gibt bei abgefangenen Eingabevalidierungsfehlern HTTP 400 und bei abgefangenen SDK-Fehlern 502 zurück. Eine erfolgreiche Antwort enthält die Aufgaben-Payload; lesen Sie deren id und status aus. HTTP-Erfolg bedeutet, dass die Anfrage erfolgreich war, nicht dass ein Token bereitsteht.

  3. 3.

    Aufgabe bis zum Abschluss abrufen

    Rufen Sie den GET-Endpunkt mit der zurückgegebenen Aufgaben-ID auf. Fahren Sie bei pending oder solving fort. Verwenden Sie bei ready die Lösung. Beenden Sie bei failed das Polling und prüfen Sie errorCode und error; fehlgeschlagene Lösungsversuche werden erstattet. Korrigieren Sie ungültige Eingaben, statt sie unverändert erneut zu senden.

  4. 4.

    Aufgabe bei unklarer Erstellung wiederfinden

    Wenn die POST-Anfrage einen Timeout hat oder einen SDK-Fehler zurückgibt, erstellen Sie nicht sofort eine weitere Aufgabe mit einer neuen ID. Rufen Sie die bestehende Aufgabe ab, wenn ihre ID bekannt ist. Andernfalls wiederholen Sie die POST-Anfrage mit der ursprünglichen X-Request-ID und unveränderten Aufgabeneingaben, um sie wiederzufinden. Die Wiederverwendung dieser ID mit anderen Eingaben führt zu einem Konflikt – auch bei Änderungen am konfigurierten Hostnamen, an der Aktion oder am Proxy.

Die SDK-Fehlerantwort enthält zur Diagnose requestId und taskId aus der Ausnahme. Bewahren Sie die ursprüngliche X-Request-ID des Aufrufers separat auf, damit die Wiederherstellung nicht vom Empfang dieser Antwort abhängt. Hinweise zur Fehlerbehandlung finden Sie unter CAPTCHA-API-Fehler.

Token mit demselben Proxy und der zurückgegebenen Identität übermitteln

Nur eine ready-Aufgabe enthält eine verwendbare Lösung. An das vorgesehene Ziel muss solution.token gesendet werden, nicht die Aufgaben-ID. Verwenden Sie die zurückgegebene Browseridentität aus solution.userAgent und solution.secChUa zusammen mit dem ursprünglich in SOLVETHREE_PROXY konfigurierten Proxy.

Diese Views senden nichts an das Ziel. Ihr Übermittlungscode muss diesen Proxy beibehalten und die zurückgegebene Identität anwenden; die Rückgabe des Tokens an eine andere Browsersitzung erledigt das nicht automatisch. Bewahren Sie Proxy-Zugangsdaten serverseitig auf und kombinieren Sie die Lösung nicht mit einer anderen Ziel-URL oder Browseridentität.

Führe deinen ersten Task aus.

Starte mit $5 Workspace-Guthaben.

Workspace erstellen
solvethree in einer Django-View verwenden · solvethree