Go HTTP proxy'si üzerinden CAPTCHA token'ı gönderin

solvethree tarafından3 dk okuma

Hedef web sitesi için solvethree.SuccessfulProxy tarafından seçilen proxy ile yapılandırılmış ayrı bir Go HTTP istemcisi kullanın. Solution.Token değerini döndürülen tarayıcı kimliğiyle gönderin. Hedefe yönelik bu taşıma katmanını SDK istemcisinin solvethree API taşıma katmanından ayrı tutun.

Bu sayfada

Görevi hazırlayın

  1. 1.

    Go SDK'yı ve kimlik bilgilerini ayarlayın

    Resmi solvethree.com/sdk modülünün v0.1.0 sürümünü Go 1.22 veya üzeriyle kullanın. Kurulum ayrıntıları Go entegrasyon başvurusunda yer alır. SOLVETHREE_API_KEY değerini çalışma alanınızın API anahtarına ayarlayın ve sunucuda tutun. SOLVETHREE_PROXY değerini HTTP veya HTTPS proxy URL'nize ayarlayın.

  2. 2.

    Çözmeden önce siteyi yapılandırın

    Çalışma alanında hedef ana makine adı için etkin bir profil bulunmalıdır. Önce site profilini ayarlayın; ana makine adı ve eylem göndermek profil oluşturmaz.

  3. 3.

    Örnek hedefi değiştirin

    accounts.example.com değerini, login eylemini ve uygulama uç noktasını entegrasyonunuza uyacak şekilde değiştirin. Site, tam URL değil, ana makine adıdır. reCAPTCHA için Proxy veya ProxyCandidates alanlarından yalnızca birini sağlayın; görevin Type veya URL alanlarını doldurmayın. Varsayılan reCAPTCHA türü Enterprise v3'tür.

Görevi çözen proxy üzerinden gönderin

Go · başarılı proxy üzerinden gönderme
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "net/http"
    "net/url"
    "strings"
    "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)

    proxy, ok := solvethree.SuccessfulProxy(input, result)
    if !ok { log.Fatal("No valid successful proxy") }
    proxyURL, err := url.Parse(proxy)
    if err != nil { log.Fatal(err) }
    transport := http.DefaultTransport.(*http.Transport).Clone()
    transport.Proxy = http.ProxyURL(proxyURL)
    defer transport.CloseIdleConnections()
    targetClient := &http.Client{Transport: transport, Timeout: 30*time.Second,
        CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
    request, err := http.NewRequestWithContext(ctx, "POST", "https://accounts.example.com/login",
        strings.NewReader(url.Values{"g-recaptcha-response": {result.Solution.Token}}.Encode()))
    if err != nil { log.Fatal(err) }

    request.Header.Set("User-Agent", result.Solution.UserAgent)
    request.Header.Set("sec-ch-ua", result.Solution.SecChUA)
    request.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    response, err := targetClient.Do(request)
    if err != nil { log.Fatal(err) }
    defer response.Body.Close()
    fmt.Println("Application HTTP status:", response.StatusCode)
    // Inspect the application response to determine whether submission succeeded.

}

SDK görevi çözer ancak web sitesine hiçbir şey göndermez. Çözümden sonra örnek, http.DefaultTransport değerini klonlar ve klonun Proxy değerini http.ProxyURL aracılığıyla ayarlar. Bu taşıma katmanını yalnızca ayrı targetClient kullanır; SDK istemcisinin API taşıma katmanı değişmez.

Proxy kimlik bilgilerini URL'nin kullanıcı bilgisi bileşeninde tutun. url.Parse, bunları proxy taşıma katmanı için korur. URL'yi elle bölmek veya proxy kimlik bilgilerini hedefe yönelik bir Authorization üstbilgisi olarak göndermek yerine kullanıcı adı veya paroladaki ayrılmış karakterleri yüzde kodlamasıyla kodlayın.

Şu anda yalnızca tek bir proxy sağlasanız bile özgün görev girdisini saklayın ve SuccessfulProxy kullanın. ProxyCandidates kullanıldığında başarılı aday, özgün listedeki 1 tabanlı bir indeks olan Solution.EgressAttempts ile belirlenir. Yardımcı işlev, hangi adayın çalıştığını tahmin etme gereğini ortadan kaldırır; false döndürürse durun. Aday listeleri yol, sorgu veya parça içermeyen en fazla on iki farklı HTTP veya HTTPS proxy URL'si kabul eder.

Hedefin üstbilgilerini, form alanlarını ve oturumunu dahil edin

Örnek, Solution.Token değerini g-recaptcha-response altında form olarak kodlamak için url.Values kullanır ve buna uygun içerik türünü ayarlar. Uygulamanız başka bir alan adı bekliyorsa bu adı değiştirin. Giriş bilgileri ve oturuma bağlı anti-CSRF değeri gibi uç noktanın gerektirdiği diğer alanları ekleyin; CAPTCHA token'ı eksiksiz bir giriş isteği değildir.

Örnekte olduğu gibi döndürülen UserAgent ve SecChUA değerlerini kullanın. Çözüm ayrıca Headers içinde girdiler sağlıyorsa döndürülen bu üstbilgileri de hedef isteğe uygulayın; örnek bu koleksiyonu kopyalamaz. Tarayıcı kimliğini tutarlı tutun ve içerik türünün gönderdiğiniz gövdeye uygun olduğundan emin olun.

Örnekte çerez deposu yoktur. Hedef bir oturum gerektiriyorsa net/http/cookiejar ile bir depo oluşturun, hedef akışını başlatmadan önce bunu targetClient.Jar alanına bağlayın ve sayfa isteği ile form gönderimi için bu istemciyi yeniden kullanın. Bu oturum boyunca aynı başarılı proxy'yi kullanın. solvethree API istemcisi, hedefin oturum istemcisi değildir.

Çözüme erişmeden önce çözüm hatasını kontrol edin. Yalnızca hazır bir görevin kullanılabilir bir çözümü vardır; başarısız bir görevin errorCode ve error alanları hatayı açıklar. Hedef istekte önce Do hatasını ele alın, ardından yanıt gövdesini yorumlamadan önce HTTP durumunu kontrol edin. Do hatasız bir yanıt döndürdüğünde, başarılı olmayan HTTP yanıtları da dahil olmak üzere, response.Body öğesini kapatın.

Örnek, otomatik yönlendirmeleri devre dışı bırakır ve uygulama durumunu yazdırır. Uygulamanın gönderimi kabul edip etmediğini belirlemek için yanıt gövdesini ve beklenen yönlendirmeleri inceleyin. Görevin hazır olması veya tek başına başarılı bir HTTP durumu bu sonucu kanıtlamaz.

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

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

Çalışma alanı oluşturun
Go HTTP proxy'si üzerinden CAPTCHA token'ı gönderin · solvethree