So lösen Sie CaptchaFox in C# ohne abgelehnten Token

Um CaptchaFox in C# zu lösen, rufen Sie CaptchaFoxAsync mit dem sitekey und der Seiten-URL auf, setzen den zurückgegebenen Token in das Formularfeld cf-captcha-response und senden diese Anfrage mit dem User-Agent, den CapSkip zusammen mit dem Token zurückgibt. Am letzten Teil scheitern die meisten Integrationen. Ein CaptchaFox-Token ist an den Browser gebunden, der ihn erzeugt hat, und ein abweichender User-Agent ist der häufigste Grund dafür, dass ein korrekter Token abgelehnt wird, obwohl das Lösen selbst funktioniert hat. CapSkip hat CaptchaFox in Version 1.4.0 hinzugefügt. Dieser Leitfaden zeigt, wie Sie den Schlüssel finden, wie der Aufruf aussieht, wie Sie absenden und welche wenigen Einstellungen darüber entscheiden, ob der Token akzeptiert wird.
Was Sie brauchen
- CapSkip 1.4.0 oder neuer auf einem Windows-Rechner. Die Unterstützung für CaptchaFox kam mit diesem Release, zusammen mit Friendly Captcha und Capy Puzzle.
- Version 1.3.0 oder neuer des CapSkip .NET-Pakets, also das Release, das CaptchaFoxAsync hinzugefügt hat. Es zielt auf .NET Standard 2.0 und hängt von System.Text.Json 8 ab, daher wird es unter .NET Framework 4.6.2 und höher sowie unter .NET 6 und neuer unterstützt. Die Beispiele verwenden Top-Level-Anweisungen und die impliziten Usings eines .NET-6-Konsolenprojekts, führen Sie sie also unter .NET 6 oder neuer aus.
- Zwei Werte von der Zielseite: der sitekey und die URL der Seite, auf der das Widget läuft. Schritt 1 zeigt, wo Sie den Schlüssel finden, und ein weiteres Detail der Seite entscheidet über eine optionale Einstellung.
- Eine Adresse für den Solver. Der Local-Modus antwortet auf 127.0.0.1 nur für dieses Gerät; der Server-Modus lauscht auf Ihrer Netzwerkadresse oder öffentlichen IP, damit ein anderer Rechner ihn über die API aufrufen kann. Beide finden Sie unter Verbindungseinstellungen, und ein Abschnitt weiter unten erklärt, wann Sie wechseln sollten.
# dotnet add package CapSkip dotnet add package CapSkip
Schritt 1: Den sitekey und die Widget-Quelle finden
Alles, was Sie brauchen, um CaptchaFox in C# zu lösen, stammt von der Zielseite. Der sitekey ist öffentlich, für jeden Besucher identisch und beginnt üblicherweise mit sk_. Websites legen ihn an einer von drei Stellen ab, und Sie müssen nur eine davon finden.
- Am Container-Element, wenn das Widget sich selbst rendert: ein div mit der Klasse captchafox und einem Attribut data-sitekey. Der Hidden-Modus, der bis zum Absenden des Formulars nichts anzeigt, verwendet dasselbe div mit data-mode auf hidden, der Schlüssel steht also auch dort.
- In den Optionen eines Aufrufs von captchafox.render, wenn die Seite das Widget aus ihrem eigenen Skript aufbaut. Auch ein render-Aufruf kann den Hidden-Modus einschalten, und der Schlüssel steht dann direkt daneben.
- Im Network-Tab, wenn keins von beiden im ausgelieferten HTML auftaucht. Suchen Sie die Anfrage an api.captchafox.com; der Schlüssel ist das Pfadsegment nach /captcha/.
Sehen Sie sich, solange der Seitenquelltext offen ist, das Script-Tag an, das das Widget lädt. Das Widget kommt von zwei Stellen auf die Seiten, und welche davon eine Website lädt, entscheidet darüber, welche Form von Token diese Website zurückerwartet.
| Die Seite lädt das Widget von | Zurückgegebener Token | Was Sie übergeben |
|---|---|---|
| https://cdn.captchafox.com/, das Standard-Widget, das die meisten Websites verwenden | Ein einfacher Token | Nichts weiter; das ist der Standard |
| Ein Paket unter https://s.uicdn.com/mampkg/, das manche Plattformen einbinden | Ein Token, der mit MAM_ beginnt | Den vollständigen Paketpfad aus dem Script-Tag, als Option api_server |
Liegen Sie hier falsch, merken Sie es zunächst nicht. Wenn Sie die falsche Quelle senden, gelingt das Lösen trotzdem und liefert einen Token, nur in einem Format, das die Website nicht akzeptiert. Das Scheitern zeigt sich also erst später als abgelehntes Formular und nicht als Fehler, den Sie abfangen können.
Schritt 2: Der Aufruf von CaptchaFoxAsync
Die Methode nimmt den sitekey, die Seiten-URL und ein optionales Options-Dictionary entgegen. Für das Standard-Widget brauchen Sie nur die ersten beiden.
// dotnet add package CapSkip
using CapSkip;
var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);
// The sitekey from the widget, and the page the widget runs on.
var result = await solver.CaptchaFoxAsync(
"YOUR_SITEKEY",
"https://example.com/signup");
Console.WriteLine(result.Token); // goes in cf-captcha-response
Console.WriteLine(result.UserAgent); // send this as the User-AgentLesen Sie die Eigenschaft Token. Die Eigenschaft Code enthält dieselbe Zeichenfolge, aber Token ist nach dem Feld benannt, in das der Wert gehört. UserAgent ist die Identität des Browsers, der den Token ausgestellt hat. Das ist der eigene Browser von CapSkip und nichts, was Sie gesendet haben. Das SDK lässt den Wert auf null, wenn ein Lösen keinen User-Agent gemeldet hat, statt einen Wert zu erfinden.
Die Seiten-URL ist hier wichtiger als bei den meisten Typen. CaptchaFox registriert jeden Schlüssel für eine Liste erlaubter Domains und prüft den Host, bevor es irgendetwas ausstellt. Ein mit der falschen Seite gesendeter Schlüssel wird deshalb dauerhaft abgelehnt, nicht nur ab und zu. CapSkip meldet diesen Fall sofort, statt ihn zu wiederholen, denn ein erneuter Versuch kann nicht helfen. Senden Sie die Seite, auf der das Widget tatsächlich läuft, nicht ein Suchergebnis, eine Weiterleitung oder einen Kurzlink.
Websites, die das MAM-Paket laden
Wenn Schritt 1 ein Skript unter s.uicdn.com zutage gefördert hat, kopieren Sie dessen Paketpfad genau so, wie die Seite ihn schreibt, und übergeben Sie ihn als api_server. Der Token kommt dann mit dem Präfix MAM_ zurück, das die Website erwartet.
// Only for pages whose script tag loads the MAM build.
var result = await solver.CaptchaFoxAsync(
"YOUR_SITEKEY",
"https://example.com/signup",
new Dictionary<string, object?>
{
["api_server"] =
"https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/",
});Das Options-Dictionary nimmt api_server, proxy und useragent an, dazu proxytype und ein Timeout pro Aufruf in Sekunden. Die Option useragent existiert zur Kompatibilität mit anderen Diensten und wird nicht angewendet, denn CapSkip löst in einem echten Browser mit dessen eigener, stimmiger Identität. Ein unbekannter Options-Schlüssel oder ein leerer sitekey bzw. eine leere Seiten-URL löst eine ValidationException aus, bevor eine Anfrage gestellt wird.
Schritt 3: Mit dem User-Agent absenden, der den Token ausgestellt hat
An diesem Schritt entscheidet sich, ob ein Token akzeptiert oder abgelehnt wird. CaptchaFox bewertet den Browser, der das Widget ausführt, und der Token, den es ausstellt, gehört zu diesem Browser. HttpClient sendet überhaupt keinen User-Agent-Header, solange Sie keinen hinzufügen, und ein fest codierter Desktop-String ist genauso falsch. Übernehmen Sie also den User-Agent, den CapSkip zurückgegeben hat, in die Anfrage, die den Token trägt.
// http is your HttpClient; result comes from Step 2.
var request = new HttpRequestMessage(HttpMethod.Post, "https://example.com/signup")
{
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
["email"] = "[email protected]",
["cf-captcha-response"] = result.Token!,
}),
};
// The token is bound to the browser that produced it.
if (result.UserAgent is { } ua)
request.Headers.TryAddWithoutValidation("User-Agent", ua);
var response = await http.SendAsync(request);TryAddWithoutValidation ist Absicht. Das strengere UserAgent.ParseAdd prüft den String gegen die Header-Grammatik und wirft eine FormatException, wenn beide nicht zusammenpassen; dieser Wert muss aber Byte für Byte unverändert hinausgehen, egal was er enthält. Setzen Sie ihn pro Anfrage statt in den Standard-Headern des Clients, damit ein einziger HttpClient Tokens aus mehreren Lösungen tragen kann.
Zwei weitere Regeln ergeben sich daraus, wie CaptchaFox den Token aufseiten der Website prüft. In der eigenen Dokumentation von CaptchaFox heißt es, dass jeder Token nur einmal und nur innerhalb kurzer Zeit verifiziert werden kann. Lösen Sie also erst unmittelbar vor dem Absenden, senden Sie den Token nur einmal und lösen Sie neu, wenn das Formular liegen gelassen und später fortgesetzt wird. Und behandeln Sie den Token als opak: Er wird gegen die Sitzung geprüft, die ihn erzeugt hat, daher macht ihn jedes Kürzen oder Umkodieren unbrauchbar. Manche Integrationen senden ihn in einem JSON-Body statt als Formular-POST, senden Sie das Formular also einmal von Hand mit geöffneten DevTools ab und bilden Sie genau nach, was die Seite sendet.
Schritt 4: Proxys, Challenge-Typen und Timeouts
CaptchaFox bewertet neben dem Browser auch das Netzwerk, in dem ein Widget läuft. Eine einzelne Adresse genügt für Tests und gelegentliche Lösungen, aber wiederholte Lösungen von dort treiben diese Adresse erst zu interaktiven Challenges und dann zu Ablehnungen. Sobald Sie in nennenswertem Umfang lösen, konfigurieren Sie einen Proxy-Pool in CapSkip oder senden Sie einen Proxy pro Anfrage mit. Wenn Sie das tun, senden Sie das Formular auch über denselben Ausgang ab, damit Token und Formular aus einem Netzwerk ankommen. Die Verifizierung von CaptchaFox erlaubt es einer Website, die IP-Adresse des Besuchers zusammen mit dem Token zu übergeben, ein Grund mehr, beides auf einer Route zu halten.
// using System.Net; for WebProxy and NetworkCredential.
// Same exit address for the solve and the submit.
var result = await solver.CaptchaFoxAsync("YOUR_SITEKEY", pageUrl,
new Dictionary<string, object?>
{
["proxy"] = new Proxy("HTTP", "login:[email protected]:8080"),
});
var http = new HttpClient(new HttpClientHandler
{
Proxy = new WebProxy("http://1.2.3.4:8080")
{
Credentials = new NetworkCredential("login", "password"),
},
});Welche Challenge erscheint, können Sie nicht wählen. Bei den meisten Lösungen wird gar nichts angezeigt, weil die Indizien des Browsers von selbst ausreichen, und CapSkip erledigt auch den Slider, wenn CaptchaFox einen verlangt. Die beiden seltenen Ausweichvarianten werden nicht gelöst.
| Challenge-Typ | Wie oft | Gelöst |
|---|---|---|
| Unsichtbar, ohne Anzeige | Meistens | Ja |
| Schieberätsel | Manchmal | Ja |
| Bildauswahl | Selten | Nein, als unlösbar gemeldet |
| Audio | Selten | Nein, als unlösbar gemeldet |
Eine Meldung als unlösbar kommt schnell als ApiException an, ohne dass erst das Timeout abgewartet wird. Bei einem erneuten Versuch erscheint meist eine andere Challenge, werten Sie die Meldung also als Grund für einen neuen Versuch und nicht als Zeichen für einen kaputten Schlüssel. Das vollständige Beispiel unten wiederholt genau diesen Fall zweimal und sonst nichts, denn eine ApiException deckt auch Fehler ab, die ein erneuter Versuch nicht beheben kann, etwa einen falschen API-Schlüssel.
CaptchaFoxAsync pollt mit recaptchaTimeout, standardmäßig 300 Sekunden, denn es handelt sich um eine echte Browser-Sitzung, die länger dauert, wenn ein Slider angezeigt wird. CapSkip hat zusätzlich eigene Zeitlimits: Eine Aufgabe kann bis zu 250 Sekunden (Wait Timeout) auf einen der 10 CaptchaFox-Threads (Max. Threads) warten, und ein einzelner Versuch bekommt 150 Sekunden (Row Timeout). Ein Versuch, den ein Proxy ausbremst, scheitert deshalb zuerst in CapSkip, und ein längeres Timeout im SDK verschafft ihm keine zusätzliche Zeit. Steht Retries auf dem Standardwert 0 und ist ein Thread frei, erreicht Sie dieser Fehlschlag als ApiException, lange bevor die 300 Sekunden des SDK abgelaufen sind; steht die Aufgabe lange in der Warteschlange, kann das SDK sein Limit zuerst erreichen und stattdessen eine CapSkip.TimeoutException werfen.
Das Timeout des SDK müssen Sie nur dann verlängern, wenn Sie Retries (0-3) in den CaptchaFox-Einstellungen von CapSkip erhöhen, denn jede zusätzliche Wiederholung kann einen einzelnen Aufruf um bis zu ein weiteres Row Timeout verlängern. Übergeben Sie dann im Options-Dictionary ein längeres timeout, oder erhöhen Sie recaptchaTimeout im Konstruktor.
Den Löser woanders betreiben
Die Beispiele verwenden 127.0.0.1, weil das richtig ist, solange Ihr Code und CapSkip auf demselben Rechner liegen. Sobald die .NET-Anwendung irgendwo anders läuft, etwa in einem Container, auf einem Build-Agent, einem VPS oder einem App Service, zeigt Loopback auf den falschen Rechner, und der erste Lösungsversuch wirft eine NetworkException. Schalten Sie CapSkip in den Server-Modus, dann lauscht es auf Ihrer Netzwerkadresse oder öffentlichen IP, sodass jede dieser Umgebungen es über die API erreichen kann. Verwenden Sie eine statische öffentliche IP, wenn der Weg über das Internet führt, aktivieren Sie die Validierung des API-Schlüssels und beschränken Sie den Port mit einer Regel in der Windows Firewall auf die Adressen, die Sie erwarten. Es bleibt Ihr eigener Windows-Rechner, und abgerechnet wird pro Lösung weiterhin nichts.
Der Client liest Umgebungsvariablen nicht von selbst. Lesen Sie CAPSKIP_HOST und CAPSKIP_API_KEY in Ihrem eigenen Code aus und übergeben Sie die Werte an den Konstruktor, wie es das vollständige Beispiel tut, damit derselbe Build auf Ihrem Schreibtisch und auf einem Server läuft.
Vollständiges lauffähiges Beispiel
// dotnet add package CapSkip
using System.Text.RegularExpressions;
using CapSkip;
// Copied by hand from the script tag, for pages that load the MAM build.
const string MamPackage = "https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/";
var pageUrl = "https://example.com/signup";
var http = new HttpClient();
var solver = new CapSkipClient(
apiKey: Environment.GetEnvironmentVariable("CAPSKIP_API_KEY") ?? "capskip",
host: Environment.GetEnvironmentVariable("CAPSKIP_HOST") ?? "127.0.0.1",
port: 8080);
// Read the sitekey off the captchafox container, in either attribute order.
var html = await http.GetStringAsync(pageUrl);
var widget = Regex.Match(html,
"<[^>]*class=\"(?:[^\"]*\\s)?captchafox(?:\\s[^\"]*)?\"[^>]*>").Value;
var sitekey = Regex.Match(widget, "data-sitekey=\"([^\"]+)\"").Groups[1].Value;
// MAM pages may carry the key in the script src instead.
if (sitekey.Length == 0)
sitekey = Regex.Match(html,
"captchafox[^\"]*/api\\.js\\?key=([^\"&]+)").Groups[1].Value;
if (sitekey.Length == 0)
throw new InvalidOperationException("No sitekey in the HTML; find it in DevTools.");
// The same CDN serves other packages, so match the captchafox one.
var options = new Dictionary<string, object?>();
if (html.Contains("mampkg/@mamdev/core.frontend.libs.captchafox"))
options["api_server"] = MamPackage;
try
{
// Image-select and audio come back unsolvable; a retry redraws.
// Other API errors, such as a wrong key, are not worth repeating.
SolveResult? result = null;
for (var attempt = 1; result is null; attempt++)
{
try
{
result = await solver.CaptchaFoxAsync(sitekey, pageUrl, options);
}
catch (ApiException ex) when (attempt < 3 && ex.Message.Contains("UNSOLVABLE"))
{
Console.WriteLine($"attempt {attempt}: {ex.Message}");
}
}
var request = new HttpRequestMessage(HttpMethod.Post, pageUrl)
{
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
["email"] = "[email protected]",
["cf-captcha-response"] = result.Token!,
}),
};
if (result.UserAgent is { } ua)
request.Headers.TryAddWithoutValidation("User-Agent", ua);
// Post wherever the form's action attribute points.
var response = await http.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode}, UA sent: {result.UserAgent is not null}");
}
catch (CapSkip.ValidationException ex)
{
// An option the method does not take.
Console.WriteLine($"not sent: {ex.Message}");
}
catch (CapSkip.TimeoutException)
{
Console.WriteLine("gave up waiting; recaptchaTimeout is 300 seconds");
}
catch (CapSkipError ex)
{
// The third unsolvable result, a refused key, or CapSkip unreachable.
Console.WriteLine($"gave up: {ex.Message}");
}Die Regex begrenzt den Klassennamen durch Leerzeichen, damit ein Element wie captchafox-wrapper nicht versehentlich passt, und sie erwartet Attribute in doppelten Anführungszeichen, so wie das eigene Snippet von CaptchaFox sie schreibt. Wenn das Lösen bei jedem Durchlauf sofort scheitert, prüfen Sie zuerst die Seiten-URL: Ein Schlüssel, der außerhalb seiner registrierten Domains verwendet wird, scheitert jedes Mal auf dieselbe Weise. Findet die Regex nichts, rendert die Seite das Widget per Skript, und der Schlüssel steht im render-Aufruf oder im Network-Tab, wie in Schritt 1 beschrieben. Den rohen Endpunkt hinter dieser Methode finden Sie in der API-Referenz, und alle anderen Methoden, die das Paket bereitstellt, stehen auf der C#-Captcha-Solver-Seite.
Häufige Fehler und was sie bedeuten
| Was Sie sehen | Ursache | Beheben |
|---|---|---|
| Die Website lehnt einen Token ab, den CapSkip als gelöst zurückgegeben hat | Die Anfrage ging mit einem anderen User-Agent hinaus als dem, mit dem der Token ausgestellt wurde | Senden Sie result.UserAgent Byte für Byte mit der Absende-Anfrage |
| Abgelehnt, obwohl der User-Agent stimmt | Die Website lädt das MAM-Paket, und das Lösen hat das Standard-Widget verwendet, oder umgekehrt | Lesen Sie das Script-Tag und setzen Sie api_server passend dazu |
| Ein mit MAM_ beginnender Token, den die Website ablehnt | api_server wurde für eine Seite gesetzt, die das Standard-Widget lädt | Entfernen Sie die Option und verwenden Sie den Standard |
| Eine ApiException sofort und jedes Mal, bei einem bestimmten Schlüssel | Die Seiten-URL liegt außerhalb der Domains, für die der Schlüssel registriert ist | Senden Sie die Seite, auf der das Widget läuft, keine Weiterleitung und kein Suchergebnis |
| Gelegentlich eine ApiException, laut der das Captcha unlösbar ist | CaptchaFox hat eine Bildauswahl- oder Audio-Challenge ausgespielt | Senden Sie erneut; beim nächsten Versuch kommt meist eine andere |
| Mit fortschreitendem Durchlauf erst mehr Challenges, dann Ablehnungen | Jedes Lösen kommt von einer einzigen Adresse, und CaptchaFox bewertet das Netzwerk | Verteilen Sie die Lösungen auf einen Proxy-Pool und senden Sie über denselben Ausgang ab |
| Ein Token, der einmal funktioniert hat, scheitert beim zweiten Absenden | Jeder Token lässt sich nur einmal verifizieren und läuft schnell ab | Lösen Sie für jedes Absenden neu und senden Sie sofort ab |
| Eine ValidationException, bevor überhaupt etwas gesendet wird | Der sitekey oder die Seiten-URL war leer, oder die Optionen enthielten einen Schlüssel, den die Methode nicht annimmt | Prüfen Sie, ob die Regex das Element gefunden hat, und entfernen Sie die Option, die die Meldung nennt |
| Eine NetworkException beim ersten Lösen | CapSkip läuft nicht, oder Host und Port sind falsch | Starten Sie CapSkip und prüfen Sie dann, ob es im Local-Modus oder im Server-Modus laufen soll |
| Der Build scheitert an einer mehrdeutigen TimeoutException | CapSkip und System definieren beide diesen Kurznamen | Schreiben Sie CapSkip.TimeoutException vollständig aus oder fangen Sie CapSkipError |
FAQ
Warum braucht CaptchaFox den User-Agent, wenn die meisten Captcha-Typen ihn nicht brauchen?
Weil es den Browser bewertet, statt einen Menschen etwas lesen zu lassen. Der Token ist das Urteil des Dienstes über einen ganz bestimmten Browser, er ergibt also nur Sinn, wenn er von genau diesem Browser zurückkommt. Challenge-Seiten von Cloudflare Turnstile funktionieren genauso, und wie das in C# aussieht, zeigt der Leitfaden zu Turnstile-Challenge-Seiten. CapSkip gibt den User-Agent für genau diese beiden Typen zurück, ein verlässlicher Hinweis darauf, wo er eine Rolle spielt.
Kann eine .NET-Anwendung auf einer gehosteten Plattform den Solver erreichen?
Ja. Schalten Sie CapSkip in den Verbindungseinstellungen in den Server-Modus, damit er auf einer Netzwerkadresse statt auf Loopback lauscht, lesen Sie diese Adresse in Ihrem Code aus CAPSKIP_HOST und übergeben Sie sie an den Client. Ein Container-Host, ein VPS, ein CI-Agent und ein Managed-App-Service verbinden sich alle auf dieselbe Weise, über dieselbe HTTP-API. Verwenden Sie eine statische öffentliche IP mit einer Firewall-Regel, wenn der Weg über das Internet führt. Der Solver bleibt auf Hardware, die Ihnen gehört, an der Lizenz und der Zahl der Lösungen ändert sich also nichts.
Worin unterscheidet sich das vom Lösen von Friendly Captcha in C#?
Beide kamen mit CapSkip 1.4.0, beide verwenden das Timeout von 300 Sekunden, und damit hören die Gemeinsamkeiten im Wesentlichen auf. Bei Friendly Captcha müssen Sie entscheiden, welche Protokollversion die Website verwendet, und der Token ist nicht an einen User-Agent gebunden. Bei CaptchaFox geht es darum, welche Widget-Quelle die Website lädt und welcher User-Agent den Token trägt. Wie das bei Friendly Captcha aussieht, zeigt der C#-Leitfaden zu Friendly Captcha.
Kann ich mehrere CaptchaFox-Tokens gleichzeitig lösen?
Ja. Der Client ist asynchron, ein Task.WhenAll über mehrere CaptchaFoxAsync-Aufrufe führt sie also parallel aus. CapSkip führt standardmäßig 10 CaptchaFox-Lösevorgänge gleichzeitig aus (Max. Threads in den CaptchaFox-Einstellungen), und die übrigen warten bis zum Wait Timeout von 250 Sekunden auf einen freien Thread. Ein Batch von fünfzig Aufrufen ist bei normalen Lösezeiten also kein Problem; bei größeren Batches erhöhen Sie Max. Threads oder senden die Aufrufe in kleineren Gruppen. Zwei weitere Dinge sollten Sie einplanen: Jeder Token gehört zu seinem eigenen User-Agent, halten Sie das Ergebnis also mit der Anfrage zusammen, zu der es gehört. Und Nebenläufigkeit von einer einzigen Adresse aus lässt die Challenge-Rate früher steigen, fügen Sie also Proxys hinzu, wenn Sie mehr parallele Lösungen hinzufügen.
Die Kurzfassung
Um CaptchaFox in C# zu lösen, lesen Sie den sitekey aus dem Container mit der Klasse captchafox, aus dem render-Aufruf oder aus dem Network-Tab und prüfen Sie, welches Skript das Widget lädt. Rufen Sie CaptchaFoxAsync mit dem sitekey und der echten Seiten-URL auf und fügen Sie api_server nur für das MAM-Paket hinzu. Senden Sie result.Token in cf-captcha-response mit result.UserAgent ab, einmal und sofort, und versuchen Sie es erneut, wenn eine unlösbare Challenge zurückkommt. Fügen Sie Proxys hinzu, wenn das Volumen wächst, und wechseln Sie in den Server-Modus, sobald der aufrufende Code den Rechner des Solvers verlässt.
- Wie der Typ funktioniert und was der Solver abdeckt: die Solver-Seite für CaptchaFox.
- Alle anderen Methoden, die das .NET-Paket bereitstellt: die C#- und .NET-Solver-Seite.
Noch eine letzte Sache, die bestimmt, wie Sie Wiederholungen angehen. Wenn ein Lösen an einer Bildauswahl-Challenge scheitert, ist die Abhilfe einfach ein weiterer Versuch, und da ein unbegrenzter Captcha-Löser auf Ihrem eigenen Rechner läuft, kostet dieser erneute Versuch ein paar Sekunden statt einer weiteren abgerechneten Lösung.
