Go ile reCAPTCHA Enterprise çözün

solvethree tarafından2 dk okuma

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:

Resmî Go SDK’sını yükleme
go get solvethree.com/sdk@v0.1.0
  • SOLVETHREE_API_KEY değerini çalışma alanınızın API anahtarına, SOLVETHREE_PROXY değ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.com ve login değ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.

Go · bir kez oluşturma ve durum sorgulama
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.

Go 1.22+ · main.go
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)
}

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

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

Çalışma alanı oluşturun
Go ile reCAPTCHA Enterprise çözün · solvethree