Go SDK'yı net/http sunucusunda kullanın
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.
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ğimain.goolarak kaydedin. - 2.
Sunucu ortamını ayarlayın
SOLVETHREE_API_KEYdeğerini çalışma alanınızın API anahtarına,INTEGRATION_KEYdeğerini ise bu dahili sunucuyu çağıranlar için ayrı bir gizli anahtara ayarlayın.CAPTCHA_SITEdeğerini hedefin ana makine adına,SOLVETHREE_PROXYdeğ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.
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
loginolarak 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.
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.
pendingveyasolving: 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ı durduruperrorCodeveerrordeğ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.
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
taskIdverequestIddeğerlerini içerir. - 2.
Yalnızca istek kimliğiniz varsa ilk oluşturma isteğini yeniden gönderin
POST isteğini aynı
X-Request-IDve 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.
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-IDseç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.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.