Go SDK'yı net/http sunucusunda kullanın

solvethree tarafından4 dk okuma

Tek bir paylaşılan solvethree istemcisi oluşturun, kimliği doğrulanmış bir POST isteğinden görev kimliğini döndürün ve durumunu ayrı bir GET isteğiyle alın. Oluşturma işleyicisinin içinde Solve çağırmayın: Bu entegrasyon, çağrıyı yapanın ilk isteği açık tutmadan sonucu beklemesini sağlar.

Bu sayfada

Sunucuyu ve hedefi yapılandırın

  1. 1.

    Go SDK'sını yükleyin

    Go 1.22 veya üzerini kullanın. Başlatılmış bir Go modülünde resmî SDK'yı go get solvethree.com/[email protected] komutuyla yükleyin. Aşağıdaki örneği main.go olarak kaydedin.

  2. 2.

    Sunucu ortamını ayarlayın

    SOLVETHREE_API_KEY değerini çalışma alanınızın API anahtarına, INTEGRATION_KEY değerini ise bu dahili sunucuyu çağıranlar için ayrı bir gizli anahtara ayarlayın. CAPTCHA_SITE değerini hedefin ana makine adına, SOLVETHREE_PROXY değerini ise çözüm için kullanılan HTTP veya HTTPS proxy URL'sine ayarlayın. Her iki anahtarı da güvenilir sunucularda tutun.

  3. 3.

    Yapılandırılan hedefi hazırlayın

    Sitenin, çalışma alanınızın kullanabildiği etkin bir profili olduğundan emin olun; site profili kurulumuna bakın. Örnekte eylem login olarak sabitlenmiştir. Sunucuyu çalıştırmadan önce bunu hedefinizin beklediği eylemle değiştirin. Ana makine adı ve eylem sağlamak profil oluşturmaz.

Go net/http · görev oluşturma ve getirme
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())
}

Modülü go run . komutuyla çalıştırın. Sunucu 127.0.0.1:3000 adresinde dinler. Go'nun standart net/http yönlendiricisini kullandığından bir çatı gerekmez. SDK istemcisi bir kez oluşturulur ve eşzamanlı kullanım için güvenlidir.

Görev, varsayılan enterprise-v3 reCAPTCHA modunu kullanır. type veya url yerine site ana makine adı, eylem ve tek bir proxy sağlar. POST gövdesi kullanılmadığından çağrıyı yapanlar istedikleri hedefi veya proxy'yi seçemez.

Bir kez POST gönderin ve görev kimliğini saklayın

X-Integration-Key üstbilgisiyle POST /captcha/tasks isteği gönderin. Kimliğini almadan bağlantı kesilirse göreve yeniden erişebilmek için çağrıyı yapanın ürettiği bir X-Request-ID de gönderin. 1–64 ASCII harfi, rakam, alt çizgi veya kısa çizgi kullanın.

İşleyici, yapılandırılan görevi doğrular ve ardından sıfır bekleme değeriyle CreateTask çağırır. Çözümün tamamlanmasını beklemeden görev oluşturulmasını ister. 20 saniyelik bağlamı, bu HTTP isteğinin ne kadar bekleyeceğini sınırlar; çözüm zaman aşımı değildir.

İşlem başarılı olduğunda işleyici SDK görev sonucunu döndürür. Görev kimliğini kaydedin ve sonraki kontroller için GET rotasını kullanın. Başarılı bir POST isteğini kullanılabilir bir belirteç olarak yorumlamayın.

Her iki rota da entegrasyon anahtarını gerektirir. Bu, kullanıcı bazında yetkilendirme değil, güvenilir bir dahili arayüzdür: Bu anahtara sahip çağrıcılar, yapılandırılmış çalışma alanı üzerinden ortak erişime sahiptir.

Mevcut görev tamamlanana kadar GET ile sorgulayın

Aynı entegrasyon anahtarı üstbilgisiyle GET /captcha/tasks/{id} isteği gönderin. İşleyici yalnızca GetTask çağırır; hiçbir zaman yerine geçecek yeni bir görev oluşturmaz. 25 saniyelik istek bağlamı içinde en fazla 15 saniye bekleme ister.

  • pending veya solving: Aynı görev kimliğini saklayın ve görevi yeniden alın.
  • ready: Çözümü okuyun. Kullanılabilir sonuç içeren tek durum budur.
  • failed: Sorgulamayı durdurup errorCode ve error değerlerini inceleyin. Başka bir görev oluşturup oluşturmamaya karar vermeden önce nedeni giderin.

Başarılı bir görev sonucunu ayrıştırmadan önce HTTP yanıt durumunu kontrol edin. Bu sunucuda yetkisiz istekler 401, geçersiz görev girdileri 400 ve SDK istek hataları 502 döndürür. Durumu failed olan bir görevin döndürülmesi, HTTP isteğinin başarısız olmasından farklı bir sonuçtur.

Başka bir çözüm oluşturmadan zaman aşımından kurtulun

Zaman aşımı, oluşturmanın başarısız olduğunu kanıtlamaz. İstek bağlamını iptal etmek uzak görevi değil, yerel beklemeyi durdurur. SDK, oluşturma POST isteğini hiçbir zaman otomatik olarak yeniden denemez.

  1. 1.

    Görev kimliğiniz varsa görevi alın

    Bu kimlikle GET rotasını kullanın. SDK hatalarında örneğin JSON hata yanıtı, SDK bunları sağlıyorsa taskId ve requestId değerlerini içerir.

  2. 2.

    Yalnızca istek kimliğiniz varsa ilk oluşturma isteğini yeniden gönderin

    POST isteğini aynı X-Request-ID ve değişmemiş görev girdileriyle yeniden gönderin. Bunun için yapılandırılmış ana makine adını, eylemi ve proxy'yi değiştirmemelisiniz. Aynı istek kimliği ve görev isteği mevcut göreve yeniden erişmenizi sağlar; bu kimlikle farklı girdiler kullanmak çakışmaya neden olur.

  3. 3.

    Kimliği ilk istekten önce saklayın

    Bir istek kimliği sağlanmadığında SDK bunu üretir, ancak bağlantısı kesilen çağrıcı bu kimliği hiç alamayabilir. POST isteğinden önce X-Request-ID seçip saklamak, kurtarma için hata yanıtına bağımlı olmayı önler.

Hazır sonucu aynı proxy ile kullanın

Bu sunucu sonucu döndürür; SDK sonucu hedefe göndermez. Gönderim kodunuz belirteci, döndürülen userAgent ve secChUa tarayıcı kimliğini ve başarılı proxy'yi kullanmalıdır. Bu tek proxy'li örnekte, çözümden sonra IP adresini değiştirmek yerine yapılandırılmış proxy'yi kullanmaya devam edin.

ready durumundaki bir görev, bir çözüm üretildiği anlamına gelir; hedefin uygulama isteğinizi kabul ettiği anlamına gelmez. Gönderim başarısız olursa başka bir çözüme ödeme yapmadan önce gönderilen belirteci, kimliği, proxy'yi ve hedef isteğini inceleyin.

İlk görevinizi çalıştırın.

$5 çalışma alanı kredisiyle başlayın.

Çalışma alanı oluşturun
Go SDK'yı net/http sunucusunda kullanın · solvethree