So lösen Sie Capy Puzzle in C# und senden alle drei Felder ab

Um Capy Puzzle in C# zu lösen, lesen Sie den PUZZLE_-Schlüssel der Website von der Seite ab, rufen CapyAsync mit diesem Schlüssel und der Seiten-URL auf und senden dann die drei zurückgegebenen Werte in den Formularfeldern capy_captchakey, capy_challengekey und capy_answer ab, zusammen und sofort. Das ist die ganze Integration, und der Teil, über den viele stolpern, ist die Form der Antwort. Die meisten Typen, die Sie vielleicht schon gelöst haben, liefern einen einzigen Token. Capy liefert drei Werte, die nur als Satz funktionieren, und einer davon läuft schnell ab. CapSkip hat Capy Puzzle in Version 1.4.0 hinzugefügt. Dieser Leitfaden behandelt den Schlüssel, den Aufruf, die zweisekündige Haltezeit, die absichtlich da ist, und das Absenden.
Was Sie brauchen
- CapSkip 1.4.0 oder neuer auf einem Windows-Rechner. Die Unterstützung für Capy kam mit diesem Release, zusammen mit CaptchaFox und Friendly Captcha.
- Version 1.3.0 oder neuer des CapSkip .NET-Pakets, also das Release, das CapyAsync 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 Capy-Schlüssel, der mit PUZZLE_ beginnt, und die URL der Seite, auf der das Widget läuft. Schritt 1 zeigt, wo Sie den Schlüssel finden, und an derselben Stelle sehen Sie auch, ob Sie einen dritten, optionalen Wert brauchen.
- 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 PUZZLE_-Schlüssel und den Capy-Host finden
Alles, was Sie brauchen, um Capy Puzzle in C# zu lösen, stammt von der Zielseite. Der Schlüssel ist öffentlich und für jeden Besucher identisch, und er steht an zwei Stellen. Der Parameter k in der URL des Widget-Skripts steht im HTML, das der Server sendet, und genau dieses HTML sehen sowohl der Seitenquelltext als auch HttpClient. Sobald das Widget in einem Browser gelaufen ist, steht der Schlüssel außerdem in einem versteckten Eingabefeld capy_captchakey, das das Widget in das Formular schreibt, und dort zeigt ihn das Elements-Panel in den DevTools an.
<!-- In the HTML the server sends: the k parameter of the widget script --> <script src="https://jp.api.capy.me/puzzle/get_js/?k=PUZZLE_YOUR_KEY"></script> <!-- Written into the form by the widget once it has run (DevTools only) --> <input type="hidden" name="capy_captchakey" value="PUZZLE_YOUR_KEY" />
Kopieren Sie den Schlüssel exakt, einschließlich Präfix. Wenn Sie sich schon das Script-Tag ansehen, notieren Sie auch seinen Host. Alles in der Skript-URL vor /puzzle/get_js/ ist die Capy API, hinter der der Schlüssel liegt, und CapSkip nennt sie api_server. Standardwert ist https://jp.api.capy.me, wo der Live-Dienst läuft. Sie übergeben den Wert also nur, wenn eine Seite das Widget von woanders lädt.
Eine Falle kommt hier aus der Dokumentation anderer Solver. Mehrere davon zeigen noch api.capy.me ohne das regionale Präfix, und dieser Host wird nicht mehr aufgelöst. Wenn Sie ihn aus einem alten Beispiel kopiert haben, löschen Sie die Option und lassen Sie CapSkip seinen Standardwert verwenden.
Schritt 2: Der Aufruf von CapyAsync
Die Methode nimmt den Schlüssel, die Seiten-URL und ein optionales Options-Dictionary entgegen. Für eine Seite auf dem Standard-Host brauchen Sie nur die ersten beiden.
// dotnet add package CapSkip
using CapSkip;
var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);
// The PUZZLE_ key, and the page the widget runs on.
var result = await solver.CapyAsync(
"PUZZLE_YOUR_KEY",
"https://example.com/login");
Console.WriteLine(result.CaptchaKey); // capy_captchakey
Console.WriteLine(result.ChallengeKey); // capy_challengekey
Console.WriteLine(result.Answer); // capy_answerLesen Sie die drei benannten Eigenschaften. Die Eigenschaft Code enthält dieselbe Antwort als rohes JSON, was fürs Logging nützlich ist, und RespKey kommt leer zurück, weil es nur zur Kompatibilität mit anderen Diensten existiert. Answer ist eine lange Zeichenfolge, die etwa wie 0xax8ex0xax84x beginnt. Das ist der Ziehpfad, den das Widget beim Verschieben des Teils aufgezeichnet hätte, und keine Koordinate.
Das Options-Dictionary nimmt api_server, proxy, proxytype und useragent an, dazu ein Timeout pro Aufruf in Sekunden. Der User-Agent wird, falls Sie einen setzen, bei der einzigen Anfrage mitgesendet, die CapSkip zum Abrufen des Puzzles stellt, und Sie werden ihn selten brauchen. Es gibt auch eine Option version, aber nur puzzle wird akzeptiert: Die andere Familie von Capy, avatar, ist eine andere Challenge hinter einem anderen Endpunkt, daher lehnt das SDK sie mit einer ValidationException ab, statt eine Antwort zu liefern, die die Website zurückweisen würde. Ein unbekannter Optionsname, ein leerer PUZZLE_-Schlüssel, eine leere Seiten-URL oder ein nicht unterstützter proxytype löst dieselbe Exception aus, bevor irgendetwas gesendet wird. Eine Option, deren Wert null ist, wird einfach verworfen, so können Sie einen optionalen Host ohne if-Anweisung übergeben.
// The script tag's host. jp.api.capy.me is the default, so pass
// this only when the page loads the widget from somewhere else.
var result = await solver.CapyAsync(
"PUZZLE_YOUR_KEY",
"https://example.com/login",
new Dictionary<string, object?>
{
["api_server"] = "https://jp.api.capy.me/",
});Warum ein Capy-Lösevorgang etwa zwei Sekunden dauert
Die Erkennung selbst ist schnell. CapSkip ruft das Puzzle-Bild ab, findet die Lücke mit etwas Pixel-Mathematik und baut den Ziehpfad, alles ohne Browser und ohne Modell. Dann wartet es, und zwar absichtlich.
Capy misst die Zeit zwischen der Ausgabe eines Puzzles und dem Eintreffen der Antwort und lehnt alles ab, was schneller ankommt, als ein Mensch das Teil hätte ziehen können. Die eigenen Messungen von CapSkip gegen Capy setzen die Untergrenze bei etwa einer Sekunde an: Eine Antwort nach einer halben Sekunde wurde abgelehnt, Antworten nach einer bis vier Sekunden, der längsten getesteten Zeit, wurden akzeptiert. Die Ablehnung verwendet dieselbe Meldung wie eine falsche Antwort, daher sieht eine korrekte, aber zu schnell gelieferte Lösung genau aus wie ein kaputter Solver. CapSkip hält deshalb jedes Capy-Ergebnis zurück, bis seit dem Abruf des Puzzles zwei Sekunden vergangen sind. Das Warten ist ein Sleep, es kostet also Latenz und keine CPU, und weil CapyAsync für Sie pollt, sehen Sie nur einen Aufruf, der ein paar Sekunden dauert.
Warum ein paar und nicht zwei: Die Abfragen des SDK beginnen im Abstand einer Viertelsekunde und werden dann seltener, wobei sich der Abstand bis zu seinem pollingInterval verdoppelt, standardmäßig 5 Sekunden. Mit den Standardeinstellungen wird die Antwort meist bei etwa vier Sekunden abgeholt. Wenn ein Client überwiegend Capy löst, erzeugen Sie ihn mit pollingInterval: 0.5, dann kehrt der Aufruf deutlich näher an zwei Sekunden zurück.
Zwei praktische Folgen. Bauen Sie vor dem Absenden keine eigene Verzögerung ein, denn die Haltezeit hat das bereits abgedeckt. Und versuchen Sie nicht, die Zeit einzusparen, denn genau die Haltezeit sorgt dafür, dass die Antwort durchgeht.
Schritt 3: Alle drei Werte in einer Anfrage absenden
Die drei Werte gehören in die Felder, die das Widget selbst in das Formular geschrieben hätte. Senden Sie sie zusammen, in derselben Anfrage wie den Rest des Formulars.
// http is your HttpClient; result comes from Step 2.
var form = new FormUrlEncodedContent(new Dictionary<string, string>
{
["username"] = "someone",
["capy_captchakey"] = result.CaptchaKey!,
["capy_challengekey"] = result.ChallengeKey!,
["capy_answer"] = result.Answer!,
});
var response = await http.PostAsync("https://example.com/login", form);Senden Sie die Antwort genau so ab, wie sie zurückkam. Sie ist der Ziehpfad, und das Backend der Website prüft sie gegen das ausgegebene Puzzle, daher macht jedes Kürzen, jedes Neuzusammensetzen aus ihren Teilen und jedes Aufräumen sie ungültig. Sie für den Formular-Body per Prozentkodierung zu kodieren ist in Ordnung, denn das gehört zum Transport, und der Server dekodiert sie zuerst.
Senden Sie dann zügig ab. CapSkip erzeugt für jeden Lösevorgang einen frischen Challenge-Key, und das Puzzle ist an ihn gebunden, der Challenge-Key ist also nur einmal verwendbar und kurzlebig. Eine Lösung deckt ein Absenden ab. Wird das Formular liegen gelassen und später fortgesetzt, lösen Sie neu, statt auf die aufbewahrten Werte zurückzugreifen.
Bilden Sie nach, was das echte Formular sendet. Die meisten Seiten tragen zusätzlich eigene versteckte Felder, etwa einen Anti-Forgery-Token, und manche senden per Skript mit einem JSON-Body statt als Formular-POST. Viele lehnen außerdem eine Anfrage ohne User-Agent-Header ab, und HttpClient sendet keinen, solange Sie keinen hinzufügen. Senden Sie einmal von Hand mit geöffneten DevTools ab, kopieren Sie die Anfrage und setzen Sie die drei Capy-Werte dort ein, wo die Seite sie einsetzt.
Schritt 4: Fehlschläge, Wiederholungen und viele Lösungen gleichzeitig
Wenn Sie Capy Puzzle in C# in nennenswertem Umfang lösen, werden einige Lösungsversuche scheitern. Ein gescheiterter Capy-Lösevorgang kommt als ApiException an, und über das SDK liest er sich in beiden relevanten Fällen als unlösbar. Die beiden Fälle verlangen gegensätzliche Reaktionen, und unterscheiden lassen sie sich daran, wie oft sie auftreten. Beide scheitern früh, vor der zweisekündigen Haltezeit, denn CapSkip hält nur eine gelöste Antwort zurück.
| Was passiert ist | Wie es sich zeigt | Was zu tun ist |
|---|---|---|
| Die Lücke wurde nicht gefunden | Gelegentlich, und der nächste Versuch gelingt meist | Versuchen Sie es erneut. Jeder Versuch bekommt ein ganz neues Puzzle auf einem anderen Foto, ein erneuter Versuch ist also wirklich unabhängig |
| Die Capy API hat den Schlüssel abgelehnt | Bei jedem Versuch mit genau diesem Schlüssel, und die Capy-Aufgabenliste in CapSkip zeigt „Invalid captcha key“ | Prüfen Sie den Schlüssel und api_server. CapSkip wiederholt einen abgelehnten Schlüssel nicht, weil er genauso abgelehnt würde |
Fehltreffer sind selten, ein erneuter Versuch deckt also fast alles ab. Sie können in Ihrem eigenen Code wiederholen, wie es das vollständige Beispiel tut, oder Retries im Capy-Bereich der CapSkip-Einstellungen setzen. Der Wert steht standardmäßig auf 0 und erlaubt bis zu drei Wiederholungen pro Aufgabe.
CapyAsync pollt mit defaultTimeout, 120 Sekunden, denn ein Capy-Lösevorgang besteht aus einem Abruf und etwas Arithmetik und nicht aus einer Browser-Sitzung. Das deckt einen normalen Lösevorgang um ein Vielfaches ab. Erhöhen Sie den Wert im Konstruktor, wenn Sie Retries hochsetzen oder weit mehr Lösungen in die Warteschlange stellen, als CapSkip gleichzeitig ausführt. Die Einstellung Max. Threads im Capy-Bereich steht standardmäßig auf 10, was Sie erhöhen können, und zusätzliche Aufgaben warten auf einen freien Thread.
Wenn Sie viele Lösungen parallel ausführen, halten Sie jedes Lösen mit seinem Absenden zusammen. Wer hundert CapyAsync-Aufrufe mit Task.WhenAll startet und die Ergebnisse erst danach absendet, lässt die frühesten Challenge-Keys altern, während die letzten Lösungen noch laufen. Packen Sie Lösen und Absenden zusammen in einen Task und begrenzen Sie die Zahl der gleichzeitig laufenden Tasks mit einem SemaphoreSlim auf die Thread-Zahl. Und bei hohem Volumen fügen Sie Proxys hinzu. Jeder Lösevorgang holt ein neues Puzzle von der Capy API, und ein stetiger Strom solcher Abrufe von einer einzigen Adresse ist genau das Muster, für das es Rate Limiting gibt. Konfigurieren Sie einen Proxy-Pool in CapSkip oder übergeben Sie einen Proxy pro Anfrage. Er betrifft nur den Abruf des Puzzles, und das ist die einzige Anfrage, die ein Capy-Lösevorgang stellt.
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;
var pageUrl = "https://example.com/login";
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,
// Capy answers after a two second hold; poll often enough to catch it.
pollingInterval: 0.5);
// The widget script's k parameter. The capy_captchakey input only
// exists once the widget has run in a browser.
var html = await http.GetStringAsync(pageUrl);
var key = Regex.Match(html, "PUZZLE_[A-Za-z0-9_-]+").Value;
if (key.Length == 0)
throw new InvalidOperationException("No PUZZLE_ key in the HTML; check DevTools.");
// The script URL up to /puzzle/get_js/, when there is one; a null value is dropped.
var host = Regex.Match(html, @"(https://[^""'\s<>]+?)/puzzle/get_js/").Groups[1].Value;
var options = new Dictionary<string, object?>
{
["api_server"] = host.Length > 0 ? host : null,
};
try
{
// A missed hole comes back unsolvable; a retry draws a new puzzle.
SolveResult? result = null;
for (var attempt = 1; result is null; attempt++)
{
try
{
result = await solver.CapyAsync(key, pageUrl, options);
}
catch (ApiException ex) when (attempt < 3 && ex.Message.Contains("UNSOLVABLE"))
{
Console.WriteLine($"attempt {attempt}: {ex.Message}");
}
}
// All three together, straight away: the challenge key is single-use.
var form = new FormUrlEncodedContent(new Dictionary<string, string>
{
["username"] = "someone",
["capy_captchakey"] = result.CaptchaKey!,
["capy_challengekey"] = result.ChallengeKey!,
["capy_answer"] = result.Answer!,
});
// Post wherever the form's action attribute points.
var response = await http.PostAsync(pageUrl, form);
Console.WriteLine((int)response.StatusCode);
}
catch (CapSkip.ValidationException ex)
{
// An empty key or URL, avatar as the version, or an unknown option.
Console.WriteLine($"not sent: {ex.Message}");
}
catch (CapSkip.TimeoutException)
{
Console.WriteLine("gave up waiting; defaultTimeout is 120 seconds");
}
catch (CapSkipError ex)
{
// The third miss, a refused key, or CapSkip unreachable.
Console.WriteLine($"gave up: {ex.Message}");
}Die Schlüssel-Regex sucht das Präfix PUZZLE_ irgendwo im HTML und findet den Schlüssel daher in der URL des Widget-Skripts, ohne das Tag zu parsen. Das Eingabefeld capy_captchakey steht im heruntergeladenen HTML überhaupt nicht, weil das Widget es nur dann schreibt, wenn es in einem Browser läuft. Die Host-Regex übernimmt aus einer https-Skript-URL alles vor /puzzle/get_js/, einschließlich Pfad, und findet sie nichts, wird der null-Wert verworfen und CapSkip nimmt seinen Standard. Scheitern alle drei Versuche, sehen Sie sich zuerst den Schlüssel an, denn ein abgelehnter Schlüssel scheitert jedes Mal gleich, während ein Fehltreffer fast nie dreimal hintereinander passiert. Baut die Seite das Widget aus einem gebündelten Skript auf und passt keine der beiden Regexes, öffnen Sie den Network-Tab und kopieren Sie beide Werte aus der eigenen Anfrage des Widgets. Den rohen Endpunkt hinter dieser Methode finden Sie in der API-Referenz, und alle anderen Captcha-Typen, die das Paket löst, stehen auf der C#-Captcha-Solver-Seite.
Häufige Fehler und was sie bedeuten
| Was Sie sehen | Ursache | Beheben |
|---|---|---|
| Die Website lehnt das Absenden ab, obwohl CapSkip alle drei Werte geliefert hat | Die Antwort wurde verändert, oder nur ein oder zwei der Werte sind im Formular angekommen | Senden Sie result.Answer unverändert zusammen mit den anderen beiden Werten in einer Anfrage |
| Ein Absenden, das einmal funktioniert hat, scheitert beim zweiten Versuch | Der Challenge-Key ist nur einmal verwendbar und kurzlebig | Lösen Sie für jedes Absenden neu und senden Sie sofort ab |
| Eine ApiException bei jedem Versuch, bei einem bestimmten Schlüssel | Die Capy API hat den Schlüssel abgelehnt, oder api_server zeigt auf den falschen Host | Kopieren Sie den Schlüssel erneut, einschließlich Präfix, und prüfen Sie den Host des Script-Tags |
| Gelegentlich eine ApiException, laut der das Captcha unlösbar ist | CapSkip konnte die Lücke in diesem Puzzle nicht finden | Versuchen Sie es erneut; der nächste Versuch bekommt ein anderes Puzzle |
| Jedes Lösen scheitert, nachdem Sie ein Beispiel von einem anderen Dienst kopiert haben | Das Beispiel setzt api_server auf api.capy.me, das nicht mehr aufgelöst wird | Entfernen Sie die Option und verwenden Sie den Standard-Host |
| Eine ValidationException, bevor überhaupt etwas gesendet wird | Ein leerer Schlüssel oder eine leere Seiten-URL, avatar als Version oder eine Option, die die Methode nicht annimmt | Prüfen Sie, ob die Regex den Schlüssel gefunden hat, und entfernen Sie die Option, die die Meldung nennt |
| Mehr Fehlschläge, je länger ein Durchlauf dauert | Jedes Puzzle wird von einer einzigen Adresse abgerufen | Verteilen Sie die Lösungen auf einen in CapSkip konfigurierten Proxy-Pool |
| Eine TimeoutException unter hoher paralleler Last | Mehr Aufgaben in der Warteschlange, als Max. Threads innerhalb von 120 Sekunden abarbeiten kann | Begrenzen Sie die Nebenläufigkeit mit einem SemaphoreSlim oder erhöhen Sie defaultTimeout |
| 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 liefert eine Capy-Lösung drei Werte statt eines Tokens?
Weil das Capy-Formular genau das sendet. Zu keinem Zeitpunkt stellt ein Server einen Token aus. Das Widget selbst erzeugt einen Challenge-Key, ruft das dazugehörige Puzzle ab und zeichnet die Ziehbewegung auf, und die Website schickt den Challenge-Key und die Antwort dann mit ihrem privaten Schlüssel zur Prüfung an Capy. CapSkip übernimmt die Rolle des Widgets und liefert daher das, was das Widget in das Formular geschrieben hätte.
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 GeeTest v3 in C#?
Beides sind Schiebepuzzles, die mehrere Werte liefern, die zusammen gesendet werden, aber sie beginnen an unterschiedlichen Stellen. GeeTest v3 beginnt mit einer Challenge, die die Website ausstellt und die Sie unmittelbar vor dem Lösen abrufen müssen, weil sie nach etwa einer Minute abläuft. Capy beginnt mit nichts als dem Schlüssel, denn der Challenge-Key wird erst beim Lösen erzeugt. Es gibt also vorher nichts abzurufen, und die einzige Uhr, die zählt, läuft nach dem Lösen. Wie das bei GeeTest aussieht, zeigt der C#-Leitfaden zu GeeTest v3.
Muss ich beim Absenden einen User-Agent mitsenden, wie bei CaptchaFox?
Nein. Ein CaptchaFox-Token ist an den Browser gebunden, der ihn ausgestellt hat, daher muss das Absenden den User-Agent dieses Browsers tragen, wie der C#-Leitfaden zu CaptchaFox erklärt. Eine Capy-Antwort ist überhaupt nicht an einen Browser gebunden. CapSkip gibt dafür keinen User-Agent zurück, und der optionale User-Agent, den Sie übergeben können, verändert nur die Anfrage, die das Puzzle abruft.
Die Kurzfassung
Um Capy Puzzle in C# zu lösen, kopieren Sie den PUZZLE_-Schlüssel aus der URL des Widget-Skripts oder aus dem Eingabefeld capy_captchakey und notieren Sie den Host des Skripts, falls es nicht der Standard ist. Rufen Sie CapyAsync mit dem Schlüssel und der echten Seiten-URL auf und lassen Sie ihm seine paar Sekunden. Senden Sie CaptchaKey, ChallengeKey und Answer in capy_captchakey, capy_challengekey und capy_answer ab, unverändert, zusammen und sofort, und lösen Sie für jedes Absenden neu. Wiederholen Sie den gelegentlichen Fehltreffer, 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 Capy-Puzzle-Solver-Seite.
- Alle anderen Captcha-Typen, die das .NET-Paket löst: die C#- und .NET-Solver-Seite.
Noch eine letzte Sache zu diesem erneuten Versuch. Weil jeder Versuch ein anderes Puzzle bekommt, ist ein neuer Versuch die richtige Abhilfe bei einem Fehltreffer, und da ein lokaler Captcha-Löser auf Ihrem eigenen Rechner läuft, kostet ein zweiter Versuch ein paar Sekunden statt einer weiteren abgerechneten Lösung.
