C# में CaptchaFox कैसे हल करें, ताकि token ठुकराया न जाए

C# में CaptchaFox हल करने के लिए, CaptchaFoxAsync को sitekey और पेज URL के साथ कॉल करें, लौटे हुए token को cf-captcha-response फॉर्म फ़ील्ड में रखें, और वह रिक्वेस्ट उसी user agent के साथ भेजें जो CapSkip token के साथ लौटाता है। ज़्यादातर इंटीग्रेशन इसी आख़िरी हिस्से पर फेल होते हैं। CaptchaFox का token उस ब्राउज़र से बँधा होता है जिसने उसे बनाया, और किसी सही token के ठुकराए जाने की सबसे आम वजह user agent का मेल न खाना है, भले ही solve अपने आप में कामयाब रहा हो। CapSkip ने CaptchaFox को वर्ज़न 1.4.0 में जोड़ा। यह गाइड key ढूँढना, कॉल, सबमिट, और वे कुछ सेटिंग्स कवर करती है जो तय करती हैं कि token स्वीकार होगा या नहीं।
आपको क्या चाहिए
- किसी Windows मशीन पर चल रहा CapSkip 1.4.0 या उसके बाद का संस्करण। CaptchaFox सपोर्ट उसी रिलीज़ में आया था, Friendly Captcha और Capy Puzzle के साथ।
- CapSkip .NET पैकेज का 1.3.0 या उसके बाद का वर्ज़न, यही वह रिलीज़ है जिसमें CaptchaFoxAsync जोड़ा गया। यह .NET Standard 2.0 को टारगेट करता है और System.Text.Json 8 पर निर्भर है, इसलिए यह .NET Framework 4.6.2 और उसके बाद के संस्करणों पर, तथा .NET 6 और उसके बाद के संस्करणों पर सपोर्टेड है। सैंपल top-level statements और .NET 6 कंसोल प्रोजेक्ट के implicit usings इस्तेमाल करते हैं, इसलिए उन्हें .NET 6 या उसके बाद के संस्करण पर चलाएँ।
- टारगेट पेज से दो वैल्यू: sitekey, और उस पेज का URL जिस पर widget चलता है। स्टेप 1 दिखाता है कि key कहाँ मिलती है, और पेज की एक और जानकारी एक वैकल्पिक सेटिंग तय करती है।
- सॉल्वर के लिए एक पता। Local मोड केवल उसी डिवाइस के लिए 127.0.0.1 पर जवाब देता है; Server मोड आपके नेटवर्क पते या पब्लिक IP पर सुनता है ताकि कोई दूसरी मशीन API के ज़रिए उसे कॉल कर सके। दोनों यहाँ मिलते हैं: कनेक्शन सेटिंग्स, और कब स्विच करना है, यह नीचे के एक सेक्शन में बताया गया है।
# dotnet add package CapSkip dotnet add package CapSkip
स्टेप 1: sitekey और widget का source खोजें
C# में CaptchaFox हल करने के लिए जो कुछ चाहिए, वह सब टारगेट पेज से ही मिलता है। sitekey सार्वजनिक होती है, हर विज़िटर के लिए एक जैसी होती है, और आमतौर पर sk_ से शुरू होती है। साइटें उसे तीन में से किसी एक जगह रखती हैं, और आपको उनमें से सिर्फ़ एक जगह ढूँढनी है।
- container element पर, जब widget खुद को रेंडर करता है: captchafox class वाला एक div, जिस पर data-sitekey attribute होता है। Hidden मोड, जो फॉर्म सबमिट होने तक कुछ नहीं दिखाता, उसी div का इस्तेमाल करता है जिसमें data-mode को hidden पर सेट किया जाता है, इसलिए key वहाँ भी होती है।
- captchafox.render कॉल के ऑप्शंस में, जब पेज widget को अपनी script से बनाता है। render कॉल भी hidden मोड चालू कर सकती है, और key ठीक उसके बगल में रहती है।
- Network टैब में, जब इनमें से कोई भी सर्व किए गए HTML में न दिखे। api.captchafox.com को गई रिक्वेस्ट खोजें; key, /captcha/ के बाद वाला path segment है।
जब पेज का सोर्स खुला हो, तो उस script टैग को देखें जो widget लोड करता है। widget पेजों तक दो जगहों से पहुँचता है, और साइट जिसे लोड करती है, उसी से तय होता है कि वह साइट किस रूप का token वापस चाहती है।
| पेज widget को यहाँ से लोड करता है | लौटने वाला token | क्या पास करें |
|---|---|---|
| https://cdn.captchafox.com/, ज़्यादातर साइटों पर इस्तेमाल होने वाला standard widget | एक सादा token | कुछ अतिरिक्त नहीं; यही डिफ़ॉल्ट है |
| https://s.uicdn.com/mampkg/ के अंतर्गत एक पैकेज, जिसे कुछ प्लेटफ़ॉर्म एम्बेड करते हैं | MAM_ से शुरू होने वाला token | script टैग से लिया गया पूरा पैकेज path, api_server ऑप्शन के रूप में |
यहाँ गलती हो जाए, तो नाकामी चुपचाप होती है। अगर आप गलत source भेजते हैं, तो solve फिर भी कामयाब होता है और token लौटाता है, बस ऐसे फ़ॉर्मेट में जिसे साइट स्वीकार नहीं करेगी, इसलिए नाकामी बाद में ठुकराए गए फॉर्म के रूप में सामने आती है, न कि ऐसे error के रूप में जिसे आप catch कर सकें।
स्टेप 2: CaptchaFoxAsync कॉल
यह method sitekey, पेज URL, और एक वैकल्पिक ऑप्शंस डिक्शनरी लेता है। standard widget के लिए आपको पहले दो के अलावा कुछ नहीं चाहिए।
// dotnet add package CapSkip
using CapSkip;
var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);
// The sitekey from the widget, and the page the widget runs on.
var result = await solver.CaptchaFoxAsync(
"YOUR_SITEKEY",
"https://example.com/signup");
Console.WriteLine(result.Token); // goes in cf-captcha-response
Console.WriteLine(result.UserAgent); // send this as the User-AgentToken प्रॉपर्टी पढ़ें। Code प्रॉपर्टी में भी वही स्ट्रिंग होती है, लेकिन Token का नाम उसी फ़ील्ड पर है जिसमें वह जाता है। UserAgent उस ब्राउज़र की पहचान है जिसने token बनाया, यानी CapSkip का अपना ब्राउज़र, न कि कोई चीज़ जो आपने भेजी हो। जब किसी solve ने कोई user agent रिपोर्ट नहीं किया, तो SDK कोई मान गढ़ने के बजाय उसे null छोड़ देता है।
यहाँ पेज URL ज़्यादातर टाइप की तुलना में ज़्यादा मायने रखता है। CaptchaFox हर key को अनुमत डोमेन की एक सूची के साथ रजिस्टर करता है और कुछ भी जारी करने से पहले host जाँचता है, इसलिए गलत पेज के साथ भेजी गई key हमेशा के लिए मना कर दी जाती है, कभी-कभार नहीं। CapSkip इस मामले को दोबारा आज़माने के बजाय तुरंत रिपोर्ट कर देता है, क्योंकि दोबारा कोशिश से कोई फ़ायदा नहीं। वही पेज भेजें जिस पर widget असल में चलता है, कोई सर्च रिज़ल्ट, redirect या छोटा किया गया लिंक नहीं।
MAM पैकेज लोड करने वाली साइटें
अगर स्टेप 1 में s.uicdn.com के अंतर्गत कोई script मिली, तो उसका पैकेज path ठीक वैसा ही कॉपी करें जैसा पेज में लिखा है, और उसे api_server के रूप में पास करें। तब token उसी MAM_ prefix के साथ लौटता है जिसकी साइट को उम्मीद है।
// Only for pages whose script tag loads the MAM build.
var result = await solver.CaptchaFoxAsync(
"YOUR_SITEKEY",
"https://example.com/signup",
new Dictionary<string, object?>
{
["api_server"] =
"https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/",
});ऑप्शंस डिक्शनरी api_server, proxy और useragent लेती है, साथ में proxytype और सेकंड में हर कॉल का अपना timeout भी। useragent ऑप्शन दूसरी सर्विसों के साथ compatibility के लिए मौजूद है और लागू नहीं होता, क्योंकि CapSkip एक असली ब्राउज़र में हल करता है, जिसकी अपनी एक सुसंगत पहचान होती है। कोई अनजान key, या खाली sitekey या पेज URL, रिक्वेस्ट भेजे जाने से पहले ही ValidationException उठाता है।
स्टेप 3: उसी user agent के साथ सबमिट करें जिसने token बनाया
यही वह स्टेप है जो स्वीकार हुए token को ठुकराए गए token से अलग करता है। CaptchaFox उस ब्राउज़र को स्कोर करता है जो widget चलाता है, और वह जो token जारी करता है, वह उसी ब्राउज़र का होता है। जब तक आप खुद न जोड़ें, HttpClient कोई User-Agent header भेजता ही नहीं, और हार्ड-कोड की गई कोई desktop स्ट्रिंग भी उतनी ही गलत है, इसलिए CapSkip ने जो user agent लौटाया, उसे token ले जाने वाली रिक्वेस्ट पर कॉपी करें।
// http is your HttpClient; result comes from Step 2.
var request = new HttpRequestMessage(HttpMethod.Post, "https://example.com/signup")
{
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
["email"] = "[email protected]",
["cf-captcha-response"] = result.Token!,
}),
};
// The token is bound to the browser that produced it.
if (result.UserAgent is { } ua)
request.Headers.TryAddWithoutValidation("User-Agent", ua);
var response = await http.SendAsync(request);TryAddWithoutValidation जानबूझकर इस्तेमाल किया गया है। ज़्यादा सख़्त UserAgent.ParseAdd स्ट्रिंग को header grammar से मिलाकर जाँचता है और दोनों मेल न खाएँ तो FormatException फेंकता है, जबकि इस वैल्यू को, इसमें चाहे जो भी हो, बाइट-दर-बाइट वैसे ही जाना है। इसे क्लाइंट के डिफ़ॉल्ट headers पर नहीं, हर रिक्वेस्ट पर अलग से सेट करें, ताकि एक ही HttpClient कई solve के tokens ले जा सके।
दो और नियम इस बात से निकलते हैं कि CaptchaFox साइट की तरफ़ token की जाँच कैसे करता है। CaptchaFox के अपने दस्तावेज़ों के अनुसार हर token सिर्फ़ एक बार, और सिर्फ़ थोड़े समय के भीतर ही verify किया जा सकता है, इसलिए तभी हल करें जब आप सबमिट करने ही वाले हों, token एक ही बार भेजें, और अगर फॉर्म अधूरा छोड़कर बाद में फिर शुरू किया जाए तो दोबारा हल करें। और token को opaque मानें: उसकी जाँच उसी session के सामने होती है जिसने उसे बनाया था, इसलिए उसे काटने या दोबारा encode करने से वह टूट जाता है। कुछ इंटीग्रेशन उसे फॉर्म पोस्ट के बजाय JSON बॉडी में भेजते हैं, इसलिए DevTools खोलकर फॉर्म को एक बार हाथ से सबमिट करें और पेज जो भेजता है ठीक वैसा ही करें।
स्टेप 4: प्रॉक्सी, challenge के प्रकार और timeout
CaptchaFox ब्राउज़र के साथ-साथ उस नेटवर्क को भी स्कोर करता है जिस पर widget चलता है। टेस्टिंग और कभी-कभार के solve के लिए एक पता ठीक है, लेकिन उससे बार-बार होने वाले solve उस पते को पहले interactive challenges की ओर और फिर इनकार की ओर धकेलते हैं। जैसे ही आप किसी भी मात्रा में हल करने लगें, CapSkip में एक प्रॉक्सी पूल कॉन्फ़िगर करें, या हर रिक्वेस्ट के साथ अलग प्रॉक्सी भेजें। ऐसा करें, तो सबमिट भी उसी exit से करें, ताकि token और फॉर्म एक ही नेटवर्क से पहुँचें। CaptchaFox का वेरिफ़िकेशन साइट को token के साथ विज़िटर का IP पता भी भेजने देता है, और दोनों को एक ही रास्ते पर रखने की यह एक और वजह है।
// using System.Net; for WebProxy and NetworkCredential.
// Same exit address for the solve and the submit.
var result = await solver.CaptchaFoxAsync("YOUR_SITEKEY", pageUrl,
new Dictionary<string, object?>
{
["proxy"] = new Proxy("HTTP", "login:[email protected]:8080"),
});
var http = new HttpClient(new HttpClientHandler
{
Proxy = new WebProxy("http://1.2.3.4:8080")
{
Credentials = new NetworkCredential("login", "password"),
},
});कौन सा challenge दिखेगा, यह आप नहीं चुनते। ज़्यादातर solve में कुछ भी नहीं दिखता, क्योंकि ब्राउज़र से मिले संकेत अपने आप ही जाँच पास कर लेते हैं, और जब CaptchaFox slider माँगता है तो CapSkip उसे भी पूरा कर देता है। दो दुर्लभ fallback हल नहीं किए जाते।
| challenge का प्रकार | कितनी बार | हल किए गए |
|---|---|---|
| अदृश्य, कुछ भी दिखाई नहीं देता | आम तौर पर | हां |
| स्लाइड पहेली | कभी-कभी | हां |
| इमेज चुनना | बहुत कम | नहीं, unsolvable बताया जाता है |
| ऑडियो | बहुत कम | नहीं, unsolvable बताया जाता है |
unsolvable की रिपोर्ट timeout पूरा होने का इंतज़ार किए बिना, जल्दी ही एक ApiException के रूप में आती है। दोबारा कोशिश में आमतौर पर कोई दूसरा challenge आता है, इसलिए इसे खराब key का संकेत नहीं, बल्कि फिर से सबमिट करने की वजह मानें। नीचे का पूरा उदाहरण सिर्फ़ इसी मामले को दो बार दोबारा आज़माता है, और किसी को नहीं, क्योंकि ApiException में वे errors भी आते हैं जिन्हें दोबारा कोशिश ठीक नहीं कर सकती, जैसे गलत API key।
CaptchaFoxAsync, recaptchaTimeout पर पोलिंग करता है, जो डिफ़ॉल्ट रूप से 300 सेकंड है, क्योंकि यह एक असली ब्राउज़र session है और slider आने पर ज़्यादा देर चलता है। CapSkip की अपनी समय सीमाएँ भी होती हैं: कोई टास्क 10 CaptchaFox threads (Max. Threads) में से किसी एक के लिए 250 सेकंड (Wait Timeout) तक इंतज़ार कर सकता है, और एक कोशिश को 150 सेकंड (Row Timeout) मिलते हैं। इसलिए प्रॉक्सी की वजह से धीमी पड़ी कोशिश पहले CapSkip के अंदर ही फेल हो जाती है, और SDK का लंबा timeout उसे ज़्यादा समय नहीं देता। जब Retries अपने डिफ़ॉल्ट मान 0 पर हो और कोई thread खाली हो, तो यह विफलता SDK के 300 सेकंड पूरे होने से काफ़ी पहले ही ApiException के रूप में आप तक पहुँच जाती है; अगर टास्क देर तक queue में इंतज़ार करता है, तो SDK पहले अपनी सीमा तक पहुँच सकता है और इसके बजाय CapSkip.TimeoutException फेंक सकता है।
SDK का timeout सिर्फ़ तब बढ़ाना पड़ता है जब आप CapSkip की CaptchaFox सेटिंग्स में Retries (0-3) बढ़ाते हैं, क्योंकि हर अतिरिक्त कोशिश एक कॉल में ज़्यादा से ज़्यादा एक और Row Timeout जोड़ सकती है। ऐसे में ऑप्शंस डिक्शनरी में लंबा timeout पास करें, या constructor में recaptchaTimeout बढ़ा दें।
solver को कहीं और चलाना
सैंपल 127.0.0.1 इस्तेमाल करते हैं, क्योंकि जब तक आपका कोड और CapSkip एक ही मशीन पर हों, यही सही है। जैसे ही .NET ऐप कहीं और चलने लगता है, जैसे किसी कंटेनर, बिल्ड एजेंट, VPS या ऐप सर्विस पर, loopback गलत मशीन की ओर इशारा करता है और पहला ही solve एक NetworkException फेंक देता है। CapSkip को Server मोड पर कर दें और वह आपके नेटवर्क पते या पब्लिक IP पर सुनने लगता है, ताकि इनमें से कोई भी API के ज़रिए उस तक पहुँच सके। अगर रास्ता इंटरनेट से होकर जाता है तो स्टैटिक पब्लिक IP इस्तेमाल करें, API key validation चालू करें, और Windows Firewall नियम से पोर्ट को सिर्फ़ अपेक्षित पतों तक सीमित रखें। यह अब भी आपकी अपनी Windows मशीन है, और हल करना अब भी बिना मीटर वाला है।
क्लाइंट एनवायरनमेंट वेरिएबल खुद नहीं पढ़ता। CAPSKIP_HOST और CAPSKIP_API_KEY को अपने कोड में पढ़ें और उन्हें constructor को पास करें, जैसा पूरा उदाहरण करता है, ताकि वही build आपकी डेस्क पर भी चले और सर्वर पर भी।
पूरा चलने वाला उदाहरण
// dotnet add package CapSkip
using System.Text.RegularExpressions;
using CapSkip;
// Copied by hand from the script tag, for pages that load the MAM build.
const string MamPackage = "https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/";
var pageUrl = "https://example.com/signup";
var http = new HttpClient();
var solver = new CapSkipClient(
apiKey: Environment.GetEnvironmentVariable("CAPSKIP_API_KEY") ?? "capskip",
host: Environment.GetEnvironmentVariable("CAPSKIP_HOST") ?? "127.0.0.1",
port: 8080);
// Read the sitekey off the captchafox container, in either attribute order.
var html = await http.GetStringAsync(pageUrl);
var widget = Regex.Match(html,
"<[^>]*class=\"(?:[^\"]*\\s)?captchafox(?:\\s[^\"]*)?\"[^>]*>").Value;
var sitekey = Regex.Match(widget, "data-sitekey=\"([^\"]+)\"").Groups[1].Value;
// MAM pages may carry the key in the script src instead.
if (sitekey.Length == 0)
sitekey = Regex.Match(html,
"captchafox[^\"]*/api\\.js\\?key=([^\"&]+)").Groups[1].Value;
if (sitekey.Length == 0)
throw new InvalidOperationException("No sitekey in the HTML; find it in DevTools.");
// The same CDN serves other packages, so match the captchafox one.
var options = new Dictionary<string, object?>();
if (html.Contains("mampkg/@mamdev/core.frontend.libs.captchafox"))
options["api_server"] = MamPackage;
try
{
// Image-select and audio come back unsolvable; a retry redraws.
// Other API errors, such as a wrong key, are not worth repeating.
SolveResult? result = null;
for (var attempt = 1; result is null; attempt++)
{
try
{
result = await solver.CaptchaFoxAsync(sitekey, pageUrl, options);
}
catch (ApiException ex) when (attempt < 3 && ex.Message.Contains("UNSOLVABLE"))
{
Console.WriteLine($"attempt {attempt}: {ex.Message}");
}
}
var request = new HttpRequestMessage(HttpMethod.Post, pageUrl)
{
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
["email"] = "[email protected]",
["cf-captcha-response"] = result.Token!,
}),
};
if (result.UserAgent is { } ua)
request.Headers.TryAddWithoutValidation("User-Agent", ua);
// Post wherever the form's action attribute points.
var response = await http.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode}, UA sent: {result.UserAgent is not null}");
}
catch (CapSkip.ValidationException ex)
{
// An option the method does not take.
Console.WriteLine($"not sent: {ex.Message}");
}
catch (CapSkip.TimeoutException)
{
Console.WriteLine("gave up waiting; recaptchaTimeout is 300 seconds");
}
catch (CapSkipError ex)
{
// The third unsolvable result, a refused key, or CapSkip unreachable.
Console.WriteLine($"gave up: {ex.Message}");
}regex, class के नाम को whitespace से घेरकर पहचानता है, ताकि captchafox-wrapper जैसा element गलती से मैच न हो जाए, और वह double quotes वाले attributes की उम्मीद करता है, जैसा CaptchaFox का अपना snippet उन्हें लिखता है। अगर हर रन पर solve तुरंत फेल हो जाए, तो सबसे पहले पेज URL जाँचें: अपने रजिस्टर्ड डोमेन के बाहर इस्तेमाल हुई key हर बार एक ही तरह फेल होती है। जब regex को कुछ नहीं मिलता, तो पेज widget को script से रेंडर करता है, और key render कॉल में या Network टैब में होती है, जैसा स्टेप 1 में बताया गया है। इस method के पीछे का raw endpoint यहाँ दर्ज है: API रेफ़रेंस, और पैकेज जो बाकी सभी method देता है, वे सब यहाँ सूचीबद्ध हैं: C# कैप्चा सॉल्वर पेज.
आम errors और उनका मतलब
| आप जो देखते हैं | कारण | फिक्स |
|---|---|---|
| साइट उस token को ठुकरा देती है जिसे CapSkip ने हल हुआ बताकर लौटाया था | रिक्वेस्ट उस User-Agent से अलग User-Agent के साथ गई जिसके साथ token बनाया गया था | सबमिट वाली रिक्वेस्ट पर result.UserAgent बाइट-दर-बाइट वैसा ही भेजें |
| user agent मेल खाने के बावजूद ठुकराया गया | साइट MAM पैकेज लोड करती है और solve में डिफ़ॉल्ट widget इस्तेमाल हुआ, या इसका उल्टा | script टैग पढ़ें और api_server को उसके मुताबिक़ सेट करें |
| MAM_ से शुरू होने वाला token, जिसे साइट मना कर देती है | api_server ऐसे पेज के लिए सेट किया गया जो standard widget लोड करता है | यह ऑप्शन हटा दें और डिफ़ॉल्ट इस्तेमाल करें |
| एक ही key के लिए हर बार तुरंत एक ApiException | पेज URL उन डोमेन से बाहर है जिनके लिए key रजिस्टर है | वही पेज भेजें जिस पर widget चलता है, कोई redirect या सर्च रिज़ल्ट नहीं |
| कभी-कभार आने वाला ApiException, जो कहता है कि कैप्चा unsolvable है | CaptchaFox ने image-select या ऑडियो challenge दिखाया | फिर से सबमिट करें; अगली कोशिश में आमतौर पर कोई दूसरा challenge आता है |
| रन आगे बढ़ने के साथ ज़्यादा challenges, फिर इनकार | हर solve एक ही पते से आता है, और CaptchaFox नेटवर्क को स्कोर करता है | solve को एक प्रॉक्सी पूल में बाँटें, और सबमिट भी उसी exit से करें |
| एक बार चल चुका token दूसरे सबमिट पर फेल हो जाता है | हर token एक ही बार verify होता है और जल्दी expire हो जाता है | हर सबमिट के लिए नया solve करें, और तुरंत सबमिट करें |
| कुछ भी भेजे जाने से पहले ही ValidationException | sitekey या पेज URL खाली था, या ऑप्शंस में ऐसी key थी जो यह method नहीं लेता | जाँचें कि regex को element मिला, और संदेश में बताया गया ऑप्शन हटा दें |
| पहले solve पर एक NetworkException | CapSkip चल नहीं रहा, या host और port गलत हैं | CapSkip शुरू करें, फिर देखें कि उसे Local मोड में होना चाहिए या Server मोड में |
| build किसी अस्पष्ट TimeoutException पर फ़ेल हो जाता है | CapSkip और System, दोनों उस छोटे नाम को परिभाषित करते हैं | पूरा CapSkip.TimeoutException लिखें, या CapSkipError कैच करें |
FAQ
जब ज़्यादातर कैप्चा टाइप को user agent की ज़रूरत नहीं होती, तो CaptchaFox को क्यों होती है?
क्योंकि यह किसी इंसान से कुछ पढ़वाने के बजाय ब्राउज़र को स्कोर करता है। token किसी एक ख़ास ब्राउज़र पर सर्विस का फ़ैसला है, इसलिए उसका मतलब तभी बनता है जब वह उसी ब्राउज़र से वापस आए। Cloudflare Turnstile के challenge पेज भी इसी तरह काम करते हैं, और उसका C# वाला पहलू यहाँ कवर किया गया है: Turnstile challenge पेज गाइड। CapSkip ठीक इन्हीं दो टाइप के लिए user agent लौटाता है, और यह इस बात का भरोसेमंद संकेत है कि यह कहाँ मायने रखता है।
क्या किसी होस्टेड प्लेटफ़ॉर्म पर चल रहा .NET ऐप solver तक पहुँच सकता है?
हाँ। कनेक्शन सेटिंग्स में CapSkip को Server मोड पर कर दें ताकि वह loopback के बजाय किसी नेटवर्क पते पर सुने, वह पता अपने कोड में CAPSKIP_HOST से पढ़ें, और उसे क्लाइंट को पास करें। कंटेनर होस्ट, VPS, CI एजेंट और मैनेज्ड ऐप सर्विस, सब उसी तरह जुड़ते हैं, उसी HTTP API के ज़रिए। अगर रास्ता इंटरनेट से होकर जाता है तो फ़ायरवॉल नियम के साथ स्टैटिक पब्लिक IP इस्तेमाल करें। सॉल्वर आपके अपने हार्डवेयर पर ही रहता है, इसलिए लाइसेंस या हल की गिनती में कुछ नहीं बदलता।
यह C# में Friendly Captcha हल करने से कैसे अलग है?
दोनों CapSkip 1.4.0 में आए और दोनों 300 सेकंड का timeout इस्तेमाल करते हैं, और समानता ज़्यादातर यहीं तक है। Friendly Captcha में फ़ैसला यह है कि साइट कौन सा प्रोटोकॉल वर्ज़न चलाती है, और token किसी user agent से बँधा नहीं होता। CaptchaFox में फ़ैसले ये हैं कि साइट कौन सा widget source लोड करती है और token किस user agent के साथ जाता है। Friendly Captcha वाला पहलू यहाँ कवर किया गया है: C# Friendly Captcha गाइड.
क्या मैं एक साथ कई CaptchaFox tokens हल कर सकता हूँ?
हाँ। क्लाइंट async है, इसलिए कई CaptchaFoxAsync कॉल पर एक Task.WhenAll उन्हें साथ-साथ चलाता है। CapSkip डिफ़ॉल्ट रूप से एक साथ 10 CaptchaFox solve चलाता है (उसकी CaptchaFox सेटिंग्स में Max. Threads), और बाकी किसी खाली thread के लिए 250 सेकंड वाले Wait Timeout तक इंतज़ार करते हैं, इसलिए सामान्य solve समय पर पचास कॉल का batch ठीक रहता है; इससे बड़े batch के लिए Max. Threads बढ़ाएँ या कॉल छोटे समूहों में भेजें। दो और बातों की योजना बनाएँ: हर token का अपना user agent होता है, इसलिए result को उसी रिक्वेस्ट के साथ रखें जिसका वह है, और एक ही पते से concurrency challenge की दर जल्दी बढ़ा देती है, इसलिए जैसे-जैसे parallel solve बढ़ाएँ, प्रॉक्सी भी जोड़ते जाएँ।
संक्षेप में
C# में CaptchaFox हल करने के लिए, sitekey को captchafox container, render कॉल या Network टैब से पढ़ें, और देखें कि कौन सी script widget लोड करती है। CaptchaFoxAsync को sitekey और असली पेज URL के साथ कॉल करें, और api_server सिर्फ़ MAM पैकेज के लिए जोड़ें। result.Token को cf-captcha-response में result.UserAgent के साथ पोस्ट करें, एक बार और तुरंत, और अगर कोई unsolvable challenge लौटे तो फिर से सबमिट करें। volume बढ़ने के साथ प्रॉक्सी जोड़ें, और जैसे ही कॉल करने वाला कोड सॉल्वर की मशीन से बाहर जाए, Server मोड पर चले जाएँ।
- यह टाइप कैसे काम करता है और सॉल्वर क्या-क्या कवर करता है: CaptchaFox सॉल्वर पेज.
- .NET पैकेज जो बाकी सभी method देता है: C# और .NET सॉल्वर पेज.
एक आख़िरी बात, जो तय करती है कि आप दोबारा कोशिश कैसे करेंगे। जब कोई image-select challenge किसी solve को वापस भेज देता है, तो इलाज बस एक और कोशिश है, और अपनी ही मशीन पर चलने वाले असीमित कैप्चा सॉल्वर के साथ उस दोबारा कोशिश में बस कुछ सेकंड लगते हैं, किसी और बिल किए गए solve का ख़र्च नहीं।
