C#'ta (.NET SDK) reCAPTCHA v3 Enterprise Nasıl Çözülür

recaptcha v3 enterprise in c# - How to Solve reCAPTCHA v3 Enterprise in C# (.NET SDK)

C#'ta reCAPTCHA v3 Enterprise'ı çözmek, diğer her reCAPTCHA türüyle aynı metodu kullanır. Şey yoktur RecaptchaEnterpriseAsync. Şunu çağırırsınız: RecaptchaAsync ve iki bayrak geçirin: version şuna ayarlı: v3, ve enterprise şuna ayarlı: 1. İkisinden birini kaçırırsanız farklı bir ürün için bir token alırsınız ve site onu reddeder.

İşte tam çağrı, şunun ne action seçeneğinin gerçekte ne yaptığını ve hangi çeşide baktığınızı nasıl anlayacağınızı.

Version ve enterprise bağımsız bayraklardır

Bu, neredeyse herkesin ilk seferinde takıldığı bir noktadır. Enterprise, reCAPTCHA'nın dördüncü bir sürümü değildir. Hem v2'yi hem de v3'ü çalıştıran farklı bir Google ürün katmanıdır, dolayısıyla iki ayar gerçek bir 2×2 oluşturur.

Sitenin çalıştırdığı şeyGeçtiğiniz seçenekler
reCAPTCHA v2 checkboxyok
reCAPTCHA v2 Enterpriseenterprise = 1
reCAPTCHA v3version = "v3"
reCAPTCHA v3 Enterpriseversion = "v3" ve enterprise = 1

Geçirme enterprise = 1 tek başına size bir v2 Enterprise çözümü verir ve bir v3 sayfasında başarısız olur. Bu, düzgün geri gelip sonra reddedilen bir token'ın açık ara en yaygın nedenidir.

Bir sayfanın Enterprise olup olmadığı nasıl anlaşılır

Sayfa kaynağını açın ve betiğin hangi nesneyi çağırdığına bakın. Standart reCAPTCHA şunu kullanır: grecaptcha. Enterprise şunu kullanır: grecaptcha.enterprise.

// Enterprise pages call grecaptcha.enterprise, not grecaptcha.
// The action name you need is right here in execute().
grecaptcha.enterprise.ready(function () {
  grecaptcha.enterprise.execute("YOUR_SITEKEY", { action: "login" })
    .then(function (token) {
      // token gets posted with the form
    });
});

İki ipucu daha: betik etiketi yüklenir /recaptcha/enterprise.js yerine /recaptcha/api.js, ve Enterprise sitekey'leri genellikle şununla başlar: 6L tıpkı standart olanlar gibi, dolayısıyla anahtarın kendisi size hiçbir şey söylemez. Anahtara değil, betiğe güvenin.

Kurulum

CapSkip kendi makinenizde çalışır; dolayısıyla bunların herhangi biri işlemeden önce uygulamayı başlatın, ardından SDK'yı NuGet'ten kurun:

# .NET Standard 2.0, so .NET Framework 4.6.1+, Core 2.0+
# and every modern .NET release are all supported.
dotnet add package CapSkip

İstemciyi, uygulamada 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; v3 rarely gets near this

v3 Enterprise çağrısı

sitekey ve URL'nin ötesindeki her şey bir seçenek sözlüğüne girer:

using System.Collections.Generic;
using CapSkip;

var result = await solver.RecaptchaAsync(
    "YOUR_SITEKEY",
    "https://example.com/page-with-recaptcha",
    new Dictionary<string, object?>
    {
        ["version"]    = "v3",
        ["enterprise"] = 1,
        ["action"]     = "login",   // match the page exactly
    });

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

İmza (signature) şudur: RecaptchaAsync(string sitekey, string url, Dictionary<string, object?>? options = null). Sözlük null değer alabilir, bu yüzden object? projenizde nullable referans türleri açıksa önemlidir.

action seçeneğinin gerçekte ne yaptığı

action yalnızca v3'e özgüdür. Bir v2 sayfasında hiçbir şey yapmaz.

Bu, sayfanın şuna ilettiği etikettir: grecaptcha.enterprise.execute(). Google her aksiyonu ayrı ayrı skorlar ve sitenin arka ucu genellikle doğrulama yanıtındaki aksiyonun beklenenle eşleştiğini kontrol eder. Sayfa şunu söylüyorsa: login ve varsayılanla çözerseniz token'ınız geçerlidir ama yine de reddedilir. Dizeyi büyük/küçük harf dâhil olmak üzere birebir kopyalayın. Google, action'ları alfanümerik karakterler, eğik çizgiler ve alt çizgilerle sınırlar; bu nedenle kaçırılacak (escape) egzotik bir şey yoktur.

Bunu yanlış yapmak sessizdir. Hiçbir şey hata vermez, çünkü çözme tarafında hiçbir şey ters gitmemiştir. Yalnızca uç noktanın reddettiği bir token alırsınız.

Minimum puan seçeneği yoktur

Açıkça belirtmekte fayda var, çünkü bazı çözüm API'leri böyle bir şeyin reklamını yapıyor: CapSkip'ten belirli bir skorda token istemezsiniz. Skor, hedef siteniz token'ı doğruladığında üretilen Google’ın kararıdır ve çözüm isteğindeki hiçbir parametre bunun için bir alt sınır belirlemez. Eğer bir min_score alanını başka bir yerde kullanıp burada karşılığını arıyorsanız, işte bu yüzden bulamıyorsunuz.

