net/http सर्वर में Go SDK इस्तेमाल करें
एक साझा solvethree क्लाइंट बनाएँ, प्रमाणित POST से टास्क ID लौटाएँ और अलग GET से उसकी स्थिति प्राप्त करें। क्रिएट हैंडलर के अंदर Solve को कॉल न करें: यह इंटीग्रेशन कॉलर को मूल अनुरोध खुला रखे बिना परिणाम की प्रतीक्षा करने देता है।
इस पेज पर
सर्वर और टार्गेट कॉन्फ़िगर करें
- 1.
Go SDK इंस्टॉल करें
Go 1.22 या नया संस्करण उपयोग करें। इनिशियलाइज़ किए गए Go मॉड्यूल में
go get solvethree.com/[email protected]से आधिकारिक SDK इंस्टॉल करें। नीचे दिए उदाहरण कोmain.goके रूप में सेव करें। - 2.
सर्वर एनवायरनमेंट सेट करें
SOLVETHREE_API_KEYको अपनी वर्कस्पेस API कुंजी पर औरINTEGRATION_KEYको इस आंतरिक सर्वर के कॉलर के लिए अलग सीक्रेट पर सेट करें।CAPTCHA_SITEको टार्गेट होस्टनेम पर औरSOLVETHREE_PROXYको समाधान के लिए उपयोग किए जाने वाले HTTP या HTTPS प्रॉक्सी URL पर सेट करें। दोनों कुंजियाँ भरोसेमंद सर्वर पर रखें। - 3.
कॉन्फ़िगर किया गया टार्गेट तैयार करें
सुनिश्चित करें कि साइट की सक्रिय प्रोफ़ाइल आपके वर्कस्पेस के लिए उपलब्ध है; साइट प्रोफ़ाइल सेटअप देखें। उदाहरण में ऐक्शन
loginपर तय है। सर्वर चलाने से पहले इसे उस ऐक्शन में बदलें जिसकी आपके टार्गेट को अपेक्षा है। होस्टनेम और ऐक्शन देने से प्रोफ़ाइल नहीं बनती।
package main
import (
"context"
"encoding/json"
"errors"
"log"
"net/http"
"os"
"time"
solvethree "solvethree.com/sdk"
)
func main() {
client, err := solvethree.NewClient(os.Getenv("SOLVETHREE_API_KEY"), nil)
if err != nil { log.Fatal(err) }
secret := os.Getenv("INTEGRATION_KEY")
if secret == "" { log.Fatal("Set INTEGRATION_KEY") }
authorize := func(w http.ResponseWriter, r *http.Request) bool {
if r.Header.Get("X-Integration-Key") != secret { http.Error(w, "Unauthorized", 401); return false }
return true
}
respond := func(w http.ResponseWriter, result *solvethree.TaskResult, err error) {
w.Header().Set("Content-Type", "application/json")
if err != nil {
var recovery *solvethree.Error
w.WriteHeader(http.StatusBadGateway)
ids := map[string]string{"error": "Solver request failed"}
if errors.As(err, &recovery) { ids["requestId"] = recovery.RequestID; ids["taskId"] = recovery.TaskID }
_ = json.NewEncoder(w).Encode(ids)
return
}
_ = json.NewEncoder(w).Encode(result)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /captcha/tasks", func(w http.ResponseWriter, r *http.Request) {
if !authorize(w,r) { return }
input := solvethree.TaskRequest{Site: os.Getenv("CAPTCHA_SITE"), Action:"login",
Proxy:os.Getenv("SOLVETHREE_PROXY"), RequestID:r.Header.Get("X-Request-ID")}
if err := input.Validate(); err != nil { http.Error(w,"Invalid task input",400);return }
ctx,cancel := context.WithTimeout(r.Context(),20*time.Second);defer cancel()
zero:=0
result,err:=client.CreateTask(ctx,input,&zero)
respond(w,result,err)
})
mux.HandleFunc("GET /captcha/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if !authorize(w,r) { return }
ctx,cancel:=context.WithTimeout(r.Context(),25*time.Second);defer cancel()
result,err:=client.GetTask(ctx,r.PathValue("id"),15000)
respond(w,result,err)
})
server:=&http.Server{Addr:"127.0.0.1:3000", Handler:mux, ReadHeaderTimeout:5*time.Second}
log.Fatal(server.ListenAndServe())
}मॉड्यूल को go run . से चलाएँ। सर्वर 127.0.0.1:3000 पर सुनता है। यह Go के मानक net/http राउटर का उपयोग करता है, इसलिए किसी फ़्रेमवर्क की ज़रूरत नहीं है। SDK क्लाइंट एक बार बनाया जाता है और समवर्ती उपयोग के लिए सुरक्षित है।
टास्क डिफ़ॉल्ट enterprise-v3 reCAPTCHA मोड का उपयोग करता है। इसमें साइट होस्टनेम, ऐक्शन और एक प्रॉक्सी दी जाती है—type या url नहीं। POST बॉडी का उपयोग नहीं होता, इसलिए कॉलर मनचाहे टार्गेट या प्रॉक्सी नहीं चुन सकते।
एक बार POST करें और टास्क ID सँभालकर रखें
X-Integration-Key हेडर के साथ POST /captcha/tasks भेजें। कॉलर द्वारा जनरेट किया गया X-Request-ID भी भेजें, ताकि ID मिलने से पहले कनेक्शन टूटने पर आप टास्क रिकवर कर सकें। 1–64 ASCII अक्षर, अंक, अंडरस्कोर या हाइफ़न उपयोग करें।
हैंडलर कॉन्फ़िगर किए गए टास्क को सत्यापित करता है, फिर शून्य प्रतीक्षा मान के साथ CreateTask कॉल करता है। यह समाधान पूरा होने की प्रतीक्षा किए बिना टास्क बनाने का अनुरोध करता है। इसका 20-सेकंड का कॉन्टेक्स्ट इस HTTP अनुरोध की प्रतीक्षा अवधि सीमित करता है; यह समाधान का टाइमआउट नहीं है।
सफल होने पर हैंडलर SDK का टास्क परिणाम लौटाता है। उसका टास्क ID सेव करें और आगे की जाँच के लिए GET रूट का उपयोग करें। सफल POST को उपयोग योग्य टोकन न समझें।
दोनों रूट के लिए इंटीग्रेशन कुंजी ज़रूरी है। यह एक भरोसेमंद आंतरिक इंटरफ़ेस है, प्रति-उपयोगकर्ता प्राधिकरण नहीं: यह कुंजी रखने वाले कॉलर कॉन्फ़िगर किए गए वर्कस्पेस के ज़रिए साझा ऐक्सेस पाते हैं।
मौजूदा टास्क पूरा होने तक GET करें
उसी इंटीग्रेशन-कुंजी हेडर के साथ GET /captcha/tasks/{id} भेजें। हैंडलर केवल GetTask कॉल करता है; यह कभी प्रतिस्थापन टास्क नहीं बनाता। यह 25-सेकंड के अनुरोध कॉन्टेक्स्ट में अधिकतम 15 सेकंड प्रतीक्षा का अनुरोध करता है।
pendingयाsolving: वही टास्क ID रखें और उसे दोबारा प्राप्त करें।ready: समाधान पढ़ें। केवल इसी स्थिति में उपयोग योग्य परिणाम होता है।failed: पोलिंग बंद करें औरerrorCodeवerrorजाँचें। दूसरा टास्क बनाने का निर्णय लेने से पहले कारण ठीक करें।
सफल टास्क परिणाम को डिकोड करने से पहले HTTP जवाब की स्थिति जाँचें। इस सर्वर में अनधिकृत अनुरोध 401, अमान्य टास्क इनपुट 400 और SDK अनुरोध त्रुटियाँ 502 लौटाती हैं। लौटाए गए टास्क की स्थिति failed होना, HTTP अनुरोध विफल होने से अलग परिणाम है।
दूसरा समाधान बनाए बिना टाइमआउट से रिकवर करें
टाइमआउट यह साबित नहीं करता कि टास्क बनाना विफल हुआ। अनुरोध कॉन्टेक्स्ट रद्द करने से स्थानीय प्रतीक्षा रुकती है, रिमोट टास्क नहीं। SDK क्रिएट POST को कभी अपने-आप दोबारा नहीं भेजता।
- 1.
अगर आपके पास टास्क ID है, तो उसे प्राप्त करें
उस ID के साथ GET रूट का उपयोग करें। SDK त्रुटियों पर, उदाहरण के JSON त्रुटि जवाब में
taskIdऔरrequestIdशामिल होते हैं, जब SDK उन्हें उपलब्ध कराता है। - 2.
अगर आपके पास केवल अनुरोध ID है, तो मूल क्रिएट अनुरोध दोबारा भेजें
उसी
X-Request-IDऔर अपरिवर्तित टास्क इनपुट के साथ POST दोबारा भेजें। इसका मतलब है कॉन्फ़िगर किए गए होस्टनेम, ऐक्शन और प्रॉक्सी को अपरिवर्तित रखना। वही अनुरोध ID और टास्क अनुरोध मौजूदा टास्क रिकवर करते हैं; उस ID के साथ अलग इनपुट देने से कॉन्फ़्लिक्ट होता है। - 3.
पहले अनुरोध से पहले ID सँभालकर रखें
अनुरोध ID न दिए जाने पर SDK उसे जनरेट करता है, लेकिन डिस्कनेक्ट हुआ कॉलर शायद उसे कभी प्राप्त न कर पाए। POST से पहले
X-Request-IDचुनकर सँभालने से रिकवरी के लिए त्रुटि जवाब पर निर्भर नहीं रहना पड़ता।
तैयार परिणाम को उसी प्रॉक्सी के साथ उपयोग करें
यह सर्वर परिणाम लौटाता है; SDK उसे टार्गेट को नहीं भेजता। आपके सबमिशन कोड को टोकन, लौटाई गई userAgent और secChUa ब्राउज़र पहचान तथा सफल प्रॉक्सी का उपयोग करना होगा। इस एकल-प्रॉक्सी उदाहरण में, हल करने के बाद IP बदलने के बजाय कॉन्फ़िगर की गई प्रॉक्सी का उपयोग जारी रखें।
ready टास्क का मतलब है कि समाधान जनरेट हुआ है, यह नहीं कि टार्गेट ने आपके एप्लिकेशन अनुरोध को स्वीकार कर लिया। अगर सबमिशन विफल हो, तो दूसरे समाधान के लिए भुगतान करने से पहले भेजे जा रहे टोकन, पहचान, प्रॉक्सी और टार्गेट अनुरोध की जाँच करें।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।