Go से reCAPTCHA Enterprise हल करें
solvethree.com/sdk इंस्टॉल करें और अपने लक्ष्य होस्टनाम, ऐक्शन और प्रॉक्सी के साथ Solve कॉल करें। SDK टास्क एक बार बनाता है और परिणाम के लिए पोलिंग करता है। इसके बाद आपका एप्लिकेशन लक्ष्य पर टोकन सबमिट करता है।
इस पेज पर
SDK इंस्टॉल और कॉन्फ़िगर करें
Go 1.22+ का उपयोग करें। अपने Go मॉड्यूल में चलाएँ:
go get solvethree.com/sdk@v0.1.0SOLVETHREE_API_KEYको अपनी वर्कस्पेस API कुंजी औरSOLVETHREE_PROXYको अपने HTTP(S) प्रॉक्सी URL पर सेट करें। दोनों को सर्वर कॉन्फ़िगरेशन में रखें।- अपने वर्कस्पेस में लक्ष्य होस्टनाम के लिए सक्रिय प्रोफ़ाइल बनाएँ। साइट प्रोफ़ाइल सेटअप देखें।
accounts.example.comऔरloginकी जगह लक्ष्य पर इस्तेमाल होने वाला होस्टनाम और ऐक्शन दें।Siteमें स्कीम या पाथ के बिना होस्टनाम दिया जाता है।
एक टास्क हल करें
इसे main.go के रूप में सहेजें और go run . चलाएँ।
package main
import (
"context"
"fmt"
"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 { log.Fatal(err) }
fmt.Println("Ready task:", result.ID)
// Submit result.Solution.Token with its browser identity and original proxy.
}कॉन्टेक्स्ट स्थानीय प्रतीक्षा को 180 सेकंड तक सीमित करता है। Solve तैयार TaskResult या त्रुटि लौटाता है; इसके चारों ओर अलग पोलिंग लूप की ज़रूरत नहीं है। यह अनुरोध डिफ़ॉल्ट Enterprise v3 मोड का उपयोग करता है। सामान्य v3 के लिए RecaptchaType: "v3" सेट करें। reCAPTCHA के लिए Type और URL सेट न करें।
अपने लक्ष्य पर टोकन सबमिट करें
एप्लिकेशन के CAPTCHA फ़ील्ड में result.Solution.Token भेजें। प्रिंट किया गया result.ID टास्क की पहचान करता है; यह टोकन नहीं है।
result.Solution.UserAgent को User-Agent और result.Solution.SecChUA को sec-ch-ua के रूप में उपयोग करें। लक्ष्य अनुरोध को समाधान की सफल प्रॉक्सी से भेजें, जिसे solvethree.SuccessfulProxy(input, result) से चुना जाता है।
एप्लिकेशन के अन्य फ़ॉर्म फ़ील्ड, कुकी और CSRF मान शामिल करें, फिर उसकी प्रतिक्रिया जाँचें। SDK समाधान लौटाता है; वह आपकी ओर से एप्लिकेशन अनुरोध सबमिट नहीं करता।
प्रतीक्षा बाधित होने पर ID सहेजकर रखें
कॉन्टेक्स्ट रद्द करने से स्थानीय प्रतीक्षा रुकती है, रिमोट काम नहीं। *solvethree.Error में RequestID और TaskID उपलब्ध होते हैं। ज्ञात टास्क को GetTask से प्राप्त करें; अगर टास्क बना या नहीं, यह स्पष्ट न हो, तो बिल्कुल वही मूल इनपुट उसी RequestID के साथ दोबारा भेजें।
प्रोसेस रीस्टार्ट के बाद रिकवरी के लिए, टास्क बनाने से पहले RequestID असाइन करें और उसे टास्क इनपुट के साथ सहेजें। *TaskFailedError अंतिम विफलता है: उसका ErrorCode जाँचें और त्रुटि का टेक्स्ट पाने के लिए टास्क प्राप्त करें। दूसरा समाधान शुरू करने से पहले कारण ठीक करें।
विकल्प: स्टैंडर्ड लाइब्रेरी से REST कॉल करें
अगर आप HTTP कॉल खुद प्रबंधित करना चाहते हैं, तो यह संस्करण सीधे net/http का उपयोग करता है। इसे या ऊपर दिए SDK उदाहरण को चुनें; दोनों चलाने से दो टास्क बनते हैं। यहाँ दिए प्रतिक्रिया स्ट्रक्चर इस स्वतंत्र उदाहरण के हैं, इसलिए उनके फ़ील्ड नाम SDK के टाइप से अलग हैं।
package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"time"
)
type Task struct {
ID string `json:"id"`
Status string `json:"status"`
ErrorCode string `json:"errorCode"`
Error string `json:"error"`
Solution struct {
Token string `json:"token"`
UserAgent string `json:"userAgent"`
SecChUa string `json:"secChUa"`
} `json:"solution"`
}
func main() {
key, proxy := os.Getenv("SOLVETHREE_API_KEY"), os.Getenv("SOLVETHREE_PROXY")
if key == "" || proxy == "" { panic("Set SOLVETHREE_API_KEY and SOLVETHREE_PROXY") }
ctx, cancel := context.WithTimeout(context.Background(), 180*time.Second)
defer cancel()
client := &http.Client{Timeout: 30*time.Second}
api := func(method, path string, body []byte) (Task, error) {
var task Task
req, err := http.NewRequestWithContext(ctx, method, "https://api.solvethree.com/v1"+path, bytes.NewReader(body))
if err != nil { return task, err }
req.Header.Set("Authorization", "Bearer "+key)
req.Header.Set("Content-Type", "application/json")
response, err := client.Do(req)
if err != nil { return task, err }
defer response.Body.Close()
if response.StatusCode < 200 || response.StatusCode >= 300 { return task, fmt.Errorf("API HTTP %d", response.StatusCode) }
err = json.NewDecoder(response.Body).Decode(&task)
return task, err
}
requestID := fmt.Sprintf("go-%d", time.Now().UnixNano())
body, err := json.Marshal(map[string]string{
"site":"accounts.example.com", "action":"login", "proxy":proxy, "requestId":requestID,
})
if err != nil { panic(err) }
// Persist requestID and body before creation if this must survive a restart.
task, err := api(http.MethodPost, "/tasks?waitMs=0", body)
if err != nil { panic(fmt.Errorf("request %s: %w", requestID, err)) }
for task.Status == "pending" || task.Status == "solving" {
task, err = api(http.MethodGet, "/tasks/"+url.PathEscape(task.ID)+"?waitMs=15000", nil)
if err != nil { panic(err) }
if task.Status == "pending" || task.Status == "solving" {
select { case <-ctx.Done(): panic(ctx.Err()); case <-time.After(time.Second): }
}
}
if task.Status != "ready" { panic("Task failed: "+task.ErrorCode+": "+task.Error) }
solution := task.Solution
_ = solution // Apply token and returned browser identity using the same proxy.
fmt.Println("Ready task:", task.ID)
}स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।