Token'ı gönderme

Token, sayfanın gönderdiği (post) alana girer ki bu normalde şudur: g-recaptcha-response:

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", "demo"),
});

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

Burada ihtiyacınız olmayan bir şey: result.UserAgent. Yalnızca Turnstile için doldurulur ve her reCAPTCHA çözümünde null olur. Turnstile kodundan bir yardımcı kopyaladıysanız, null göndermek yerine o başlığı kaldırın.

reCAPTCHA token'ları da kısa ömürlüdür. Google onları iki dakika sonra geçersiz kılar, bu yüzden uzun bir iş akışının başında değil, göndermeye hazır olduğunuz anda çözün.

Peki ya v2 Enterprise?

Aynı yöntem, farklı seçenekler. Şunu bırakın: version ve action, ve ekleyin datas Google sayfaya bir data-s değer:

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

data-s Google’ın kendi mülklerinde görünür ve neredeyse başka hiçbir yerde görünmez. Sayfada bir tane bulamıyorsanız, ona ihtiyacınız yoktur.

Hataları işleme

Her SDK istisnası (exception) şundan türer: CapSkipError. catch bloklarını yazmadan önce bilmeye değer bir .NET tuzağı var.

using System;
using CapSkip;

try
{
    var result = await solver.RecaptchaAsync(sitekey, pageUrl, options);
}
catch (CapSkip.ValidationException) { /* bad parameters */ }
catch (NetworkException)            { /* CapSkip is not running */ }
catch (ApiException)                { /* API returned an error */ }
catch (CapSkip.TimeoutException)    { /* exceeded recaptchaTimeout */ }
catch (CapSkipError)                { /* anything else from the SDK */ }

TimeoutException ve ValidationException her ikisinde de bulunur System ve CapSkip. Her iki ad alanı da içe aktarıldığında, niteliksiz bir catch şuna çözümlenir System türü ve sessizce hiç tetiklenmez. Onları nitelendirin veya yakalayın CapSkipError ve inceleyin.

Yaygın hatalar

KodNedenDüzeltme
ERROR_GOOGLEKEYSitekey boş veya hatalı biçimlendirilmişOnu önbelleğe alınmış bir kopyadan değil, canlı sayfadan yeniden okuyun
ERROR_PAGEURLURL eksik veya tam mutlak URL değilŞemayı dahil edin ve widget'ın bulunduğu sayfayı kullanın
ERROR_BAD_PARAMETERSBir seçenek değeri yanlış türdeKontrol et enterprise 1 sayısıdır, “1” dizesi değil
ERROR_CAPTCHA_UNSOLVABLEÇözüm tamamlanamadıSürüm bayraklarının sayfayla eşleştiğini doğrulayın, ardından aynı ağ yolunda bir proxy ekleyin

Her tür için tam parametre listesi şuradadır: API dokümantasyonu.

Sık sorulan sorular

Enterprise için ayrı bir yöntem var mı?

Hayır. RecaptchaAsync dört kombinasyonun tümünü halleder. Enterprise, seçenekler sözlüğündeki bir bayraktır ve şununla birlikte çalışır: version onu değiştirmek yerine.

Eylem adını yanlış girersem ne olur?

Sitenin reddettiği tamamen geçerli bir token elde edersiniz. Google, doğrulama sırasında action'ı skorla birlikte döndürür ve çoğu backend bunu beklediğiyle karşılaştırır. Çözücüden herhangi bir hata gelmez, çünkü çözüm tarafında hiçbir şey yanlış gitmemiştir.

v3 Enterprise için proxy'ye ihtiyacım var mı?

Yalnızca site coğrafyaya duyarlı olduğunda veya puan istek gönderen IP'ye bağlı olduğunda. Şunu geçirin: ["proxy"] = new Proxy("HTTPS", "user:[email protected]:3128") aynı seçenekler sözlüğünde. Proxy'ler reCAPTCHA, Turnstile ve GeeTest için desteklenir, ancak görsel CAPTCHA'lar için desteklenmez.

Aynı anda birkaç sayfayı çözebilir miyim?

Evet. Her metot bir Task, dolayısıyla await Task.WhenAll(...) tek ihtiyacınız olan budur. SDK şunları dışa aktarır: AsyncCapSkip da, ama .NET'te yalnızca şunun bir takma adıdır: CapSkipClient, Python SDK'sından taşınan kodun hâlâ derlenmesi için tutulur. Hiçbir şey eklemez.

Özet

Bir yöntem, iki bayrak. Şunu ayarlayın: version şuraya v3 ve enterprise şuraya 1, şunu kopyalayın: action sayfadan tam olarak okuyun, ardından gönderin result.Code iki dakika içinde. İnce ayar yapılacak bir skor yoktur; bu nedenle bir token reddedilirse, önce action'ı ve bayrakları kontrol edin.

.NET yüzeyinin geri kalanı şurada bulunur: C# CAPTCHA çözücü sayfa, Enterprise desteği diğer dilleri kapsar ve reCAPTCHA v3 çözümü puanlama konusunda daha derine iner. CapSkip bir yerel captcha çözücü, böylece bu çözümlerin her biri kendi makinenizde gerçekleşir.