Go SDK की त्रुटियाँ संभालें और बाधित टास्क रिकवर करें

solvethree द्वारापढ़ने में 4 मिनट

टाइमआउट का मतलब यह नहीं कि टास्क बनाना विफल हुआ। मूल टास्क इनपुट और SDK की अनुरोध ID सुरक्षित रखें। टास्क ID हो तो GetTask से फिर शुरू करें; नहीं तो बिल्कुल वही मूल इनपुट और वही अनुरोध ID देकर CreateTask दोबारा चलाएँ।

कैंसलेशन Go क्लाइंट का इंतज़ार रोकता है, रिमोट टास्क नहीं। नए समाधान के लिए भुगतान करने से पहले उस टास्क को रिकवर करें।

इस पेज पर

त्रुटियाँ संभालने वाला उदाहरण चलाएँ

Go 1.22 या बाद का संस्करण और आधिकारिक solvethree.com/sdk मॉड्यूल का संस्करण v0.1.0 इस्तेमाल करें। सेटअप के लिए Go इंटीग्रेशन निर्देश देखें।

सर्वर-साइड एनवायरनमेंट वेरिएबल SOLVETHREE_API_KEY और SOLVETHREE_PROXY सेट करें। उदाहरण के Site और Action की जगह अपना लक्ष्य होस्टनाम और ऐक्शन डालें। साइट की आपके वर्कस्पेस में सक्रिय प्रोफ़ाइल होनी चाहिए; उसका होस्टनाम भेजने से प्रोफ़ाइल नहीं बनती। यह reCAPTCHA अनुरोध एक प्रॉक्सी इस्तेमाल करता है और इसे Type या URL की ज़रूरत नहीं है।

Go · त्रुटियों की जाँच करें और रिकवरी ID सुरक्षित रखें
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.
}

उदाहरण कॉन्टेक्स्ट की समय-सीमा 180 सेकंड सेट करता है और SDK त्रुटि में रिकवरी ID उपलब्ध होने पर उन्हें लॉग करता है। लॉगिंग स्थायी रिकवरी नहीं है: त्रुटि को हटाने से पहले मूल input, लौटाया गया RequestID और कोई भी TaskID सहेजें।

“तैयार टास्क” का मतलब है कि समाधान उपलब्ध है, यह नहीं कि लक्ष्य ने उसे स्वीकार कर लिया है। SDK आपकी ओर से इसे सबमिट नहीं करता। लौटाई गई ब्राउज़र पहचान और, एक प्रॉक्सी वाले इस उदाहरण में, मूल प्रॉक्सी का इस्तेमाल करके Solution.Token सबमिट करें।

विफल टास्क और बाधित अनुरोध में अंतर करें

रैप की गई त्रुटियाँ errors.As से और कैंसलेशन errors.Is से जाँचें। ये जाँचें अलग-अलग सवालों के जवाब देती हैं: एक त्रुटि में रिकवरी ID हो सकती हैं, वह HTTP त्रुटि को रैप कर सकती है और फिर भी उसे बाधित ऑपरेशन के रूप में संभालना पड़ सकता है।

हर त्रुटि क्या बताती है
हर त्रुटि क्या बताती है
जाँचअर्थ और अगली कार्रवाई
*solvethree.TaskFailedError के लिए errors.Asटास्क अंतिम विफलता की स्थिति में पहुँच गया है। TaskID, RequestID और ErrorCode पढ़ें। उसका Error टेक्स्ट पाने के लिए GetTask से विफल टास्क प्राप्त करें, फिर उस टास्क की पोलिंग रोक दें। बिना सोचे अपरिवर्तित इनपुट दोबारा सबमिट न करें।
context.DeadlineExceeded या context.Canceled के लिए errors.Isकॉलर ने इंतज़ार करना बंद कर दिया। इससे यह तय नहीं होता कि टास्क बन गया था या रिमोट टास्क पूरा हो गया था। रिकवरी की जानकारी सुरक्षित रखें और उचित होने पर नए कॉन्टेक्स्ट से फिर शुरू करें।
*solvethree.Error के लिए errors.AsSDK रैपर RequestID और TaskID उपलब्ध कराता है और अंतर्निहित Cause को रैप करता है। बिल्कुल वही मूल इनपुट और ID साथ में सहेजें।
*solvethree.APIError के लिए errors.AsHTTP StatusCode और RetryAfter अवधि की जाँच करें। HTTP त्रुटि और failed स्टेटस वाला टास्क अलग हैं; यह न मानें कि आपको सफल टास्क का पेलोड मिला है।

उदाहरण अपनी रिकवरी ब्रांच में नेस्टेड APIError की जाँच करता है। अगर आपके एप्लिकेशन को समय-सीमा पूरी होने और स्पष्ट कैंसलेशन में अंतर करना है, तो errors.Is से कैंसलेशन अलग से जाँचें।

Solve टास्क एक बार बनाता है। यह केवल HTTP 429, 502, 503 या 504 वाले अस्थायी पोलिंग रिस्पॉन्स पर दोबारा प्रयास करता है और कॉन्टेक्स्ट की समय-सीमा के भीतर Retry-After का पालन करता है। CreateTask अपना POST कभी अपने-आप दोबारा नहीं भेजता।

मौजूदा टास्क से आगे जारी रखें

  1. 1.

    मूल अनुरोध जस का तस रखें

    प्रॉक्सी या कैंडिडेट सूची सहित सभी टास्क इनपुट अनुरोध ID के साथ सहेजें। अनुरोध ID न देने पर CreateTask एक ID जनरेट करता है; रिकवरी त्रुटि में उपलब्ध कराया गया यह जनरेट किया गया मान सहेजें। बाद में ऐसे कॉन्फ़िगरेशन से अनुरोध दोबारा न बनाएँ जो बदल चुका हो सकता है।

  2. 2.

    टास्क ID पता हो तो GetTask इस्तेमाल करें

    पुराना कॉन्टेक्स्ट समाप्त या रद्द हो गया हो तो नया कॉन्टेक्स्ट बनाएँ, फिर सहेजे गए TaskID वाला टास्क GetTask से प्राप्त करें। pending या solving स्थिति में इंतज़ार जारी रखें, केवल ready स्थिति में समाधान इस्तेमाल करें और failed पर रुक जाएँ।

  3. 3.

    टास्क ID पता न होने पर ही बनाने का अनुरोध दोबारा भेजें

    सहेजे गए मूल TaskRequest में RequestID को रिकवर की गई अनुरोध ID पर सेट करें, फिर उन्हीं इनपुट के साथ CreateTask कॉल करें। वही ID और अनुरोध दोबारा इस्तेमाल करने से मौजूदा टास्क लौटता है। उसी ID का दोबारा इस्तेमाल करते हुए इनपुट बदलने से कॉन्फ़्लिक्ट होता है।

केवल कनेक्शन टाइमआउट होने के कारण नई अनुरोध ID इस्तेमाल न करें। इससे अनिश्चित स्थिति वाले टास्क को रिकवर करने के बजाय नया लॉजिकल टास्क शुरू होता है। पहले पता करें कि मूल टास्क का क्या हुआ; अगर वह विफल हुआ, तो संशोधित अनुरोध की ज़रूरत तय करने से पहले उसकी त्रुटि जाँचें।

अपना पहला टास्क चलाएँ।

$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।

वर्कस्पेस बनाएँ
Go SDK की त्रुटियाँ संभालें और बाधित टास्क रिकवर करें · solvethree