Go ile reCAPTCHA Enterprise çözün
solvethree.com/sdk paketini kurun ve hedef ana makine adınız, eyleminiz ve proxy'nizle Solve çağrısı yapın. SDK, görevi bir kez oluşturur ve sonucu almak için durumunu sorgular. Ardından uygulamanız tokenı hedefe gönderir.
Bu sayfada
SDK'yı kurun ve yapılandırın
Go 1.22+ kullanın. Go modülünüzde şu komutu çalıştırın:
go get solvethree.com/sdk@v0.1.0SOLVETHREE_API_KEYdeğerini çalışma alanınızın API anahtarına,SOLVETHREE_PROXYdeğerini ise HTTP(S) proxy URL'nize ayarlayın. İkisini de sunucu yapılandırmasında tutun.- Çalışma alanınızda hedef ana makine adı için etkin bir profil oluşturun. Site profili kurulumuna bakın.
accounts.example.comvelogindeğerlerini hedefinizin kullandığı ana makine adı ve eylemle değiştirin.Site, şema veya yol içermeyen bir ana makine adı alır.
Bir görev çözün
Bunu main.go olarak kaydedin ve go run . komutunu çalıştırın.
package main
import (
"context"
"fmt"
"log"
"os"
"time"
solvethree "solvethree.com/sdk"
)
func main() {
client, err := solvethree.NewClient(os.Getenv("SOLVETHREE_API_KEY"), nil)
if err != nil { log.Fatal(err) }
ctx, cancel := context.WithTimeout(context.Background(), 180*time.Second)
defer cancel()
input := solvethree.TaskRequest{Site: "accounts.example.com", Action: "login", Proxy: os.Getenv("SOLVETHREE_PROXY")}
result, err := client.Solve(ctx, input, solvethree.SolveOptions{})
if err != nil { log.Fatal(err) }
fmt.Println("Ready task:", result.ID)
// Submit result.Solution.Token with its browser identity and original proxy.
}Context, yerel beklemeyi 180 saniyeyle sınırlar. Solve, hazır bir TaskResult veya bir hata döndürür; etrafına başka bir sorgulama döngüsü eklemeniz gerekmez. Bu istek varsayılan Enterprise v3 modunu kullanır. Standart v3 için RecaptchaType: "v3" ayarlayın. reCAPTCHA için Type ve URL alanlarını ayarlamayın.
Tokenı hedefinize gönderin
Uygulamanın CAPTCHA alanında result.Solution.Token gönderin. Yazdırılan result.ID, görevi tanımlar; token değildir.
result.Solution.UserAgent değerini User-Agent, result.Solution.SecChUA değerini ise sec-ch-ua olarak kullanın. Hedef isteği, solvethree.SuccessfulProxy(input, result) ile seçilen, çözümde başarılı olan proxy üzerinden yönlendirin.
Uygulamanın diğer form alanlarını, çerezlerini ve CSRF değerini ekleyin, ardından yanıtını kontrol edin. SDK bir çözüm döndürür; uygulama isteğini sizin yerinize göndermez.
Bekleme kesilirse kimlikleri saklayın
Context'in iptal edilmesi, uzaktaki çalışmayı değil yerel beklemeyi durdurur. *solvethree.Error, RequestID ve TaskID değerlerini sunar. Bilinen bir görevi GetTask ile alın; oluşturulup oluşturulmadığı belirsizse özgün girdileri hiç değiştirmeden aynı RequestID ile yeniden gönderin.
Süreç yeniden başlatmaları arasında kurtarma yapabilmek için oluşturmadan önce RequestID atayın ve görev girdileriyle birlikte kaydedin. *TaskFailedError nihai bir hatadır: ErrorCode değerini inceleyin ve hata metnini almak için görevi getirin. Başka bir çözüm başlatmadan önce hatanın nedenini giderin.
Alternatif: standart kütüphaneyle REST çağrısı yapın
HTTP çağrılarını kendiniz yönetmeyi tercih ediyorsanız bu sürüm doğrudan net/http kullanır. Bunu veya yukarıdaki SDK örneğini seçin; ikisini birden çalıştırmak iki görev oluşturur. Buradaki yanıt yapıları bu bağımsız örneğe aittir; bu nedenle alan adları SDK'nın türlerindekilerden farklıdır.
package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"time"
)
type Task struct {
ID string `json:"id"`
Status string `json:"status"`
ErrorCode string `json:"errorCode"`
Error string `json:"error"`
Solution struct {
Token string `json:"token"`
UserAgent string `json:"userAgent"`
SecChUa string `json:"secChUa"`
} `json:"solution"`
}
func main() {
key, proxy := os.Getenv("SOLVETHREE_API_KEY"), os.Getenv("SOLVETHREE_PROXY")
if key == "" || proxy == "" { panic("Set SOLVETHREE_API_KEY and SOLVETHREE_PROXY") }
ctx, cancel := context.WithTimeout(context.Background(), 180*time.Second)
defer cancel()
client := &http.Client{Timeout: 30*time.Second}
api := func(method, path string, body []byte) (Task, error) {
var task Task
req, err := http.NewRequestWithContext(ctx, method, "https://api.solvethree.com/v1"+path, bytes.NewReader(body))
if err != nil { return task, err }
req.Header.Set("Authorization", "Bearer "+key)
req.Header.Set("Content-Type", "application/json")
response, err := client.Do(req)
if err != nil { return task, err }
defer response.Body.Close()
if response.StatusCode < 200 || response.StatusCode >= 300 { return task, fmt.Errorf("API HTTP %d", response.StatusCode) }
err = json.NewDecoder(response.Body).Decode(&task)
return task, err
}
requestID := fmt.Sprintf("go-%d", time.Now().UnixNano())
body, err := json.Marshal(map[string]string{
"site":"accounts.example.com", "action":"login", "proxy":proxy, "requestId":requestID,
})
if err != nil { panic(err) }
// Persist requestID and body before creation if this must survive a restart.
task, err := api(http.MethodPost, "/tasks?waitMs=0", body)
if err != nil { panic(fmt.Errorf("request %s: %w", requestID, err)) }
for task.Status == "pending" || task.Status == "solving" {
task, err = api(http.MethodGet, "/tasks/"+url.PathEscape(task.ID)+"?waitMs=15000", nil)
if err != nil { panic(err) }
if task.Status == "pending" || task.Status == "solving" {
select { case <-ctx.Done(): panic(ctx.Err()); case <-time.After(time.Second): }
}
}
if task.Status != "ready" { panic("Task failed: "+task.ErrorCode+": "+task.Error) }
solution := task.Solution
_ = solution // Apply token and returned browser identity using the same proxy.
fmt.Println("Ready task:", task.ID)
}Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.