C# में reCAPTCHA v2 कैसे हल करें, Invisible सहित

solve recaptcha v2 in c# - How to Solve reCAPTCHA v2 in C#, Including Invisible

reCAPTCHA v2 तीन रूपों में आता है और लोग अक्सर मान लेते हैं कि हर एक को अपने अलग integration की ज़रूरत है। C# में ये सब एक ही method call हैं। Checkbox सादा call है, Invisible एक option जोड़ता है, Enterprise एक और जोड़ता है, और दोनों को मिलाया जा सकता है। यहां पूरा surface है, साथ ही बाद में token का क्या करना है।

Setup

# Targets .NET Standard 2.0, so Framework 4.6.1+ and .NET 6-9 all work.
dotnet add package CapSkip

CapSkip लोकल रूप से हल करता है, इसलिए किसी भी call के सफल होने से पहले डेस्कटॉप ऐप का चलना ज़रूरी है। client को उसकी settings में दिखाए गए port की ओर इंगित करें:

using CapSkip;

var solver = new CapSkipClient(
    apiKey: "capskip",        // any string when key validation is off
    host: "127.0.0.1",
    port: 8080,
    recaptchaTimeout: 300);   // seconds

तीन variants

Variantक्या बदलता है
Checkboxकुछ नहीं। केवल Sitekey और URL
Invisibleजोड़ें ["invisible"] = 1
Enterpriseजोड़ें ["enterprise"] = 1
Invisible Enterpriseदोनों keys एक साथ

पहले Checkbox, क्योंकि बाक़ी सब कुछ इसी पर बनता है:

var result = await solver.RecaptchaAsync(
    "6Lc...YOUR_SITEKEY",               // the data-sitekey attribute
    "https://example.com/login");       // the page the widget sits on

Console.WriteLine(result.Code);         // g-recaptcha-response token

options bag को छोड़कर Invisible बिल्कुल एक जैसा दिखता है:

using System.Collections.Generic;

var result = await solver.RecaptchaAsync(sitekey, pageUrl,
    new Dictionary<string, object?>
    {
        ["invisible"] = 1,
    });

और Enterprise, जो एक अलग उत्पाद के बजाय एक स्वतंत्र flag है:

var result = await solver.RecaptchaAsync(sitekey, pageUrl,
    new Dictionary<string, object?>
    {
        ["enterprise"] = 1,
        ["invisible"]  = 1,    // combine freely if the widget is both
    });

sitekey ढूंढना

checkbox widgets के लिए यह है data-sitekey container div पर attribute। Invisible के लिए हो सकता है कोई दृश्यमान container न हो, ऐसी स्थिति में sitekey को यहाँ ढूँढ़ें grecaptcha.render call या reCAPTCHA script URL। किसी भी तरह यह सार्वजनिक है, हमेशा इससे शुरू होता है 6L, और hard-code करना सुरक्षित है।

पेज URL लोगों की अपेक्षा से ज़्यादा मायने रखता है। यह वही पेज होना चाहिए जिस पर विजेट वास्तव में रेंडर होता है, न कि आपका form handler और न कोई redirect टारगेट। एक बेमेल ऐसा token बनाता है जो सत्यापन में अमान्य निकलता है।

token सबमिट करना

token इस नाम वाले एक field में जाता है g-recaptcha-response, बिल्कुल जैसे browser ने इसे भेजा होता:

using System.Net.Http;

using var http = new HttpClient();

var form = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>("g-recaptcha-response", result.Code),
    new KeyValuePair<string, string>("username", "..."),
    new KeyValuePair<string, string>("password", "..."),
});

var response = await http.PostAsync("https://example.com/login", form);

टोकन अल्पकालिक होते हैं, आमतौर पर लगभग दो मिनट, और एकल उपयोग वाले। शुरुआत में करने के बजाय फ्लो में जितना देर से हो सके उतना देर से हल करें।

कुछ साइटें कभी कोई फॉर्म फ़ील्ड रेंडर करती ही नहीं और इसके बजाय टोकन को सीधे एक JavaScript callback को पास कर देती हैं। यह एक अलग सबमिशन शेप है और हमारे यहाँ इसे कवर किया गया है reCAPTCHA v2 callback सॉल्वर page। हल स्वयं अपरिवर्तित रहता है।

