C#'ta Invisible Dahil reCAPTCHA v2 Nasıl Çözülür

reCAPTCHA v2 üç çeşitte gelir ve insanlar genellikle her birinin kendi entegrasyonuna ihtiyaç duyduğunu varsayar. C#'ta bunların hepsi aynı metot çağrısıdır. Checkbox çıplak çağrıdır, Invisible bir seçenek ekler, Enterprise başka bir seçenek ekler ve ikisi birleştirilebilir. İşte tüm yüzey, ayrıca token ile sonrasında ne yapılacağı.
Kurulum
# Targets .NET Standard 2.0, so Framework 4.6.1+ and .NET 6-9 all work. dotnet add package CapSkip
CapSkip yerel olarak çözer, dolayısıyla herhangi bir çağrının başarılı olması için masaüstü uygulamasının çalışıyor olması gerekir. İstemciyi, ayarlarında gösterilen porta yönlendirin:
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Üç varyant
| Varyant | Neler değişir |
|---|---|
| Checkbox | Hiçbir şey. Yalnızca sitekey ve URL |
| Invisible | Ekle ["invisible"] = 1 |
| Enterprise | Ekle ["enterprise"] = 1 |
| Invisible Enterprise | Her iki anahtar birlikte |
Önce checkbox, çünkü diğer her şey onun üzerine kurulur:
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 tokenInvisible, seçenekler paketi (options bag) dışında birebir aynı görünür:
using System.Collections.Generic;
var result = await solver.RecaptchaAsync(sitekey, pageUrl,
new Dictionary<string, object?>
{
["invisible"] = 1,
});Ve farklı bir üründen ziyade dik (orthogonal) bir bayrak olan Enterprise:
var result = await solver.RecaptchaAsync(sitekey, pageUrl,
new Dictionary<string, object?>
{
["enterprise"] = 1,
["invisible"] = 1, // combine freely if the widget is both
});Sitekey'i bulma
Checkbox widget'ları için bu şudur: data-sitekey kapsayıcı (container) div üzerindeki öznitelik. Invisible için görünür bir kapsayıcı olmayabilir, bu durumda sitekey'i şurada arayın: grecaptcha.render çağrısı veya reCAPTCHA betik URL'si. Her iki durumda da geneldir, her zaman şununla başlar: 6L, ve gömülü olarak (hard-code) yazılması güvenlidir.
Sayfa URL'si beklenenden daha önemlidir. Widget'ın gerçekte render edildiği sayfa olmalıdır; form işleyiciniz veya bir yönlendirme hedefi değil. Bir uyuşmazlık, geçersiz olarak doğrulanan bir token üretir.
Token'ı gönderme
Token, şu adlı bir alana girer: g-recaptcha-response, tam tarayıcının göndereceği gibi:
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);Token'lar kısa ömürlüdür, genellikle yaklaşık iki dakika ve tek kullanımlıktır. Akışta baştan değil, mümkün olduğunca geç çözün.
Bazı siteler hiçbir zaman bir form alanı oluşturmaz ve bunun yerine token'ı doğrudan bir JavaScript callback'ine iletir. Bu, farklı bir gönderim yapısıdır ve şu sayfamızda ele alınmıştır reCAPTCHA v2 callback çözücü sayfası. Çözümün kendisi değişmez.
Yakalanmaya değer hatalar
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 ve TimeoutException her ikisinde de bulunur System ve CapSkip. Her iki ad alanı (namespace) da içe aktarıldığında, niteliksiz bir catch şuna bağlanır: System türü ve sessizce hiç tetiklenmez. Bunları yukarıdaki gibi nitelendirin ya da temel türü yakalayın CapSkipError ve inceleyin.
Eşzamanlılık ve proxy'ler
Her metot bir şey döndürür Task, böylece sıradan .NET eşzamanlılığı çalışır:
var results = await Task.WhenAll(
solver.RecaptchaAsync(sitekeyA, "https://a.example.com"),
solver.RecaptchaAsync(sitekeyB, "https://b.example.com"));AsyncCapSkip da dışa aktarılır, ancak .NET'te yalnızca şunun bir takma adıdır: CapSkipClient. Python SDK'sından taşınan kodun hâlâ derlenmesi için vardır ve buna geçmek hiçbir şeyi değiştirmez.
Site coğrafi olarak hassassa, göndereceğiniz aynı çıkış (egress) üzerinden çözün:
var result = await solver.RecaptchaAsync(sitekey, pageUrl,
new Dictionary<string, object?>
{
["proxy"] = new Proxy("HTTPS", "user:[email protected]:3128"),
});Sık sorulan sorular
Bir widget'ın Invisible mı yoksa Enterprise mı olduğunu nasıl anlarım?
Invisible'ın onay kutusu yoktur ve genellikle gönderimde tetiklenir, çoğu zaman köşede bir rozetle. Enterprise şuradan yüklenir: enterprise.js yerine api.js, dolayısıyla reCAPTCHA script etiketini kontrol edin. Yanlış tahmin ederseniz, çözüm sessizce hatalı bir token döndürmek yerine başarısız olur; bu yüzden ikisini de test etmek ucuzdur.
Bir token'ı yeniden kullanabilir miyim?
Hayır. Token'lar tek kullanımlıktır ve yaklaşık iki dakika içinde sona erer. Bir havuz oluşturmak yerine göndermeden hemen önce çözün.
.NET Framework'te çalışır mı?
Evet. Paket .NET Standard 2.0'ı hedefler, bu nedenle Framework 4.6.1 ve daha yenisi her modern .NET sürümüyle birlikte çalışır. Senkron koddan şunu çağırabilirsiniz: .GetAwaiter().GetResult(), ancak düzgün şekilde await etmek daha iyidir.
Özet
Tek bir metot üç çeşidin hepsini kapsar. Şunu ekleyin: invisible veya enterprise seçenek olarak, widget'ın render edildiği sayfayı kullanın, sonucu şuraya koyun: g-recaptcha-response, ve catch CapSkipError ad alanı (namespace) çakışmasını önlemek için.
Tam .NET yüzeyi şuradadır: C# CAPTCHA çözücü sayfa, diğer diller şunun kapsamındadır: reCAPTCHA v2 çözücü sayfası ve şurada deneyler yapabilirsiniz: canlı v2 demosu. CapSkip bir yerel captcha çözücü, böylece hacmin çözüm başına hiçbir maliyeti yoktur.
