Cara Memecahkan reCAPTCHA v2 di C#, Termasuk Invisible

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

reCAPTCHA v2 hadir dalam tiga bentuk dan orang sering mengira masing-masing memerlukan integrasi sendiri. Di C#, semuanya adalah pemanggilan metode yang sama. Checkbox adalah panggilan polosnya, Invisible menambahkan satu opsi, Enterprise menambahkan satu lagi, dan keduanya dapat digabungkan. Berikut seluruh permukaannya, ditambah apa yang harus dilakukan dengan token setelahnya.

Penyiapan

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

CapSkip memecahkan secara lokal, jadi aplikasi desktop harus berjalan sebelum panggilan apa pun berhasil. Arahkan client ke port yang ditampilkan di pengaturannya:

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

Tiga varian

VarianApa yang berubah
CheckboxTidak ada. Hanya sitekey dan URL
InvisibleTambah ["invisible"] = 1
EnterpriseTambah ["enterprise"] = 1
Invisible EnterpriseKedua kunci bersamaan

Checkbox lebih dulu, karena semua yang lain dibangun di atasnya:

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

Invisible terlihat identik kecuali pada kumpulan opsinya:

using System.Collections.Generic;

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

Dan Enterprise, yang merupakan flag ortogonal alih-alih produk yang berbeda:

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

Menemukan sitekey

Untuk widget checkbox, ini adalah data-sitekey atribut pada div container. Untuk Invisible mungkin tidak ada container yang terlihat, dalam hal ini cari sitekey di grecaptcha.render atau URL skrip reCAPTCHA. Bagaimanapun juga nilainya publik, selalu diawali dengan 6L, dan aman untuk ditulis langsung di kode.

URL halaman lebih penting daripada yang orang kira. URL itu harus berupa halaman tempat widget benar-benar dirender, bukan handler formulir Anda dan bukan target pengalihan. Ketidakcocokan menghasilkan token yang tervalidasi sebagai tidak valid.

Mengirimkan token

Token dimasukkan ke bidang bernama g-recaptcha-response, persis seperti yang akan dikirim oleh 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);

Token berumur pendek, umumnya sekitar dua menit, dan sekali pakai. Pecahkan selambat mungkin dalam alur Anda, bukan di awal.

Beberapa situs sama sekali tidak merender kolom formulir dan justru meneruskan token langsung ke sebuah callback JavaScript. Itu bentuk pengiriman yang berbeda dan dibahas di pemecah callback reCAPTCHA v2 . Pemecahannya sendiri tidak berubah.

Error yang perlu ditangkap

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 dan TimeoutException ada di keduanya System dan CapSkip. Dengan kedua namespace diimpor, catch tanpa kualifikasi akan terikat ke System dan diam-diam tidak pernah terpicu. Kualifikasikan seperti di atas, atau tangkap kelas dasar CapSkipError dan periksa isinya.

Konkurensi dan proxy

Setiap metode mengembalikan Task, sehingga konkurensi .NET biasa dapat digunakan:

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

AsyncCapSkip juga diekspor, tetapi di .NET itu hanya alias dari CapSkipClient. Ia ada agar kode yang dipindahkan dari Python SDK tetap dapat dikompilasi, dan beralih ke sana tidak mengubah apa pun.

Jika situsnya sensitif terhadap geolokasi, pecahkan melalui egress yang sama dengan tempat Anda akan mengirim:

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

Pertanyaan yang sering diajukan

Bagaimana saya tahu apakah sebuah widget bertipe Invisible atau Enterprise?

Invisible tidak memiliki checkbox dan biasanya terpicu saat pengiriman formulir, sering kali dengan badge di sudut. Enterprise dimuat dari enterprise.js alih-alih api.js, jadi periksa tag skrip reCAPTCHA. Jika Anda menebak salah, pemecahan akan gagal alih-alih diam-diam mengembalikan token yang buruk, jadi murah untuk mencoba keduanya.

Bisakah saya menggunakan ulang token?

Tidak. Token bersifat sekali pakai dan kedaluwarsa dalam waktu sekitar dua menit. Pecahkan tepat sebelum mengirim alih-alih membangun kumpulan token.

Apakah ini bekerja di .NET Framework?

Ya. Paket ini menargetkan .NET Standard 2.0, jadi Framework 4.6.1 ke atas bekerja berdampingan dengan setiap rilis .NET modern. Dari kode sinkron Anda dapat memanggil .GetAwaiter().GetResult(), meskipun menggunakan await dengan benar lebih baik.

Ringkasan

Satu metode mencakup ketiga varian. Tambahkan invisible atau enterprise sebagai opsi, gunakan halaman tempat widget dirender, masukkan hasilnya ke g-recaptcha-response, dan tangkap CapSkipError untuk menghindari benturan namespace.

Cakupan .NET selengkapnya ada di pemecah CAPTCHA C# , bahasa lain dibahas oleh pemecah reCAPTCHA v2 , dan Anda dapat bereksperimen di halaman kami demo v2 langsung. CapSkip adalah pemecah captcha lokal, sehingga volume tidak menambah biaya per pemecahan.