Cara Memecahkan reCAPTCHA v3 Enterprise di C# (.NET SDK)

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

Memecahkan reCAPTCHA v3 Enterprise di C# menggunakan metode yang sama seperti jenis reCAPTCHA lainnya. Tidak ada RecaptchaEnterpriseAsync. Anda memanggil RecaptchaAsync dan berikan dua flag: version disetel ke v3, dan enterprise disetel ke 1. Lewatkan salah satunya dan Anda mendapat token untuk produk yang berbeda, yang akan ditolak situs.

Berikut panggilan lengkapnya, apa yang action sebenarnya, dan cara mengetahui varian mana yang sedang Anda hadapi.

Version dan enterprise adalah flag yang independen

Hal ini membingungkan hampir semua orang pada awalnya. Enterprise bukanlah versi keempat dari reCAPTCHA. Enterprise adalah tingkatan produk Google yang berbeda yang menjalankan baik v2 maupun v3, sehingga kedua pengaturan itu membentuk 2×2 yang sesungguhnya.

Apa yang dijalankan situsOpsi yang Anda berikan
reCAPTCHA v2 checkboxtidak ada
reCAPTCHA v2 Enterpriseenterprise = 1
reCAPTCHA v3version = "v3"
reCAPTCHA v3 Enterpriseversion = "v3" dan enterprise = 1

Meneruskan enterprise = 1 saja sudah memberi Anda pemecahan v2 Enterprise, dan itu akan gagal di halaman v3. Itulah penyebab paling umum token yang kembali baik-baik saja lalu ditolak.

Cara mengetahui apakah sebuah halaman memakai Enterprise

Buka sumber halaman dan lihat objek mana yang dipanggil skripnya. reCAPTCHA standar menggunakan grecaptcha. Enterprise menggunakan 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
    });
});

Dua petunjuk lagi: tag script memuat /recaptcha/enterprise.js alih-alih /recaptcha/api.js, dan sitekey Enterprise biasanya dimulai dengan 6L persis seperti yang standar, sehingga kuncinya sendiri tidak memberi tahu apa pun. Percayai skripnya, bukan kuncinya.

Penyiapan

CapSkip berjalan di komputer Anda sendiri, jadi jalankan aplikasinya sebelum semua ini bisa bekerja, lalu instal SDK dari NuGet:

# .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

Arahkan klien ke port yang ditampilkan di aplikasi:

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

Panggilan v3 Enterprise

Semua hal di luar sitekey dan URL masuk ke dalam dictionary opsi:

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

Signature-nya adalah RecaptchaAsync(string sitekey, string url, Dictionary<string, object?>? options = null). Dictionary itu bernilai nullable, sehingga object? penting jika proyek Anda mengaktifkan nullable reference types.

Apa yang sebenarnya dilakukan opsi action

action hanya untuk v3. Pada halaman v2, ini tidak melakukan apa pun.

Itu adalah label yang diteruskan halaman ke grecaptcha.enterprise.execute(). Google menilai setiap action secara terpisah, dan backend situs biasanya memeriksa bahwa action pada respons verifikasi cocok dengan yang diharapkannya. Jika halaman menyatakan login dan Anda memecahkannya dengan nilai bawaan, token Anda valid tetapi tetap dibuang. Salin string itu apa adanya, termasuk huruf besar-kecilnya. Google membatasi action pada alfanumerik, garis miring, dan garis bawah, jadi tidak ada karakter aneh yang perlu di-escape.

Kesalahan ini terjadi tanpa suara. Tidak ada error, karena tidak ada yang salah di sisi pemecahan. Anda hanya mendapat token yang ditolak endpoint.

Tidak ada opsi score minimum

Perlu dinyatakan dengan jelas, karena beberapa API pemecahan mengiklankannya: Anda tidak meminta token pada skor tertentu kepada CapSkip. Skor adalah penilaian Google, dihasilkan ketika situs target Anda memverifikasi token, dan tidak ada parameter pada permintaan pemecahan yang menetapkan batas bawahnya. Jika Anda pernah melihat min_score di tempat lain lalu mencari padanannya di sini, itulah sebabnya Anda tidak dapat menemukannya.

Mengirimkan token

Token dimasukkan ke kolom yang dikirim halaman, yang biasanya adalah 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);

