Go HTTP प्रॉक्सी से CAPTCHA टोकन सबमिट करें
लक्ष्य वेबसाइट के लिए अलग Go HTTP क्लाइंट इस्तेमाल करें, जिसे solvethree.SuccessfulProxy द्वारा चुनी गई प्रॉक्सी के साथ कॉन्फ़िगर किया गया हो। लौटाई गई ब्राउज़र पहचान के साथ Solution.Token सबमिट करें। इस लक्ष्य ट्रांसपोर्ट को SDK क्लाइंट के solvethree API ट्रांसपोर्ट से अलग रखें।
इस पेज पर
टास्क तैयार करें
- 1.
Go SDK और क्रेडेंशियल सेट करें
Go 1.22 या बाद के संस्करण के साथ आधिकारिक
solvethree.com/sdkमॉड्यूल का संस्करणv0.1.0इस्तेमाल करें। सेटअप का विवरण Go इंटीग्रेशन संदर्भ में है।SOLVETHREE_API_KEYको अपने वर्कस्पेस की API कुंजी पर सेट करें और उसे सर्वर पर रखें।SOLVETHREE_PROXYको अपने HTTP या HTTPS प्रॉक्सी URL पर सेट करें। - 2.
हल करने से पहले साइट कॉन्फ़िगर करें
वर्कस्पेस में लक्ष्य होस्टनाम की सक्रिय प्रोफ़ाइल होनी चाहिए। पहले साइट प्रोफ़ाइल सेट करें; होस्टनाम और ऐक्शन सबमिट करने से प्रोफ़ाइल नहीं बनती।
- 3.
उदाहरण का लक्ष्य बदलें
अपने इंटीग्रेशन के अनुसार
accounts.example.com,loginऐक्शन और एप्लिकेशन एंडपॉइंट बदलें।Siteएक होस्टनाम है, पूरा URL नहीं। reCAPTCHA के लिएProxyयाProxyCandidatesमें से ठीक एक दें; टास्क केTypeयाURLफ़ील्ड न भरें। डिफ़ॉल्ट reCAPTCHA प्रकार Enterprise v3 है।
टास्क हल करने वाली प्रॉक्सी से सबमिट करें
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 टास्क हल करता है, लेकिन वेबसाइट पर कुछ सबमिट नहीं करता। हल करने के बाद उदाहरण http.DefaultTransport का क्लोन बनाता है और http.ProxyURL से क्लोन की Proxy सेट करता है। केवल अलग targetClient उस ट्रांसपोर्ट का इस्तेमाल करता है; SDK क्लाइंट का API ट्रांसपोर्ट अपरिवर्तित रहता है।
प्रॉक्सी क्रेडेंशियल URL के user-info हिस्से में रखें। url.Parse उन्हें प्रॉक्सी ट्रांसपोर्ट के लिए सुरक्षित रखता है। URL को मैन्युअली बाँटने या प्रॉक्सी क्रेडेंशियल को लक्ष्य के Authorization हेडर के रूप में भेजने के बजाय, यूज़रनेम या पासवर्ड के आरक्षित वर्णों को प्रतिशत-एन्कोड करें।
मूल टास्क इनपुट सुरक्षित रखें और SuccessfulProxy इस्तेमाल करें, भले ही अभी आप केवल एक प्रॉक्सी देते हों। ProxyCandidates के साथ सफल कैंडिडेट की पहचान Solution.EgressAttempts से होती है, जो मूल सूची में 1 से शुरू होने वाला इंडेक्स है। यह हेल्पर अनुमान लगाने की ज़रूरत दूर करता है कि कौन-सा कैंडिडेट सफल रहा; अगर यह false लौटाए तो रुक जाएँ। कैंडिडेट सूचियों में अधिकतम बारह अलग-अलग HTTP या HTTPS प्रॉक्सी URL स्वीकार किए जाते हैं, जिनमें पाथ, क्वेरी या फ़्रैगमेंट न हो।
लक्ष्य के हेडर, फ़ॉर्म फ़ील्ड और सेशन शामिल करें
उदाहरण url.Values से Solution.Token को g-recaptcha-response के अंतर्गत फ़ॉर्म-एन्कोड करता है और उसके अनुरूप कंटेंट टाइप सेट करता है। आपका एप्लिकेशन किसी दूसरे फ़ील्ड नाम की अपेक्षा करता है तो यह नाम बदलें। एंडपॉइंट के अन्य आवश्यक फ़ील्ड जोड़ें, जैसे लॉगिन इनपुट और सेशन से बँधा कोई anti-CSRF मान; CAPTCHA टोकन पूरा लॉगिन अनुरोध नहीं है।
उदाहरण की तरह लौटाए गए UserAgent और SecChUA इस्तेमाल करें। अगर समाधान Headers में भी एंट्री देता है, तो उन लौटाए गए हेडर को भी लक्ष्य अनुरोध पर लागू करें—उदाहरण उस कलेक्शन को कॉपी नहीं करता। ब्राउज़र पहचान एकसमान रखें और भेजी जा रही बॉडी के लिए सही कंटेंट टाइप रखें।
उदाहरण में कुकी जार नहीं है। अगर लक्ष्य को सेशन चाहिए, तो net/http/cookiejar से जार बनाएँ, लक्ष्य का फ़्लो शुरू करने से पहले उसे targetClient.Jar से जोड़ें और पेज अनुरोध व फ़ॉर्म सबमिशन के लिए उसी क्लाइंट का दोबारा इस्तेमाल करें। पूरे सेशन में वही सफल प्रॉक्सी इस्तेमाल करें। solvethree API क्लाइंट लक्ष्य का सेशन क्लाइंट नहीं है।
समाधान ऐक्सेस करने से पहले सॉल्व की त्रुटि जाँचें। केवल तैयार टास्क में उपयोग योग्य समाधान होता है; विफल टास्क के errorCode और error उस विफलता का कारण बताते हैं। लक्ष्य अनुरोध के लिए, पहले Do से मिली त्रुटि सँभालें, फिर रिस्पॉन्स बॉडी का अर्थ निकालने से पहले HTTP स्टेटस जाँचें। जब भी Do बिना त्रुटि के रिस्पॉन्स लौटाए, response.Body बंद करें—असफल HTTP रिस्पॉन्स के लिए भी।
उदाहरण अपने-आप होने वाले रीडायरेक्ट बंद करता है और एप्लिकेशन का स्टेटस प्रिंट करता है। एप्लिकेशन ने सबमिशन स्वीकार किया या नहीं, यह जानने के लिए रिस्पॉन्स बॉडी और किसी भी अपेक्षित रीडायरेक्ट की जाँच करें। तैयार टास्क—या केवल सफल HTTP स्टेटस—से यह परिणाम साबित नहीं होता।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।