C# में Selenium के साथ CAPTCHA API का उपयोग करें
HttpClient से solvethree को कॉल करें, टास्क तैयार होने की प्रतीक्षा करें, फिर solution.token को अपने एप्लिकेशन की CAPTCHA फ़ील्ड में रखें। लक्ष्य पेज खोलने से पहले Chrome को उसी प्रॉक्सी और लौटाई गई ब्राउज़र पहचान का उपयोग करना चाहिए।
नीचे दिया गया उदाहरण आपके स्वामित्व वाला फ़ॉर्म सबमिट करने के लिए .NET 8 और Selenium Chrome का उपयोग करता है। यह सीधे REST के ज़रिए किया गया इंटीग्रेशन है, आधिकारिक C# SDK या Selenium प्लगइन नहीं।
इस पेज पर
प्रोजेक्ट और लक्ष्य तैयार करें
- ऐसे .NET 8 कंसोल प्रोजेक्ट का उपयोग करें जिसमें डिफ़ॉल्ट implicit usings सक्षम हों। NuGet पैकेज
Selenium.WebDriverऔरSelenium.Supportजोड़ें, दोनों का संस्करण4.52.0रखें। - Chrome को स्थानीय रूप से इंस्टॉल करें। Selenium Manager संगत Chrome ड्राइवर उपलब्ध कराता है।
- सुनिश्चित करें कि लक्ष्य होस्टनेम के लिए आपके वर्कस्पेस में सक्रिय साइट प्रोफ़ाइल उपलब्ध है। होस्टनेम और ऐक्शन भेजने से प्रोफ़ाइल नहीं बनती; पहले साइट प्रोफ़ाइल सेटअप के निर्देश अपनाएँ।
- IP-अनुमति सूची वाली ऐसी प्रॉक्सी का उपयोग करें जिसके URL में क्रेडेंशियल न हों। उदाहरण उसी प्रॉक्सी को solvethree और Chrome को देता है।
| वेरिएबल | क्या देना है |
|---|---|
SOLVETHREE_API_KEY | आपके वर्कस्पेस की API कुंजी। इसे ऑटोमेशन चलाने वाली भरोसेमंद मशीन पर रखें, पेज में नहीं। |
SOLVETHREE_PROXY | IP-अनुमति सूची वाली प्रॉक्सी का URL, जिसका उपयोग CAPTCHA समाधान और ब्राउज़र सबमिशन दोनों के लिए होता है। |
TARGET_URL | आपके एप्लिकेशन के फ़ॉर्म पेज का पूरा URL। उदाहरण टास्क के site के लिए इससे होस्टनेम निकालता है। |
यदि आपका इंटीग्रेशन किसी दूसरे ऐक्शन का उपयोग करता है, तो उदाहरण में action का मान login से बदलें। यह डिफ़ॉल्ट recaptchaType, enterprise-v3 पर निर्भर करता है; टास्क अनुरोध में type या url फ़ील्ड की आवश्यकता नहीं है।
टास्क बनाएँ और फ़ॉर्म सबमिट करें
API हेल्पर आपके वर्कस्पेस की कुंजी से प्रमाणीकरण करता है और सफल पेलोड पार्स करने से पहले असफलता दर्शाने वाले HTTP रिस्पॉन्स अस्वीकार करता है। प्रोग्राम एक टास्क बनाता है, स्थिति pending या solving रहने तक उसकी ID को पोल करता है, और टास्क ready होने के बाद ही Chrome शुरू करता है।
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json.Nodes;
var key = Environment.GetEnvironmentVariable("SOLVETHREE_API_KEY")
?? throw new Exception("Set SOLVETHREE_API_KEY");
var proxy = Environment.GetEnvironmentVariable("SOLVETHREE_PROXY")
?? throw new Exception("Set SOLVETHREE_PROXY");
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", key);
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(180));
async Task<JsonObject> Api(HttpMethod method, string path, JsonObject? body = null)
{
using var request = new HttpRequestMessage(method, "https://api.solvethree.com/v1" + path);
if (body is not null)
request.Content = new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json");
using var response = await http.SendAsync(request, deadline.Token);
response.EnsureSuccessStatusCode();
return JsonNode.Parse(await response.Content.ReadAsStringAsync(deadline.Token))!.AsObject();
}
var requestId = Guid.NewGuid().ToString(); // Save with these inputs for recovery.
var input = new JsonObject {
["site"] = new Uri(Environment.GetEnvironmentVariable("TARGET_URL") ?? throw new Exception("Set TARGET_URL")).Host, ["action"] = "login",
["proxy"] = proxy, ["requestId"] = requestId
};
var task = await Api(HttpMethod.Post, "/tasks?waitMs=0", input);
while (task["status"]!.GetValue<string>() is "pending" or "solving")
{
var id = Uri.EscapeDataString(task["id"]!.GetValue<string>());
task = await Api(HttpMethod.Get, "/tasks/" + id + "?waitMs=15000");
if (task["status"]!.GetValue<string>() is "pending" or "solving")
await Task.Delay(1000, deadline.Token);
}
if (task["status"]!.GetValue<string>() != "ready")
throw new Exception("Task failed: " + task["errorCode"]?.GetValue<string>()
+ ": " + task["error"]?.GetValue<string>());
var solution = task["solution"]!.AsObject();
// Use solution["token"], ["userAgent"] and ["secChUa"] with the original proxy.
Console.WriteLine("Ready task: " + task["id"]!.GetValue<string>());
var target = Environment.GetEnvironmentVariable("TARGET_URL") ?? throw new Exception("Set TARGET_URL");
if (!string.IsNullOrEmpty(new Uri(proxy).UserInfo)) throw new Exception("Use an IP-allowlisted proxy");
var options = new ChromeOptions();
options.AddArgument("--proxy-server=" + proxy);
options.AddArgument("--user-agent=" + solution["userAgent"]!.GetValue<string>());
using var browser = new ChromeDriver(options);
browser.ExecuteCdpCommand("Network.enable", new Dictionary<string, object>());
browser.ExecuteCdpCommand("Network.setExtraHTTPHeaders", new Dictionary<string, object> {
["headers"] = new Dictionary<string, object> { ["sec-ch-ua"] = solution["secChUa"]!.GetValue<string>() }
});
browser.Navigate().GoToUrl(target);
var wait = new WebDriverWait(browser, TimeSpan.FromSeconds(20));
var field = wait.Until(driver => driver.FindElement(By.Name("g-recaptcha-response")));
browser.ExecuteScript("arguments[0].value=arguments[1]; arguments[0].dispatchEvent(new Event('input',{bubbles:true}));",
field, solution["token"]!.GetValue<string>());
browser.FindElement(By.CssSelector("button[type=submit]")).Click();
wait.Until(driver => driver.FindElement(By.Id("success"))); // Your application's success marker.30-सेकंड का HTTP टाइमआउट, 180-सेकंड की API समय-सीमा और 20-सेकंड की Selenium प्रतीक्षा इस उदाहरण की सेटिंग हैं, सेवा के समय की गारंटी नहीं। इन्हें अपने एप्लिकेशन की टाइमआउट नीति के अनुसार समायोजित करें।
टोकन सौंपने का तरीका अपने एप्लिकेशन के अनुरूप रखें
- 1.
प्रॉक्सी और लौटाई गई पहचान को साथ रखें
ChromeOptions मूल प्रॉक्सी और
solution.userAgentलागू करता है। CDP कमांड नेविगेशन से पहले नेटवर्किंग सक्षम करते हैं औरsolution.secChUaसेsec-ch-uaसेट करते हैं। यही क्रम रखें; पहले पेज खोलकर बाद में पहचान न बदलें। - 2.
टोकन वहीं लिखें जहाँ एप्लिकेशन उसे पढ़ता है
उदाहरण
g-recaptcha-responseनाम की फ़ील्ड ढूँढता है,solution.tokenअसाइन करता है और एक इनपुट इवेंट डिस्पैच करता है। यदि आपका एप्लिकेशन कहीं और से टोकन पढ़ता है, तो टोकन सौंपने का यह तरीका बदलें। फ़ील्ड भरने का लाभ तभी है जब बाहर भेजे जा रहे एप्लिकेशन अनुरोध में उसका मान वास्तव में शामिल हो। - 3.
सबमिट और सफलता के सिलेक्टर बदलें
नमूना
button[type=submit]पर क्लिक करता है औरsuccessID वाले एलिमेंट की प्रतीक्षा करता है। अपने वास्तविक एप्लिकेशन के सिलेक्टर इस्तेमाल करें और सफलता का ऐसा संकेत चुनें जो पुष्टि करे कि सबमिट किया गया ऑपरेशन सफल हुआ—केवल यह नहीं कि बटन पर क्लिक हुआ।
टास्क तैयार होने का अर्थ है कि समाधान उपलब्ध है। सबमिशन के बाद की जाँच अलग है: एप्लिकेशन अनुरोध स्वीकार करना है या नहीं, यह अब भी लक्ष्य तय करता है।
अनावश्यक टास्क बनाए बिना विफलताएँ संभालें
- API हेल्पर HTTP रिस्पॉन्स मिलने पर अपवाद उत्पन्न करता है।
HTTP स्टेटस और त्रुटि रिस्पॉन्स की जाँच करें। यह टास्क के
failedस्थिति में पहुँचने से अलग है।यह आज़माएँ: दोबारा प्रयास करने से पहले बताई गई अनुरोध या प्रमाणीकरण की समस्या ठीक करें। बिना बदले अमान्य इनपुट बार-बार न भेजें।
- टास्क
failedस्टेटस पर पहुँचता है। errorCodeऔरerrorपढ़ें;site-unreachableटास्क की एक संभावित त्रुटि है।यह आज़माएँ: उस टास्क की पोलिंग रोकें और बताए गए कारण को ठीक करें। विफल CAPTCHA समाधान का शुल्क वापस किया जाता है।
- टास्क तैयार है, लेकिन लक्ष्य सबमिशन अस्वीकार कर देता है।
पहले बाहर भेजे जा रहे एप्लिकेशन अनुरोध की जाँच करें: क्या उसमें टास्क ID या पुराने टोकन के बजाय
solution.tokenहै? फिर प्रॉक्सी, यूज़र एजेंट, क्लाइंट हिंट और लक्ष्य URL की जाँच करें।यह आज़माएँ: दूसरे CAPTCHA समाधान के लिए भुगतान करने से पहले टोकन सौंपने के तरीके या पहचान के बेमेल को ठीक करें।
- सबमिट पर क्लिक करने के बाद Selenium टाइमआउट हो जाता है।
पेज और एप्लिकेशन रिस्पॉन्स की जाँच करें।
successसिलेक्टर उदाहरण के लिए तय किया गया है, स्वीकार किए जाने का सार्वभौमिक संकेत नहीं है।यह आज़माएँ: इसे अपने एप्लिकेशन की वास्तविक सफलता की शर्त से बदलें, या एप्लिकेशन द्वारा लौटाई गई अस्वीकृति को संभालें।
नमूना requestId जनरेट करता है, लेकिन उसे आपके लिए स्थायी रूप से सहेजता नहीं है। यदि आपको टाइमआउट के बाद रिकवरी चाहिए, तो टास्क बनाने से पहले उसे बिल्कुल वही टास्क इनपुट के साथ सहेजें। यदि टास्क बनाते समय टाइमआउट हो जाए, तो मौजूदा टास्क रिकवर करने के लिए उसी ID के साथ वही इनपुट दोबारा भेजें; केवल रिस्पॉन्स खो जाने के कारण नई ID जनरेट न करें। अलग इनपुट के साथ उसी ID का दोबारा उपयोग करने पर टकराव होता है। यदि आपके पास पहले से टास्क ID है, तो उसी टास्क को प्राप्त करें।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।