पकड़ने लायक़ Errors

using System;
using CapSkip;

try
{
    var result = await solver.RecaptchaAsync(sitekey, pageUrl, options);
}
catch (CapSkip.ValidationException) { /* missing sitekey or url */ }
catch (NetworkException)            { /* CapSkip is not running */ }
catch (ApiException)                { /* bad sitekey or pageurl */ }
catch (CapSkip.TimeoutException)    { /* exceeded recaptchaTimeout */ }
catch (CapSkipError)                { /* anything else */ }

ValidationException और TimeoutException दोनों में मौजूद हैं System और CapSkip। दोनों namespaces इम्पोर्ट होने पर एक unqualified catch इससे बंध जाता है System type और चुपचाप कभी नहीं चलता। उन्हें ऊपर की तरह क्वालिफ़ाई करें, या base पकड़ें CapSkipError और इसका निरीक्षण करें।

Concurrency और प्रॉक्सी

हर मेथड एक लौटाती है Task, इसलिए सामान्य .NET concurrency काम करती है:

var results = await Task.WhenAll(
    solver.RecaptchaAsync(sitekeyA, "https://a.example.com"),
    solver.RecaptchaAsync(sitekeyB, "https://b.example.com"));

AsyncCapSkip भी एक्सपोर्ट किया जाता है, पर .NET में यह सिर्फ़ इसका एक alias है CapSkipClient। यह इसलिए मौजूद है ताकि Python SDK से पोर्ट किया गया कोड अभी भी compile हो, और इस पर स्विच करने से कुछ नहीं बदलता।

अगर साइट geo-sensitive है, तो उसी egress के ज़रिए हल करें जहाँ से आप सबमिट करेंगे:

var result = await solver.RecaptchaAsync(sitekey, pageUrl,
    new Dictionary<string, object?>
    {
        ["proxy"] = new Proxy("HTTPS", "user:[email protected]:3128"),
    });

अक्सर पूछे जाने वाले सवाल

मुझे कैसे पता चलेगा कि कोई widget Invisible है या Enterprise?

Invisible में कोई checkbox नहीं होता और यह आमतौर पर submit पर फ़ायर होता है, अक्सर कोने में एक badge के साथ। Enterprise लोड होता है enterprise.js के बजाय api.js, इसलिए reCAPTCHA script tag की जाँच करें। अगर आप ग़लत अंदाज़ा लगाते हैं तो हल चुपचाप एक ख़राब token लौटाने के बजाय फ़ेल हो जाता है, इसलिए दोनों को टेस्ट करना सस्ता है।

क्या मैं एक token दोबारा उपयोग कर सकता हूं?

नहीं। टोकन एकल उपयोग वाले होते हैं और लगभग दो मिनट में एक्सपायर हो जाते हैं। एक पूल बनाने के बजाय सबमिट करने से ठीक पहले हल करें।

क्या यह .NET Framework पर काम करता है?

हां। package .NET Standard 2.0 को टारगेट करता है, इसलिए Framework 4.6.1 और नए हर आधुनिक .NET रिलीज़ के साथ काम करते हैं। synchronous कोड से आप कॉल कर सकते हैं .GetAwaiter().GetResult(), हालाँकि सही तरीके से await करना बेहतर है।

सारांश

एक method तीनों variants को कवर करता है। जोड़ें invisible या enterprise options के रूप में, वह page इस्तेमाल करें जिस पर widget render होता है, परिणाम इसमें डालें g-recaptcha-response, और catch CapSkipError namespace टकराव से बचने के लिए।

पूरी .NET सतह यहाँ है C# कैप्चा सॉल्वर पेज, अन्य languages इससे कवर होती हैं reCAPTCHA v2 सॉल्वर पेज, और आप हमारे यहाँ प्रयोग कर सकते हैं लाइव v2 डेमो। CapSkip एक है लोकल captcha सॉल्वर, इसलिए वॉल्यूम की प्रति हल कोई कीमत नहीं।