Satu hal yang tidak Anda perlukan di sini: result.UserAgent. Ini hanya terisi untuk Turnstile, dan bernilai null untuk setiap pemecahan reCAPTCHA. Jika Anda menyalin helper dari kode Turnstile, hapus header tersebut alih-alih mengirimkan null.

Token reCAPTCHA juga berumur pendek. Google membuatnya kedaluwarsa setelah dua menit, jadi pecahkan saat Anda siap mengirim, bukan di awal alur kerja yang panjang.

Bagaimana dengan v2 Enterprise?

Metode yang sama, opsi berbeda. Tambahkan version dan action, dan tambahkan datas jika Google memberikan kepada halaman itu data-s nilai:

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

data-s muncul di properti milik Google sendiri dan hampir tidak di tempat lain. Jika Anda tidak menemukannya di halaman, Anda tidak membutuhkannya.

Menangani kegagalan

Setiap exception SDK diturunkan dari CapSkipError. Ada satu jebakan .NET yang perlu diketahui sebelum Anda menulis blok catch.

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 dan ValidationException ada di keduanya System dan CapSkip. Dengan kedua namespace diimpor, catch tanpa kualifikasi merujuk ke System tipe dan diam-diam tidak pernah terpicu. Beri kualifikasi, atau tangkap CapSkipError dan periksa isinya.

Kesalahan umum

KodePenyebabPerbaiki
ERROR_GOOGLEKEYSitekey kosong atau salah formatBaca ulang dari halaman langsung, bukan dari salinan cache
ERROR_PAGEURLURL hilang atau bukan URL absolut lengkapSertakan skema, dan gunakan halaman tempat widget berada
ERROR_BAD_PARAMETERSNilai opsi memiliki tipe yang salahPeriksa enterprise adalah angka 1, bukan string “1”
ERROR_CAPTCHA_UNSOLVABLEPemecahan tidak dapat diselesaikanPastikan flag versinya cocok dengan halaman, lalu tambahkan proxy pada jalur jaringan yang sama

Daftar parameter lengkap untuk setiap jenis ada di dokumentasi API.

Pertanyaan yang sering diajukan

Adakah metode terpisah untuk Enterprise?

Tidak. RecaptchaAsync menangani keempat kombinasi tersebut. Enterprise adalah sebuah flag di dalam dictionary options, dan flag ini bekerja bersama version alih-alih menggantinya.

Apa yang terjadi jika saya salah menuliskan nama action?

Anda mendapatkan token yang benar-benar valid tetapi ditolak situs. Google mengembalikan action bersama skor selama verifikasi, dan sebagian besar backend membandingkannya dengan yang mereka harapkan. Tidak ada error dari pemecah, karena tidak ada yang salah di sisi pemecahan.

Apakah saya memerlukan proxy untuk v3 Enterprise?

Hanya ketika situs sensitif terhadap geolokasi atau score bergantung pada IP peminta. Teruskan ["proxy"] = new Proxy("HTTPS", "user:[email protected]:3128") di dictionary options yang sama. Proxy didukung untuk reCAPTCHA, Turnstile dan GeeTest, tetapi tidak untuk CAPTCHA gambar.

Bisakah saya memecahkan beberapa halaman sekaligus?

Ya. Setiap metode mengembalikan Task, jadi await Task.WhenAll(...) adalah semua yang Anda butuhkan. SDK mengekspor AsyncCapSkip juga, tetapi di .NET itu hanya alias dari CapSkipClient, dipertahankan agar kode yang dipindahkan dari Python SDK tetap dapat dikompilasi. Ia tidak menambah apa pun.

Ringkasan

Satu metode, dua flag. Atur version ke v3 dan enterprise ke 1, salin action persis dari halaman, lalu kirim result.Code dalam dua menit. Tidak ada skor yang perlu disetel, jadi jika sebuah token ditolak, periksa dulu action dan flag-nya.

Sisa cakupan .NET ada di halaman pemecah CAPTCHA C# halaman, Dukungan Enterprise mencakup bahasa lainnya, dan pemecahan reCAPTCHA v3 membahas skor lebih dalam. CapSkip adalah pemecah captcha lokal, sehingga setiap pemecahan ini terjadi di komputer Anda sendiri.