Go SDK hatalarını işleyin ve kesintiye uğrayan görevleri kurtarın
Zaman aşımı, görev oluşturmanın başarısız olduğu anlamına gelmez. Özgün görev girdilerini ve SDK'nın istek kimliğini saklayın. Görev kimliği elinizdeyse GetTask ile devam edin; aksi halde CreateTask çağrısını tamamen aynı özgün girdiler ve aynı istek kimliğiyle tekrarlayın.
İptal, uzaktaki görevi değil, Go istemcisinin beklemesini durdurur. Yeni bir çözüm için ödeme yapmadan önce bu görevi kurtarın.
Bu sayfada
Hata işleme örneğini çalıştırın
Go 1.22 veya üzerini resmi solvethree.com/sdk modülünün v0.1.0 sürümüyle kullanın. Kurulum için Go entegrasyon yönergelerine bakın.
Sunucu tarafındaki SOLVETHREE_API_KEY ve SOLVETHREE_PROXY ortam değişkenlerini ayarlayın. Örnekteki Site ve Action değerlerini hedef ana makine adınız ve eyleminizle değiştirin. Site için çalışma alanınızda etkin bir profil bulunmalıdır; ana makine adını göndermek profil oluşturmaz. Bu reCAPTCHA isteği tek bir proxy kullanır ve Type veya URL gerektirmez.
package main
import (
"context"
"fmt"
"errors"
"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 {
var failed *solvethree.TaskFailedError
var api *solvethree.APIError
var recovery *solvethree.Error
switch {
case errors.As(err, &failed):
log.Printf("Failed task %s: %s", failed.TaskID, failed.ErrorCode)
case errors.As(err, &recovery):
log.Printf("Recovery request=%s task=%s", recovery.RequestID, recovery.TaskID)
if errors.As(err, &api) { log.Printf("HTTP %d; retry delay %s", api.StatusCode, api.RetryAfter) }
// Save input plus recovery.RequestID. Resume GetTask for a known TaskID;
// otherwise replay CreateTask with identical inputs and that RequestID.
}
return
}
fmt.Println("Ready task:", result.ID)
// Submit result.Solution.Token with its browser identity and original proxy.
}Örnek, bağlam için 180 saniyelik bir son süre belirler ve bir SDK hatası kurtarma kimliklerini sağladığında bunları günlüğe kaydeder. Günlüğe kaydetmek kalıcı kurtarma sağlamaz: hatayı gözden çıkarmadan önce özgün input değerini, döndürülen RequestID değerini ve varsa TaskID değerini kaydedin.
“Hazır görev”, hedefin çözümü kabul ettiği değil, bir çözümün mevcut olduğu anlamına gelir. SDK bunu sizin yerinize göndermez. Solution.Token değerini döndürülen tarayıcı kimliğiyle ve bu tek proxy'li örnekte özgün proxy'yle gönderin.
Başarısız bir görev ile kesintiye uğrayan bir isteği ayırt edin
Sarmalanmış hataları errors.As, iptali ise errors.Is ile inceleyin. Bu kontroller farklı soruları yanıtlar: tek bir hata kurtarma kimlikleri içerebilir, bir HTTP hatasını sarmalayabilir ve yine de kesintiye uğramış bir işlem olarak ele alınması gerekebilir.
| Kontrol | Anlamı ve sonraki işlem |
|---|---|
*solvethree.TaskFailedError için errors.As | Görev nihai başarısızlık durumuna ulaştı. TaskID, RequestID ve ErrorCode değerlerini okuyun. Error metni için başarısız görevi GetTask ile alın, ardından bu görevi sorgulamayı bırakın. Değiştirilmemiş girdileri körü körüne yeniden göndermeyin. |
context.DeadlineExceeded veya context.Canceled için errors.Is | Çağrıyı yapan taraf beklemeyi durdurdu. Bu, oluşturmanın başarılı olup olmadığını veya uzaktaki görevin tamamlanıp tamamlanmadığını göstermez. Kurtarma bilgilerini saklayın ve uygun olduğunda yeni bir bağlamla devam edin. |
*solvethree.Error için errors.As | SDK sarmalayıcısı RequestID ve TaskID değerlerini sunar ve altta yatan Cause değerini sarmalar. Kimlikleri, özgün girdilerin eksiksiz haliyle birlikte kaydedin. |
*solvethree.APIError için errors.As | HTTP StatusCode değerini ve RetryAfter süresini inceleyin. HTTP hatası, durumu failed olan bir görevden farklıdır; başarılı bir görev yükü aldığınızı varsaymayın. |
Örnek, kurtarma dalında iç içe bir APIError olup olmadığını kontrol eder. Uygulamanızın son sürenin dolmasıyla açık bir iptali ayırt etmesi gerekiyorsa iptali ayrıca errors.Is ile kontrol edin.
Solve, görevi bir kez oluşturur. Yalnızca HTTP 429, 502, 503 veya 504 içeren geçici sorgulama yanıtlarını yeniden dener ve bağlamın son süresi içinde Retry-After değerine uyar. CreateTask, POST isteğini hiçbir zaman otomatik olarak yeniden denemez.
Mevcut göreve devam edin
- 1.
Özgün isteği olduğu gibi saklayın
Proxy veya aday listesi dahil tüm görev girdilerini istek kimliğiyle birlikte kaydedin. İstek kimliğini belirtmediğinizde CreateTask bir kimlik üretir; kurtarma hatasının sunduğu üretilmiş değeri kaydedin. İsteği daha sonra değişmiş olabilecek yapılandırmadan yeniden oluşturmayın.
- 2.
Görev kimliğini biliyorsanız GetTask kullanın
Eski bağlamın süresi dolduysa veya iptal edildiyse yeni bir bağlam oluşturun, ardından kayıtlı TaskID değerini kullanarak GetTask ile görevi alın. Durum pending veya solving ise beklemeye devam edin, çözümü yalnızca ready durumunda kullanın ve failed durumunda durun.
- 3.
Oluşturma işlemini yalnızca görev kimliğini bilmiyorsanız tekrarlayın
Kaydedilmiş özgün TaskRequest üzerindeki RequestID değerini kurtarılan istek kimliğine ayarlayın, ardından aynı girdilerle CreateTask çağrısı yapın. Aynı kimliği ve isteği yeniden kullanmak mevcut görevi döndürür. Bu kimliği yeniden kullanırken girdileri değiştirmek çakışmaya neden olur.
Yalnızca bağlantı zaman aşımına uğradığı için yeni bir istek kimliği kullanmayın. Bu, sonucu belirsiz görevi kurtarmak yerine yeni bir mantıksal görev başlatır. Önce özgün göreve ne olduğunu belirleyin; başarısız olduysa düzeltilmiş bir isteğin gerekip gerekmediğine karar vermeden önce hatasını inceleyin.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.