Das Go-SDK in einem net/http-Server verwenden
Erstellen Sie einen gemeinsam genutzten solvethree-Client, geben Sie die Aufgaben-ID über einen authentifizierten POST zurück und rufen Sie den Status über einen separaten GET ab. Rufen Sie Solve nicht im Create-Handler auf: Diese Integration ermöglicht es dem Aufrufer, auf das Ergebnis zu warten, ohne die ursprüngliche Anfrage offen zu halten.
Auf dieser Seite
Server und Ziel konfigurieren
- 1.
Go-SDK installieren
Verwenden Sie Go 1.22 oder neuer. Installieren Sie in einem initialisierten Go-Modul das offizielle SDK mit
go get solvethree.com/[email protected]. Speichern Sie das folgende Beispiel alsmain.go. - 2.
Serverumgebung konfigurieren
Setzen Sie
SOLVETHREE_API_KEYauf den API-Schlüssel Ihres Workspaces undINTEGRATION_KEYauf ein separates Geheimnis für Aufrufer dieses internen Servers. Setzen SieCAPTCHA_SITEauf den Zielhostnamen undSOLVETHREE_PROXYauf die HTTP- oder HTTPS-Proxy-URL, die für die Lösung verwendet wird. Bewahren Sie beide Schlüssel auf vertrauenswürdigen Servern auf. - 3.
Das konfigurierte Ziel vorbereiten
Stellen Sie sicher, dass für die Website ein aktives Profil verfügbar ist, auf das Ihr Workspace zugreifen kann; siehe Websiteprofil einrichten. Das Beispiel legt die Aktion auf
loginfest. Ändern Sie sie vor dem Start des Servers in die vom Ziel erwartete Aktion. Die Angabe eines Hostnamens und einer Aktion erstellt kein Profil.
package main
import (
"context"
"encoding/json"
"errors"
"log"
"net/http"
"os"
"time"
solvethree "solvethree.com/sdk"
)
func main() {
client, err := solvethree.NewClient(os.Getenv("SOLVETHREE_API_KEY"), nil)
if err != nil { log.Fatal(err) }
secret := os.Getenv("INTEGRATION_KEY")
if secret == "" { log.Fatal("Set INTEGRATION_KEY") }
authorize := func(w http.ResponseWriter, r *http.Request) bool {
if r.Header.Get("X-Integration-Key") != secret { http.Error(w, "Unauthorized", 401); return false }
return true
}
respond := func(w http.ResponseWriter, result *solvethree.TaskResult, err error) {
w.Header().Set("Content-Type", "application/json")
if err != nil {
var recovery *solvethree.Error
w.WriteHeader(http.StatusBadGateway)
ids := map[string]string{"error": "Solver request failed"}
if errors.As(err, &recovery) { ids["requestId"] = recovery.RequestID; ids["taskId"] = recovery.TaskID }
_ = json.NewEncoder(w).Encode(ids)
return
}
_ = json.NewEncoder(w).Encode(result)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /captcha/tasks", func(w http.ResponseWriter, r *http.Request) {
if !authorize(w,r) { return }
input := solvethree.TaskRequest{Site: os.Getenv("CAPTCHA_SITE"), Action:"login",
Proxy:os.Getenv("SOLVETHREE_PROXY"), RequestID:r.Header.Get("X-Request-ID")}
if err := input.Validate(); err != nil { http.Error(w,"Invalid task input",400);return }
ctx,cancel := context.WithTimeout(r.Context(),20*time.Second);defer cancel()
zero:=0
result,err:=client.CreateTask(ctx,input,&zero)
respond(w,result,err)
})
mux.HandleFunc("GET /captcha/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if !authorize(w,r) { return }
ctx,cancel:=context.WithTimeout(r.Context(),25*time.Second);defer cancel()
result,err:=client.GetTask(ctx,r.PathValue("id"),15000)
respond(w,result,err)
})
server:=&http.Server{Addr:"127.0.0.1:3000", Handler:mux, ReadHeaderTimeout:5*time.Second}
log.Fatal(server.ListenAndServe())
}Starten Sie das Modul mit go run .. Der Server lauscht auf 127.0.0.1:3000. Er verwendet den standardmäßigen net/http-Router von Go, daher ist kein Framework erforderlich. Der SDK-Client wird einmal erstellt und kann sicher nebenläufig verwendet werden.
Die Aufgabe verwendet den standardmäßigen reCAPTCHA-Modus enterprise-v3. Sie übermittelt einen Websitehostnamen, eine Aktion und einen einzelnen Proxy – kein type oder url. Der POST-Body wird nicht verwendet, sodass Aufrufer keine beliebigen Ziele oder Proxys auswählen können.
Einmal per POST erstellen und die Aufgaben-ID aufbewahren
Senden Sie POST /captcha/tasks mit dem Header X-Integration-Key. Senden Sie außerdem eine vom Aufrufer generierte X-Request-ID, damit Sie die Aufgabe wieder abrufen können, falls die Verbindung endet, bevor Sie ihre ID erhalten. Verwenden Sie 1–64 ASCII-Buchstaben, Ziffern, Unterstriche oder Bindestriche.
Der Handler validiert die konfigurierte Aufgabe und ruft dann CreateTask mit einem Wartewert von null auf. Er fordert die Erstellung der Aufgabe an, ohne auf den Abschluss der Lösung zu warten. Sein Kontext von 20 Sekunden begrenzt die Wartezeit dieser HTTP-Anfrage; er ist kein Zeitlimit für die Lösung.
Bei Erfolg gibt der Handler das Aufgabenergebnis des SDK zurück. Speichern Sie die Aufgaben-ID und verwenden Sie die GET-Route für weitere Abfragen. Ein erfolgreicher POST bedeutet nicht, dass ein nutzbares Token vorliegt.
Beide Routen erfordern den Integrationsschlüssel. Dies ist eine vertrauenswürdige interne Schnittstelle, keine benutzerspezifische Autorisierung: Aufrufer mit diesem Schlüssel teilen sich den Zugriff über den konfigurierten Workspace.
Die bestehende Aufgabe bis zum Abschluss per GET abrufen
Senden Sie GET /captcha/tasks/{id} mit demselben Integrationsschlüssel-Header. Der Handler ruft ausschließlich GetTask auf; er erstellt niemals eine Ersatzaufgabe. Er fordert bis zu 15 Sekunden Wartezeit innerhalb eines Anfragekontexts von 25 Sekunden an.
pendingodersolving: Behalten Sie dieselbe Aufgaben-ID bei und rufen Sie die Aufgabe erneut ab.ready: Lesen Sie die Lösung aus. Dies ist der einzige Status mit einem nutzbaren Ergebnis.failed: Beenden Sie das Polling und prüfen SieerrorCodeunderror. Beheben Sie die Ursache, bevor Sie entscheiden, ob Sie eine weitere Aufgabe erstellen.
Prüfen Sie den HTTP-Antwortstatus, bevor Sie ein erfolgreiches Aufgabenergebnis dekodieren. Bei diesem Server erhalten nicht autorisierte Anfragen den Status 401, ungültige Aufgabeneingaben den Status 400 und SDK-Anfragefehler den Status 502. Eine zurückgegebene Aufgabe mit dem Status failed ist ein anderes Ergebnis als eine fehlgeschlagene HTTP-Anfrage.
Nach einer Zeitüberschreitung fortfahren, ohne eine weitere Lösung zu erstellen
Eine Zeitüberschreitung beweist nicht, dass das Erstellen fehlgeschlagen ist. Das Abbrechen des Anfragekontexts beendet das lokale Warten, nicht die entfernte Aufgabe. Das SDK wiederholt den POST zum Erstellen niemals automatisch.
- 1.
Wenn Sie eine Aufgaben-ID haben, rufen Sie die Aufgabe ab
Verwenden Sie die GET-Route mit dieser ID. Bei SDK-Fehlern enthält die JSON-Fehlerantwort des Beispiels
taskIdundrequestId, sofern das SDK sie bereitstellt. - 2.
Wenn Sie nur die Anfrage-ID haben, wiederholen Sie die ursprüngliche Erstellung
Senden Sie den POST erneut mit derselben
X-Request-IDund unveränderten Aufgabeneingaben. Behalten Sie also den konfigurierten Hostnamen, die Aktion und den Proxy bei. Dieselbe Anfrage-ID und Aufgabenanfrage rufen die bestehende Aufgabe wieder ab; andere Eingaben mit dieser ID führen zu einem Konflikt. - 3.
Bewahren Sie die ID vor der ersten Anfrage auf
Das SDK generiert eine Anfrage-ID, wenn keine angegeben wird. Ein Aufrufer, dessen Verbindung abbricht, erhält sie jedoch möglicherweise nie. Wenn Sie
X-Request-IDvor dem POST festlegen und aufbewahren, sind Sie für die Wiederherstellung nicht auf die Fehlerantwort angewiesen.
Das fertige Ergebnis mit demselben Proxy verwenden
Dieser Server gibt das Ergebnis zurück; das SDK übermittelt es nicht an das Ziel. Ihr Code zur Übermittlung muss das Token, die zurückgegebene Browseridentität aus userAgent und secChUa sowie den erfolgreichen Proxy verwenden. Verwenden Sie in diesem Beispiel mit einem einzelnen Proxy weiterhin den konfigurierten Proxy, statt nach dem Lösen die IP zu wechseln.
Eine Aufgabe mit dem Status ready bedeutet, dass eine Lösung generiert wurde, nicht, dass das Ziel die Anfrage Ihrer Anwendung akzeptiert hat. Wenn die Übermittlung fehlschlägt, prüfen Sie das ausgehende Token, die Identität, den Proxy und die Zielanfrage, bevor Sie für eine weitere Lösung bezahlen.
Quellen und API-Referenz
Führe deinen ersten Task aus.
Starte mit $5 Workspace-Guthaben.