So lösen Sie reCAPTCHA v2 in C#, einschließlich Invisible

reCAPTCHA v2 gibt es in drei Ausprägungen, und man nimmt oft an, dass jede eine eigene Integration braucht. In C# sind sie alle derselbe Methodenaufruf. Checkbox ist der reine Aufruf, Invisible fügt eine Option hinzu, Enterprise fügt eine weitere hinzu, und beide lassen sich kombinieren. Hier ist die gesamte Oberfläche – und was Sie anschließend mit dem Token tun.
Einrichtung
# Targets .NET Standard 2.0, so Framework 4.6.1+ and .NET 6-9 all work. dotnet add package CapSkip
CapSkip löst lokal, daher muss die Desktop-App laufen, bevor ein Aufruf erfolgreich sein kann. Richten Sie den Client auf den in seinen Einstellungen angezeigten 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); // secondsDie drei Varianten
| Variante | Was sich ändert |
|---|---|
| Checkbox | Nichts. Nur Sitekey und URL |
| Invisible | Hinzufügen ["invisible"] = 1 |
| Enterprise | Hinzufügen ["enterprise"] = 1 |
| Invisible Enterprise | Beide Schlüssel zusammen |
Zuerst Checkbox, da alles andere darauf aufbaut:
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 sieht identisch aus, abgesehen vom Options-Bag:
using System.Collections.Generic;
var result = await solver.RecaptchaAsync(sitekey, pageUrl,
new Dictionary<string, object?>
{
["invisible"] = 1,
});Und Enterprise, das eher ein orthogonales Flag als ein anderes Produkt ist:
var result = await solver.RecaptchaAsync(sitekey, pageUrl,
new Dictionary<string, object?>
{
["enterprise"] = 1,
["invisible"] = 1, // combine freely if the widget is both
});Den Sitekey finden
Für Kontrollkästchen-Widgets ist es das data-sitekey Attribut am Container-div. Bei Invisible gibt es möglicherweise keinen sichtbaren Container, in diesem Fall suchen Sie den sitekey im grecaptcha.render Aufruf oder die reCAPTCHA-Skript-URL. So oder so ist er öffentlich und beginnt immer mit 6L, und kann bedenkenlos fest codiert werden.
Die Seiten-URL ist wichtiger, als die meisten erwarten. Es muss die Seite sein, auf der das Widget tatsächlich gerendert wird, nicht Ihr Formular-Handler und kein Weiterleitungsziel. Eine Abweichung erzeugt einen Token, der als ungültig validiert wird.
Den Token übermitteln
Der Token kommt in ein Feld namens g-recaptcha-response, genau so, wie der Browser sie gesendet hätte:
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);Tokens sind kurzlebig, in der Regel etwa zwei Minuten, und zum einmaligen Gebrauch. Lösen Sie so spät wie möglich im Ablauf statt im Voraus.
Einige Websites rendern überhaupt kein Formularfeld und übergeben das Token stattdessen direkt an einen JavaScript-Callback. Das ist eine andere Absende-Form und wird auf unserer reCAPTCHA-v2-Callback-Löser -Seite. Das Lösen selbst bleibt unverändert.
Fehler, die es abzufangen lohnt
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 und TimeoutException existieren in beiden System und CapSkip. Wenn beide Namespaces importiert sind, bindet ein nicht qualifiziertes catch an die System -Typ und wird stillschweigend nie ausgelöst. Qualifizieren Sie sie wie oben, oder fangen Sie die Basis CapSkipError und untersuchen Sie es.
Concurrency und Proxys
Jede Methode liefert einen Task, sodass gewöhnliche .NET-Nebenläufigkeit funktioniert:
var results = await Task.WhenAll(
solver.RecaptchaAsync(sitekeyA, "https://a.example.com"),
solver.RecaptchaAsync(sitekeyB, "https://b.example.com"));AsyncCapSkip wird ebenfalls exportiert, ist in .NET aber nur ein Alias von CapSkipClient. Es existiert, damit aus dem Python SDK portierter Code weiterhin kompiliert, und der Wechsel dazu ändert nichts.
Wenn die Website geo-sensibel ist, lösen Sie über denselben Ausgang, von dem aus Sie absenden werden:
var result = await solver.RecaptchaAsync(sitekey, pageUrl,
new Dictionary<string, object?>
{
["proxy"] = new Proxy("HTTPS", "user:[email protected]:3128"),
});Häufig gestellte Fragen
Woran erkenne ich, ob ein Widget Invisible oder Enterprise ist?
Invisible hat kein Kontrollkästchen und wird meist beim Absenden ausgelöst, oft mit einem Badge in der Ecke. Enterprise lädt von enterprise.js statt api.js, prüfen Sie daher das reCAPTCHA-Script-Tag. Wenn Sie falsch raten, scheitert die Lösung, anstatt stillschweigend einen fehlerhaften Token zurückzugeben, sodass es günstig ist, beides zu testen.
Kann ich einen Token wiederverwenden?
Nein. Tokens sind zur einmaligen Verwendung und laufen in etwa zwei Minuten ab. Lösen Sie unmittelbar vor dem Absenden, statt einen Pool aufzubauen.
Funktioniert das mit .NET Framework?
Ja. Das Paket zielt auf .NET Standard 2.0 ab, sodass Framework 4.6.1 und neuer neben jeder modernen .NET-Version funktionieren. Aus synchronem Code können Sie aufrufen .GetAwaiter().GetResult(), wobei ordentliches await besser ist.
Zusammenfassung
Eine Methode deckt alle drei Varianten ab. Fügen Sie invisible oder enterprise als Optionen, verwenden Sie die Seite, auf der das Widget gerendert wird, und legen Sie das Ergebnis in g-recaptcha-response, und fangen Sie ab CapSkipError um die Namespace-Kollision zu vermeiden.
Die vollständige .NET-Oberfläche finden Sie auf der C#-Captcha-Löser Seite, weitere Sprachen werden abgedeckt vom reCAPTCHA-v2-Löser -Seite, und Sie können auf unserer experimentieren Live-v2-Demo. CapSkip ist ein lokaler Captcha-Löser, sodass Volumen pro Lösung nichts kostet.
