API-Dokumentation
Referenz für verfügbare Endpunkte, Anfrageformate, Parameter und Beispielantworten zur Integration der API in Ihre Anwendungen.
Diese Dokumentation richtet sich an Entwickler, die CapSkip direkt in ihre eigenen Skripte, Anwendungen oder Automatisierungssysteme integrieren möchten. Nutzer von Drittanbieter-Software sollten für Einrichtungsanweisungen dem Abschnitt Tutorials folgen.
CapSkip emuliert die APIs weit verbreiteter Captcha-Löse-Dienste und kann sich so mit kompatibler Software von Drittanbietern verbinden, ohne dass Änderungen erforderlich sind. Die Integration erfordert in der Regel nur, dass CapSkip läuft.
Die Dokumentation erklärt, wie Sie Anfragen senden und Ergebnisse abrufen. CapSkip unterstützt mehrere API-Familien, darunter die API im 2Captcha-Stil (in.php / res.php), die JSON-API createTask / getTaskResult, die von AntiCaptcha, CapMonster und CapSolver verwendet wird, sowie die DeathByCaptcha-REST-API. Dienste innerhalb derselben Familie teilen sich dieselben Endpunkte sowie dasselbe Anfrage- und Antwortformat. Nur die Basis-URL (Host und Port) unterscheidet sich je nach Dienst.
| API-Familie | Dienste |
|---|---|
| 2captcha-Stil | 2captcha.com, rucaptcha.com, solvecaptcha.com, captchas.io |
| JSON (createTask / getTaskResult) | anti-captcha.com, capmonster.cloud, capsolver.com |
| DeathByCaptcha | deathbycaptcha.com |
Bild-Captcha
Ein normales Captcha ist ein Bild, das verzerrten, aber für Menschen lesbaren Text enthält. Um es zu lösen, muss der Nutzer den im Bild gezeigten Text eintippen.
Um ein normales Captcha zu lösen, übermitteln Sie das Bild per HTTP-POST-Anfrage an den API-Endpunkt. Senden Sie die Anfrage direkt an Ihre CapSkip-Instanz unter Verwendung der konfigurierten lokalen Adresse und des Ports, zum Beispiel: http://127.0.0.1:PORT/in.php
CapSkip akzeptiert Bilder im Format multipart/form-data oder Base64-kodiert.
Multipart-Beispielformular
<form method="post" action="http://127.0.0.1:PORT/in.php" enctype="multipart/form-data"> <input type="hidden" name="method" value="post"> Your key: <input type="text" name="key" value="YOUR_APIKEY"> The CAPTCHA file: <input type="file" name="file"> <input type="submit" value="Upload and get the ID"> </form>
YOUR_APIKEY steht für Ihren API-Key, wenn die API-Key-Validierung in CapSkip aktiviert ist. Wenn die API-Key-Validierung deaktiviert ist, wird jeder Zeichenfolgenwert akzeptiert.
Base64-Beispielformular
<form method="post" action="http://127.0.0.1:PORT/in.php"> <input type="hidden" name="method" value="base64"> Your key: <input type="text" name="key" value="YOUR_APIKEY"> The CAPTCHA file body in base64 format: <textarea name="body">BASE64_FILE</textarea> <input type="submit" value="Upload and get the ID"> </form>
YOUR_APIKEY steht für Ihren API-Key, wenn die API-Key-Validierung in CapSkip aktiviert ist. Wenn die API-Key-Validierung deaktiviert ist, wird jeder Zeichenfolgenwert akzeptiert.
BASE64_FILE sind die Base64-codierten Bilddaten.
Liste der POST-Request-Parameter
| POST-Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja | Ihr CapSkip-API-Schlüssel. |
| method | String | Ja |
post: das Bild mit multipart/form-data übermitteln base64: senden Sie das Bild als Base64-kodierte Zeichenkette |
| file | Datei | Ja* |
Captcha-Bilddatei. * Erforderlich, wenn method=post. |
| body | String | Ja* |
Base64-kodierte Captcha-Bilddaten. * Erforderlich, wenn method=base64. |
| json | Integer Standard: 0 | Nein |
0: Antwort wird als Klartext zurückgegeben 1: Antwort wird im JSON-Format zurückgegeben |
Captcha absenden (Multipart-Datei-Upload):
curl -X POST -F "key=YOUR_API_KEY" -F "method=post" -F "[email protected]" http://127.0.0.1:8080/in.php
Captcha absenden (Base64-kodiert):
curl -X POST -d "key=YOUR_API_KEY&method=base64&body=BASE64_IMAGE_DATA" http://127.0.0.1:8080/in.php
Nach dem Absenden der Anfrage gibt CapSkip, wenn alles korrekt ist, die Captcha-ID als Klartext zurück: OK|12345
Wenn der json=1 Parameter verwendet wird, wird die Antwort im JSON-Format zurückgegeben:
{
"status":1,
"request":"12345"
}Warten Sie 1 Sekunde und senden Sie dann eine HTTP-GET-Anfrage an den Ergebnis-Endpunkt (/res.php) mit der zurückgegebenen Captcha-ID.
Wenn das Captcha gelöst wurde, gibt CapSkip das Ergebnis als Klartext zurück: OK|TEXT
Wenn json=1 angegeben wurde, lautet die Antwort:
{
"status":1,
"request":"TEXT"
}Wenn das Captcha noch nicht gelöst ist, gibt CapSkip zurück: CAPCHA_NOT_READY
In diesem Fall warten Sie 1 Sekunde und wiederholen die Anfrage, bis ein Endergebnis eingeht. Wenn CapSkip einen leeren Antworttext zurückgibt, wurde das Ergebnis bereits abgerufen oder die ID existiert nicht. Jedes Ergebnis kann nur einmal gelesen werden.
Liste der GET-Anfrageparameter
| GET-Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja | Ihr CapSkip-API-Schlüssel. |
| action | String | Ja | get: ruft die Antwort für das übermittelte Captcha ab. |
| id | Integer | Ja |
Die Captcha-ID, zurückgegeben von in.php. |
| json | Integer Standard: 0 | Nein |
0: Antwort wird als Klartext zurückgegeben 1: Antwort wird im JSON-Format zurückgegeben |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
reCAPTCHA V2
reCAPTCHA v2, auch bekannt als das “I'm not a robot”-reCAPTCHA, ist ein weit verbreiteter Captcha-Typ. Der Besucher setzt ein Häkchen, und Google lässt ihn entweder sofort durch oder verlangt, passende Bilder auszuwählen, bevor das Formular abgeschickt werden kann.
Um reCAPTCHA v2 zu lösen, senden Sie den googlekey und pageurl Parameter zusammen mit method=userrecaptcha und Ihr CapSkip API-Key.
Sie können den googlekey mit einer der folgenden Methoden:
Klicken Sie mit der rechten Maustaste auf das reCAPTCHA-Widget und wählen Sie Untersuchen. Suchen Sie eine URL, die beginnt mit:
www.google.com/recaptcha/api2/anchor
Kopieren Sie den Wert des k -Parameter aus dieser URL. Alternativ finden Sie den data-sitekey Attribut im Seitenquelltext und kopieren Sie seinen Wert.

Sobald Sie den Site-Key haben, senden Sie eine HTTP-GET- oder POST-Anfrage an http://127.0.0.1:PORT/in.php
Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja | Ihr CapSkip-API-Schlüssel. |
| method | String | Ja | userrecaptcha: gibt eine reCAPTCHA-v2-Anfrage an. |
| googlekey | String | Ja | Der Wert des k oder data-sitekey Parameter, der auf der Ziel-Seite gefunden wird. |
| pageurl | String | Ja | Die vollständige URL der Seite, auf der sich das reCAPTCHA befindet. |
| enterprise | Integer Standard: 0 | Nein |
1: steht für reCAPTCHA Enterprise v2. 0: Standard-reCAPTCHA-v2. |
| invisible | Integer Standard: 0 | Nein |
1: weist auf Invisible reCAPTCHA hin. 0: standardmäßiges Checkbox-reCAPTCHA. |
| data-s | String | Nein | Wert des data-s Parameter, der auf der Seite gefunden wird. Anwendbar auf Google Search und bestimmte Google-Dienste. |
| json | Integer Standard: 0 | Nein |
0: Antwort wird als reiner Text zurückgegeben. 1: die Antwort wird im JSON-Format zurückgegeben. |
| proxy | String | Nein | Proxy-Adresse. Format für die IP-Authentifizierung: IP:PORT (Beispiel: 123.123.123.123:3128). Format für die Anmeldung mit Login/Passwort: login:password@IP:PORT |
| proxytype | String | Nein | Art des Proxys. Unterstützte Werte: HTTP, HTTPS, SOCKS5, SOCKS5H. Standard: HTTP wenn proxy wird bereitgestellt, aber proxytype weggelassen wird. |
reCAPTCHA v2 absenden (Standard):
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com" http://127.0.0.1:8080/in.php
reCAPTCHA v2 (Invisible) übermitteln:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&invisible=1" http://127.0.0.1:8080/in.php
Enterprise reCAPTCHA v2 übermitteln:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1" http://127.0.0.1:8080/in.php
Enterprise reCAPTCHA v2 (Invisible) absenden:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1&invisible=1" http://127.0.0.1:8080/in.php
Wenn die Anfrage erfolgreich ist, gibt CapSkip die Captcha-ID als reinen Text zurück: OK|12345
Wenn der json=1 Parameter verwendet wurde, wird die Antwort im JSON-Format zurückgegeben:
{
"status":1,
"request":"12345"
}Wenn die Anfrage fehlschlägt, gibt CapSkip einen Fehlercode zurück.
Warten Sie 15 bis 20 Sekunden und senden Sie dann eine HTTP-GET-Anfrage an den Ergebnis-Endpunkt, um die Lösung abzurufen: http://127.0.0.1:PORT/res.php
Liste der GET-Anfrageparameter
| GET-Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja | Ihr CapSkip-API-Schlüssel. |
| action | String | Ja | get: ruft die Antwort für das übermittelte Captcha ab. |
| id | Integer | Ja |
Die Captcha-ID, zurückgegeben von in.php. |
| json | Integer Standard: 0 | Nein |
0: Antwort wird als Klartext zurückgegeben 1: Antwort wird im JSON-Format zurückgegeben |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
Wenn das Captcha gelöst wurde, antwortet CapSkip als Klartext oder JSON und gibt den Antwort-Token zurück. Der Token sieht in etwa so aus:
03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB-50GQHPEBJUHNnhJyDzwRoRAkVzrf7UkV8wKCdTwrrWqiYDgbrzURfHc2ESsp020MicJTasSiXmNRgryt-gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3-egcplD1uLGh79wC34RF49Ui3eHwua4S9XHpH6YBe7gXzz6_mv-o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q
Wenn das Captcha noch nicht gelöst ist, gibt CapSkip zurück CAPCHA_NOT_READY. Warten Sie in diesem Fall 5 Sekunden und wiederholen Sie die Anfrage. Wenn CapSkip einen leeren Response-Body zurückgibt, wurde das Ergebnis bereits abgerufen oder die ID existiert nicht. Jedes Ergebnis kann nur einmal gelesen werden.
Lokalisieren Sie das Element mit der ID g-recaptcha-response und machen Sie es sichtbar, indem Sie das display: none style.

Bitte beachten Sie: In manchen Fällen wird der Seiteninhalt dynamisch generiert, und der
g-recaptcha-responseelement may not appear in the static HTML source. In such situations, inspect the page structure using your browser’s developer tools to locate the dynamically generated element.
Alternativ können Sie JavaScript verwenden, um den Wert des g-recaptcha-response Feld direkt:
document.getElementById("g-recaptcha-response").innerHTML="TOKEN";Auf der Seite erscheint ein Eingabefeld. Fügen Sie den Antwort-Token in dieses Feld ein und senden Sie das Formular ab.
reCAPTCHA V2 Callback
In manchen Fällen gibt es keinen Submit-Button und stattdessen wird eine Callback-Funktion verwendet. Die Callback-Funktion wird automatisch ausgeführt, wenn reCAPTCHA gelöst ist.
Die Liste der POST- und GET-Anfrageparameter ist hier verfügbar: reCAPTCHA V2 POST- und GET-Anfrageparameter
Die Callback-Funktion ist typischerweise definiert im data-callback -Attribut des reCAPTCHA-Widgets, zum Beispiel:
data-callback="myCallbackFunction"
In anderen Fällen ist die Callback-Funktion definiert als das callback Parameter des grecaptcha.render() Funktion, zum Beispiel:
grecaptcha.render('example', {
'sitekey' : 'someSitekey',
'callback' : myCallbackFunction,
'theme' : 'dark'
});Eine weitere Möglichkeit, die Callback-Funktion zu finden, besteht darin, die JavaScript-Konsole des Browsers zu öffnen und das reCAPTCHA-Konfigurationsobjekt zu untersuchen:
___grecaptcha_cfg.clients[0].aa.l.callback
Beachten Sie, dass die aa.l Eigenschaft kann variieren, und es kann mehrere reCAPTCHA-Clients auf der Seite geben. In solchen Fällen sollten Sie zusätzlich prüfen clients[1], clients[2], und anderen Einträgen, um das richtige Konfigurationsobjekt zu finden.
Alternativ können Sie das folgende Skript verwenden, um reCAPTCHA-Parameter automatisch zu extrahieren:
function findRecaptchaClients() {
if (typeof (___grecaptcha_cfg) !== 'undefined') {
return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' };
const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object');objects.forEach(([toplevelKey, toplevel]) => {
const found = Object.entries(toplevel).find(([_, value]) => (
value && typeof value === 'object' && 'sitekey' in value && 'size' in value
));
if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV'){
data.pageurl = toplevel.baseURI;
}
if (found) {
const [sublevelKey, sublevel] = found;data.sitekey = sublevel.sitekey;
const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
const callback = sublevel[callbackKey];
if (!callback) {
data.callback = null;
data.function = null;
} else {
data.function = callback;
const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('');
data.callback = `___grecaptcha_cfg.clients${keys}`;
}
}
});
return data;
});
}
return [];
}Rufen Sie abschließend die Callback-Funktion auf:
myCallbackFunction();
Oder alternativ:
___grecaptcha_cfg.clients[0].aa.l.callback();
In manchen Fällen benötigt die Callback-Funktion ein Argument. In den meisten Situationen sollten Sie den gelösten Token als dieses Argument übergeben. Zum Beispiel:
myCallbackFunction('TOKEN');
reCAPTCHA V2 Invisible
reCAPTCHA v2 hat auch einen Invisible-Modus. Ein Beispiel dazu sehen Sie hier:
https://www.google.com/recaptcha/api2/demo?invisible=true
Invisible reCAPTCHA zeigt das Kontrollkästchen “I'm not a robot” nicht an. Stattdessen ist es typischerweise an eine Schaltfläche gebunden oder wird automatisch beim Laden der Seite oder bei einer Nutzerinteraktion ausgelöst, etwa beim Klicken einer Schaltfläche oder beim Absenden eines Formulars.
Intern wird das Invisible-reCAPTCHA-Widget in einem versteckten <div> Element, das außerhalb des sichtbaren Viewports positioniert ist, wodurch es für den Nutzer unsichtbar wird.
Abhängig von den Cookies und der Risikobewertung des Nutzers kann reCAPTCHA automatisch bestehen, ohne eine Herausforderung anzuzeigen. Andernfalls erscheint eine standardmäßige Bildherausforderung.
In den meisten Fällen wird, sobald die Challenge abgeschlossen ist, eine Callback-Funktion ausgeführt. Weitere Einzelheiten finden Sie im Callback-Abschnitt oben.
Die Liste der POST- und GET-Anfrageparameter ist hier verfügbar: reCAPTCHA V2 POST- und GET-Anfrageparameter
So stellen Sie fest, ob reCAPTCHA unsichtbar ist
Sie können Invisible reCAPTCHA anhand eines der folgenden Anzeichen erkennen:
Die „I'm not a robot“-Checkbox ist nicht sichtbar, aber nach einer Nutzerinteraktion erscheint eine Challenge.
Die reCAPTCHA-iframe-URL enthält den Parameter
size=invisible.Das reCAPTCHA-Konfigurationsobjekt enthält ein
sizeEigenschaft gesetzt aufinvisible, zum Beispiel:___grecaptcha_cfg.clients[0].aa.l.size === "invisible"
Wenn Sie Invisible reCAPTCHA über die API lösen, fügen Sie den Parameter hinzu: invisible=1
Wie gehen Sie mit Invisible reCAPTCHA im Browser um?
Methode 1: JavaScript verwenden
Setzen Sie den Wert des g-recaptcha-response -Feld auf das von CapSkip zurückgegebene Token:
document.getElementById("g-recaptcha-response").innerHTML="TOKEN";Führen Sie nach dem Setzen des Tokens die Aktion aus, die normalerweise nach erfolgreicher Verifizierung erfolgt.
In den meisten Fällen bedeutet das, ein Formular abzusenden. Sie müssen das korrekte Formular anhand seines id, name, oder ein anderes Attribut, und lösen Sie dann die Übermittlung aus. Hier sind einige Beispiele:
document.getElementById("recaptcha-demo-form").submit(); //by id "recaptcha-demo-form"
document.getElementsByName("myFormName")[0].submit(); //by element name "myFormName"
document.getElementsByClassName("example").submit(); //by class name "example"In manchen Fällen wird automatisch eine Callback-Funktion ausgeführt, wenn reCAPTCHA gelöst wird.
Die Callback-Funktion ist typischerweise definiert im data-callback -Attribut des reCAPTCHA-Widgets, zum Beispiel:
data-callback="myCallbackFunction"
In anderen Fällen ist die Callback-Funktion definiert als das callback Parameter des grecaptcha.render() Funktion, zum Beispiel:
grecaptcha.render('example', {
'sitekey' : 'someSitekey',
'callback' : myCallbackFunction,
'theme' : 'dark'
});Sie müssen lediglich diese Funktion aufrufen:
myCallbackFunction();
Methode 2: Das HTML ändern
Entfernen Sie das <div> Element, das das reCAPTCHA-Widget enthält, aus dem Body der Seite.
<div style="visibility: hidden; position: absolute; width:100%; top: -10000px; left: 0px; right: 0px; transition: visibility 0s linear 0.3s, opacity 0.3s linear; opacity: 0;"> <div style="width: 100%; height: 100%; position: fixed; top: 0px; left: 0px; z-index: 2000000000; background-color: #fff; opacity: 0.5; filter: alpha(opacity=50)"></div> <div style="margin: 0 auto; top: 0px; left: 0px; right: 0px; position: absolute; border: 1px solid #ccc; z-index: 2000000000; background-color: #fff; overflow: hidden;"> <iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&v=r20170213115309&k=6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs#zglq3yifgkmj" title="recaptcha challenge" style="width: 100%; height: 100%;" scrolling="no" name="zglq3yifgkmj" frameborder="0"></iframe> </div> </div>
Entfernen Sie den gesamten reCAPTCHA-Block von der Seite.
<div class="">
<!-- BEGIN: ReCAPTCHA implementation example. -->
<div
id="recaptcha-demo"
class="g-recaptcha"
data-sitekey="6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs"
data-callback="onSuccess"
data-bind="recaptcha-demo-submit"
>
<div
class="grecaptcha-badge"
style="width: 256px; height: 60px; transition: right 0.3s ease 0s; position: fixed; bottom: 14px; right: -186px; box-shadow: 0px 0px 5px gray;"
>
<div class="grecaptcha-logo">
<iframe
src="https://www.google.com/recaptcha/api2/anchor?k=6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs&co=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbTo0NDM.&hl=en&v=r20170213115309&size=invisible&cb=uror1hlow5a"
title="recaptcha widget"
scrolling="no"
name="undefined"
width="256"
height="60"
frameborder="0"
></iframe>
</div>
<div class="grecaptcha-error"></div>
<textarea
id="g-recaptcha-response"
name="g-recaptcha-response"
class="g-recaptcha-response"
style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none; display: none; "
></textarea>
</div>
</div>
<script>
var onSuccess = function (response) {
var errorDivs = document.getElementsByClassName('recaptcha-error');
if (errorDivs.length) {
errorDivs[0].className = '';
}
var errorMsgs = document.getElementsByClassName('recaptcha-error-message');
if (errorMsgs.length) {
errorMsgs[0].parentNode.removeChild(errorMsgs[0]);
}
document.getElementById('recaptcha-demo-form').submit();
};
</script>
<!-- Optional noscript fallback. --><!-- END: ReCAPTCHA implementation example. -->
</div>Fügen Sie den folgenden Code anstelle des entfernten Blocks ein:
<input type="submit" /> <textarea name="g-recaptcha-response">%g-recaptcha-response%</textarea>
%g-recaptcha-response% steht für den von CapSkip erhaltenen Antwort-Token.
Nachdem Sie den Block ersetzt haben, erscheint eine Schaltfläche “Submit query”. Klicken Sie auf die Schaltfläche, um das Formular zusammen mit dem g-recaptcha-response Wert und alle anderen erforderlichen Formulardaten an die Website.
reCAPTCHA V3
reCAPTCHA v3 ist ein moderner Captcha-Mechanismus, der von Google entwickelt wurde. Es zeigt keine sichtbare Challenge und erfordert keine Nutzerinteraktion. Stattdessen vergibt es einen Score basierend auf der Wahrscheinlichkeit, dass die Interaktion menschlich ist.
Technisch gesehen ähnelt reCAPTCHA v3 dem reCAPTCHA v2. Die Website erhält einen Token von der reCAPTCHA-API, der dann in einer POST-Anfrage an den Zielserver gesendet und über die reCAPTCHA-API verifiziert wird.
Der entscheidende Unterschied ist, dass reCAPTCHA v3 keine sichtbare Challenge anzeigt. Stattdessen gibt es eine Bewertung zurück, die einschätzt, ob der Nutzer ein Mensch oder ein Bot ist. Diese Bewertung wird als score und reicht von 0.0 bis 1.0. Der Score wird an die Website gesendet, die dann anhand dieses Werts entscheidet, wie sie mit der Anfrage umgeht.
Es gibt außerdem einen zusätzlichen Parameter namens action, was es der Website ermöglicht, zwischen verschiedenen Benutzerinteraktionen zu unterscheiden. Nach der Verifizierung des Tokens gibt die reCAPTCHA-API den mit der Anfrage verknüpften Action-Namen zurück.
Wie löst man reCAPTCHA v3 mit CapSkip?
Bestätigen Sie zunächst, dass die Zielwebsite reCAPTCHA v3 verwendet.
Zu den Anzeichen für reCAPTCHA v3 gehören:
Keine sichtbaren Captchas oder Bild-Challenges
The
api.jsSkript wird geladen mit einemrender=SITEKEYParameter, zum Beispiel:https://www.google.com/recaptcha/api.js?render=SITEKEYThe
___grecaptcha_cfg.clientsArray enthält einen Eintrag mit einem hohen numerischen Index, wie etwaclients[100000]
Um reCAPTCHA v3 zu lösen, ermitteln Sie die folgenden Parameter:
- sitekey
Dies finden Sie in derrenderParameter desapi.jsSkript-URL. Sie kann auch in einer iframe-URL erscheinen, innerhalb von JavaScript-Code mit einem Aufruf vongrecaptcha.execute(), oder innerhalb des___grecaptcha_cfgKonfigurationsobjekt. - action
Lokalisieren Sie dies, indem Sie den JavaScript-Code auf Aufrufe vongrecaptcha.execute(), zum Beispiel:grecaptcha.execute('SITEKEY', {action: 'do_something'})In manchen Fällen erfordert das Auffinden der Action, mehrere von der Seite geladene JavaScript-Dateien zu prüfen. Wenn Sie den Wert der Action nicht ermitteln können, dürfen Sie den Standardwert verwenden"verify". - pageurl
Die vollständige URL der Seite, auf der reCAPTCHA v3 implementiert ist.
Den Score verstehen
Der akzeptable Score-Schwellenwert variiert je nach Website und kann nur durch Testen ermittelt werden. Die Scores reichen von:
0.0 → wahrscheinlich Bot
1.0 → wahrscheinlich menschlich
Die meisten Websites verwenden Schwellenwerte zwischen 0.3 und 0.7, da selbst legitime Nutzer niedrigere Scores erhalten können.
Sie können Ihren gewünschten Schwellenwert übergeben mit dem min_score Parameter, aber der endgültige Score wird immer von Google zum Zeitpunkt der Verifizierung festgelegt und kann vom Löser nicht garantiert werden.
Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja | Ihr CapSkip-API-Schlüssel. |
| method | String | Ja | userrecaptcha: gibt eine reCAPTCHA-Anfrage an. |
| version | String | Ja | v3: gibt an, dass die Anfrage für reCAPTCHA v3 ist. |
| googlekey | String | Ja | Der Wert des data-sitekey Parameter, der auf der Ziel-Seite gefunden wird. |
| pageurl | String | Ja | Die vollständige URL der Seite, auf der sich das reCAPTCHA befindet. |
| enterprise | Integer Standard: 0 | Nein |
1: kennzeichnet reCAPTCHA Enterprise v3. 0: Standard-reCAPTCHA v3. |
| action | String Standard: verify | Nein | Der Wert des action -Parameter, der auf der Seite definiert ist. |
| min_score | Float | Nein | Angeforderter Mindest-Score für das Token. Google vergibt den endgültigen Score, wenn Ihr Server das Token verifiziert, daher ist dieser Wert ein Hinweis und nicht garantiert. CapSkip liefert das erhaltene Token unabhängig von dem Score zurück, den Google später vergibt. |
| json | Integer Standard: 0 | Nein |
0: Antwort wird als reiner Text zurückgegeben. 1: die Antwort wird im JSON-Format zurückgegeben. |
| proxy | String | Nein | Proxy-Adresse. Format für die IP-Authentifizierung: IP:PORT (Beispiel: 123.123.123.123:3128). Format für die Anmeldung mit Login/Passwort: login:password@IP:PORT |
| proxytype | String | Nein | Art des Proxys. Unterstützte Werte: HTTP, HTTPS, SOCKS5, SOCKS5H. Standard: HTTP wenn proxy wird bereitgestellt, aber proxytype weggelassen wird. |
reCAPTCHA v3 absenden:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&version=v3&action=submit&min_score=0.7&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com" http://127.0.0.1:8080/in.php
Enterprise reCAPTCHA v3 übermitteln:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&version=v3&action=submit&min_score=0.7&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1" http://127.0.0.1:8080/in.php
Wenn die Anfrage erfolgreich ist, gibt CapSkip die Captcha-ID als reinen Text zurück: OK|12345
Wenn der json=1 -Parameter angegeben ist, wird die Antwort im JSON-Format zurückgegeben:
{
"status":1,
"request":"12345"
}Wenn ein Fehler auftritt, gibt CapSkip einen Fehlercode zurück.
Warten Sie 10 bis 15 Sekunden und senden Sie dann eine HTTP-GET-Anfrage an den Ergebnis-Endpunkt: http://127.0.0.1:PORT/res.php
Geben Sie die zurückgegebene Captcha-ID in Ihrer Anfrage an. Die vollständige Liste der verfügbaren Parameter ist in der Tabelle unten dargestellt.
Wenn das Captcha erfolgreich gelöst wurde, gibt CapSkip das Ergebnis als reinen Text oder im JSON-Format zurück. Der zurückgegebene Wert ist ein Verifizierungs-Token ähnlich dem folgenden:
03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB--gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3--o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q
Wenn das Captcha noch nicht gelöst ist, gibt CapSkip zurück CAPCHA_NOT_READY. Warten Sie 5 Sekunden und wiederholen Sie die Anfrage. Wenn CapSkip einen leeren Antworttext zurückgibt, wurde das Ergebnis bereits abgerufen oder die ID existiert nicht. Jedes Ergebnis kann nur einmal gelesen werden.
Liste der GET-Anfrageparameter
| GET-Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja | Ihr CapSkip-API-Schlüssel. |
| action | String | Ja | get: ruft die Antwort für das übermittelte Captcha ab. |
| id | Integer | Ja |
Die Captcha-ID, zurückgegeben von in.php. |
| json | Integer Standard: 0 | Nein |
0: Antwort wird als Klartext zurückgegeben 1: Antwort wird im JSON-Format zurückgegeben |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
Nachdem Sie den Token von CapSkip erhalten haben, müssen Sie ihn korrekt an die Zielwebsite übermitteln. Am besten verstehen Sie die Funktionsweise, indem Sie die Anfragen beobachten, die beim Abschließen der Verifizierung als normaler Nutzer gesendet werden. Die meisten Browser bieten Entwicklertools mit einem Network Tab, über den Sie ausgehende Anfragen untersuchen können.
In den meisten Fällen wird das Token über eine POST-Anfrage gesendet. Der Parametername kann g-recaptcha-response, ähnlich wie reCAPTCHA v2, oder etwas wie g-recaptcha-response-100000. In manchen Implementierungen kann ein anderer Parametername verwendet werden.
Sie sollten die Netzwerkanfragen untersuchen, um festzustellen, wie das Token übertragen wird, und Ihre Anfrage entsprechend aufbauen.
reCAPTCHA Enterprise
reCAPTCHA Enterprise ist die fortgeschrittene Version von Googles reCAPTCHA-System. Es kann sowohl im v2- als auch im v3-Modus arbeiten und bietet Website-Administratoren zusätzliche Kontrolle, einschließlich der Möglichkeit, zu bewerten und zu melden, ob eine Interaktion von einem Menschen oder automatisiert war.
Wie löst man reCAPTCHA Enterprise?
Der erste Schritt besteht darin, festzustellen, ob die Website die Enterprise-Version von reCAPTCHA verwendet.
Wichtige Indikatoren für reCAPTCHA Enterprise sind:
Die Seite lädt
enterprise.jsstattapi.js, zum Beispiel:<script src="https://recaptcha.net/recaptcha/enterprise.js" async defer></script>
Der JavaScript-Code der Website ruft auf
grecaptcha.enterprise.METHODstattgrecaptcha.METHOD
Bestimmen Sie als Nächstes, welche Implementierung verwendet wird: v2, Invisible v2 oder v3. Dies lässt sich in der Regel feststellen, indem Sie analysieren, wie das Widget gerendert wird und wie es sich auf der Seite verhält.
Folgen Sie dem untenstehenden Flussdiagramm, um die korrekte Implementierung zu bestimmen. Es gilt in der überwiegenden Mehrheit der Fälle.

Ermitteln Sie die Captcha-Parameter auf dieselbe Weise wie für reCAPTCHA v2 oder v3 beschrieben.
Bei v2-Enterprise-Implementierungen kann es zusätzliche optionale Daten geben. In den meisten Fällen ist dies eine benutzerdefinierte Zeichenkette, die im s oder data-s Parameter. Falls vorhanden, fügen Sie diesen Wert in Ihre Anfrage ein und verwenden dabei den data-s -Parameter.
Die Liste der POST- und GET-Anfrageparameter ist hier verfügbar: reCAPTCHA V2 POST- und GET-Anfrageparameter
Für v3 Enterprise-Implementierungen benötigen Sie möglicherweise auch den action Wert. Um ihn zu finden, untersuchen Sie den JavaScript-Code der Website und lokalisieren Sie den grecaptcha.enterprise.execute() Aufruf. Der action Parameter wird typischerweise innerhalb dieser Funktion übergeben. Beachten Sie, dass action ist optional und kann in manchen Fällen undefined sein.
Die Liste der POST- und GET-Anfrageparameter ist hier verfügbar: reCAPTCHA V3 POST- und GET-Anfrageparameter
Wenn Sie Ihre Anfrage senden an das /in.php Endpunkt, fügen Sie den zusätzlichen Parameter hinzu: enterprise=1
Danach interagieren Sie mit der CapSkip-API auf die gleiche Weise wie beim Lösen von reCAPTCHA v2 oder v3. Sobald das Token zurückgegeben wurde, übermitteln Sie es gemäß deren Implementierung an die Ziel-Website.
Cloudflare Turnstile
Cloudflare Turnstile ist eine moderne Captcha-Alternative, die von Cloudflare entwickelt wurde. Es überprüft, ob ein Besucher ein Mensch ist, ohne sich auf herkömmliche visuelle Challenges zu verlassen. Turnstile kann als eigenständiges Widget oder als Teil einer Challenge-Seite erscheinen und funktioniert mit minimaler oder ganz ohne Nutzerinteraktion.
Es gibt zwei gängige Turnstile-Implementierungen:
1. Eigenständiges Turnstile-Widget
Ein eigenständiges Turnstile-Widget wird direkt auf einer Website-Seite eingebettet und schützt typischerweise ein Formular vor automatisierten Übermittlungen. In diesem Fall:
Extrahieren Sie den
sitekeyfrom the page.Senden Sie es an die CapSkip-API zusammen mit der vollständigen
pageurl.Nachdem Sie den Token erhalten haben, fügen Sie ihn ein in das
cf-turnstile-response-Feld.In manchen Implementierungen muss das Token möglicherweise auch platziert werden in das
g-recaptcha-response-Feld.Wenn ein Callback definiert ist in der
turnstile.render()Konfiguration, führen Sie es mit dem zurückgegebenen Token aus.
Senden Sie dann das Formular wie gewohnt ab.
2. Turnstile auf einer Cloudflare-Challenge-Seite
Dies tritt auf, wenn die Website über Cloudflare geproxyt wird und vor der Freigabe des Zugangs eine Turnstile-Challenge-Seite anzeigt. In diesem Fall müssen Sie die folgenden Parameter extrahieren:
cDatachlPageDataaction
Diese Werte müssen in Ihrer API-Anfrage enthalten sein. Außerdem benötigen Sie den User-Agent Wert, den die CapSkip-API bei der Übermittlung des Tokens zurückgibt.
Wie extrahiert man die erforderlichen Parameter?
Um die erforderlichen Parameter zu extrahieren, können Sie überschreiben turnstile.render -Methode und fangen die Argumente ab, die beim Aufruf übergeben werden. Injizieren Sie zum Beispiel den folgenden JavaScript-Code in die Seite. Das Skript muss ausgeführt werden, bevor das Turnstile-Widget geladen wird, um die Parameter erfolgreich zu erfassen.
const i = setInterval(()=>{
if (window.turnstile) {
clearInterval(i)
window.turnstile.render = (a,b) => {
let p = {
method: "turnstile",
key: "YOUR_API_KEY",
sitekey: b.sitekey,
pageurl: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
json: 1
}
console.log(JSON.stringify(p))
window.tsCallback = b.callback
return 'foo'
}
}
},50)Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja | Ihr CapSkip-API-Schlüssel. |
| method | String | Ja | turnstile: gibt eine Cloudflare-Turnstile-Anfrage an. |
| sitekey | String | Ja | Der Wert des data-sitekey Parameter, der auf der Ziel-Seite gefunden wird. |
| pageurl | String | Ja | Die vollständige URL der Seite, auf der sich die Turnstile-Challenge befindet. |
| action | String | Nein |
Optionaler action-Wert, definiert im data-action -Attribut oder übergeben an turnstile.render(). |
| data | String | Nein |
Der Wert von cData übergeben an turnstile.render() oder definiert in der data-cdata Attribut. |
| pagedata | String | Nein |
Der Wert von chlPageData übergeben an turnstile.render(). |
| json | Integer Standard: 0 | Nein |
0: Antwort wird als reiner Text zurückgegeben. 1: die Antwort wird im JSON-Format zurückgegeben. |
| proxy | String | Nein | Proxy-Adresse. Format für die IP-Authentifizierung: IP:PORT (Beispiel: 123.123.123.123:3128). Format für die Anmeldung mit Login/Passwort: login:password@IP:PORT |
| proxytype | String | Nein | Art des Proxys. Unterstützte Werte: HTTP, HTTPS, SOCKS5, SOCKS5H. Standard: HTTP wenn proxy wird bereitgestellt, aber proxytype weggelassen wird. |
Turnstile absenden (eigenständig):
curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com" http://127.0.0.1:8080/in.php
Turnstile absenden (Challenge, dazu optionale action, data, pagedata):
curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com&action=managed&data=...&pagedata=..." http://127.0.0.1:8080/in.php
Wenn die Anfrage erfolgreich ist, gibt CapSkip die Captcha-ID als reinen Text zurück: OK|12345
Wenn der json=1 -Parameter angegeben ist, wird die Antwort im JSON-Format zurückgegeben:
{
"status":1,
"request":"12345"
}Wenn ein Fehler auftritt, gibt CapSkip einen Fehlercode zurück.
Verwenden Sie die zurückgegebene ID, um das Ergebnis abzurufen von /res.php Endpoint der API.
Liste der GET-Anfrageparameter
| GET-Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja | Ihr CapSkip-API-Schlüssel. |
| action | String | Ja | get: ruft die Antwort für das übermittelte Captcha ab. |
| id | Integer | Ja |
Die Captcha-ID, zurückgegeben von in.php. |
| json | Integer Standard: 0 | Nein |
0 - Antwort wird als reiner Text zurückgegeben. 1 - Antwort wird im JSON-Format zurückgegeben, einschließlich des userAgent Wert. |
Für Cloudflare Turnstile verwendet der Löser einen bestimmten Browser-User-Agent, und Sie müssen beim Absenden des Tokens genau denselben User-Agent senden. Mit json=1 enthält die Antwort ein userAgent Feld. Im Klartextmodus lesen Sie denselben Wert aus dem X-Turnstile-User-Agent response-Header.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
GeeTest v3 Slider ist ein interaktives Captcha, das von GeeTest entwickelt wurde. Es verifiziert Nutzer über eine Slider-Challenge, um Menschen von Bots zu unterscheiden, und bietet dabei ein schnelles und nahtloses Verifizierungserlebnis.
Um ein GeeTest-v3-Captcha mit CapSkip zu lösen, müssen Sie zunächst die erforderlichen Captcha-Parameter von der Zielwebsite abrufen. Die erforderlichen Parameter sind:
- gt: Öffentlicher Website-Schlüssel (statisch)
- challenge: Dynamischer Challenge-Wert
- api_server: GeeTest API-Server-Domain (optional)
Diese Werte sind in der Regel verfügbar, wenn die Website GeeTest initialisiert.
Wichtig: Ein neuer
challenge-Wert muss für jede Lösungsanfrage neu ermittelt werden. Sobald das Captcha auf der Seite geladen wurde, ist der vorherigechallengeungültig wird. Sie sollten die Netzwerkanfragen der Website’s untersuchen, um die Anfrage zu identifizieren, die ein neueschallengeWert und führen diese Anfrage aus, bevor Sie jede Löse-Anfrage an CapSkip senden.
Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| method | String | Ja | Muss sein geetest. Gibt an, dass Sie ein GeeTest-v3-Captcha übermitteln. |
| gt | String | Ja | The gt Wert, der von der Zielwebsite bezogen wird. |
| challenge | String | Ja | The challenge Wert, der von der Zielwebsite erhalten wird. Für jede Löse-Anfrage muss ein neuer Wert erhalten werden. |
| pageurl | String | Ja | Vollständige URL der Seite, die das GeeTest-Captcha enthält. |
| api_server | String | Nein | Die von der Zielwebsite verwendete GeeTest-API-Serverdomain (zum Beispiel api.geetest.com oder api-na.geetest.com). |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
| proxy | String | Nein | Proxy-Adresse. Format für die IP-Authentifizierung: IP:PORT (Beispiel: 123.123.123.123:3128). Format für die Anmeldung mit Login/Passwort: login:password@IP:PORT. |
| proxytype | String | Nein | Art des Proxys. Unterstützte Werte: HTTP, HTTPS, SOCKS5, SOCKS5H. Standard: HTTP wenn proxy wird bereitgestellt, aber proxytype weggelassen wird. |
Senden Sie eine HTTP-GET- oder POST-Anfrage an Ihren CapSkip-API-Endpunkt (/in.php) mit method=geetest. Fügen Sie die erforderlichen GeeTest-Parameter aus dem vorherigen Schritt zusammen mit der vollständigen URL der Seite hinzu, die das Captcha enthält.
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=geetest" \ -d "gt=f1ab2cdefa3456789012345b6c78d90e" \ -d "challenge=12345678abc90123d45678ef90123a456b" \ -d "pageurl=https://www.example.com/" \ -d "api_server=api-na.geetest.com" \ http://127.0.0.1:8080/in.php
Wenn alles erfolgreich ist, gibt CapSkip die Captcha-ID als Klartext zurück: OK|212
Wenn der json=1 -Parameter angegeben ist, wird die Antwort im JSON-Format zurückgegeben:
{
"status": 1,
"request": "212"
}Andernfalls gibt CapSkip einen entsprechenden Fehlercode zurück.
Warten Sie ungefähr 5 Sekunden, senden Sie dann eine HTTP-GET-Anfrage an die res.php Endpunkt, um das Ergebnis abzurufen.
Liste der GET-Anfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| action | String | Ja | Angeben get um die Captcha-Lösung abzurufen. |
| id | Integer | Ja | Die vom zurückgegebene Captcha-ID in.php Anfrage. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=212&json=1"
Wenn das Captcha erfolgreich gelöst wurde, gibt CapSkip die Lösung im JSON-Format zurück:
{
"status": 1,
"request": "{\"geetest_challenge\":\"1a2b3456cd67890e12345fab678901c2de\",\"geetest_validate\":\"09fe8d7c6ba54f32e1dcb0a9fedc8765\",\"geetest_seccode\":\"12fe3d4c56789ba01f2e345d6789c012|jordan\"}"
}Wenn das Captcha noch nicht gelöst wurde, gibt CapSkip zurück: CAPCHA_NOT_READY
Warten Sie 5 Sekunden und wiederholen Sie die Anfrage. Tritt ein Fehler auf, gibt CapSkip einen entsprechenden Fehlercode zurück. Verwenden Sie die von CapSkip zurückgegebenen Werte beim Übermitteln Ihrer Anfrage an die Zielwebsite mithilfe der folgenden Felder:
geetest_challengegeetest_validategeetest_seccode
ALTCHA ist ein Proof-of-Work-Captcha. Es gibt kein Bild zu lesen und kein Audio abzuspielen. Die Zielseite stellt eine Challenge, und der Client muss die Zahl per Brute Force ermitteln, die sie erfüllt. CapSkip berechnet diese Zahl und gibt die Payload zurück, die das Widget erzeugt hätte.
So funktioniert es
Der Schutz beruht auf CPU-Kosten, nicht auf Erkennung. Der Server gibt ein Ziel und einen Suchbereich vor (maxnumber), und der Client hasht Kandidaten, bis einer davon passt. Daraus folgen zwei Dinge, die für einen Captcha-Typ ungewöhnlich sind.
Erstens ist eine Lösung deterministisch. Es gibt kein Modell und keine Genauigkeitsangabe, denn entweder liegt die Antwort im angegebenen Bereich oder die Challenge war fehlerhaft. Es wird nie etwas falsch gelesen.
Zweitens wird die Lösungszeit von der Zielseite bestimmt und nicht von CapSkip. Das Referenz-Widget verwendet standardmäßig einen Bereich von 1.000.000, was wenige Millisekunden Rechenarbeit bedeutet. Websites dürfen ihn beliebig anheben, und manche liefern 999.999.999 aus, also rund 500 Millionen Hashes für eine durchschnittliche Challenge. Wenn eine Website langsam zu lösen ist, prüfen Sie zuerst ihren maxnumber Wert.
Der vollständige Ablauf umfasst vier Schritte:
- Holen Sie die Challenge von dem Endpunkt, von dem das Widget sie liest.
- Senden Sie sie an
/in.phpmitmethod=altcha. - Fragen Sie
/res.phpab, bis der Token bereit ist. - Senden Sie den Token an das Zielformular zurück, und zwar im
altcha-Feld.
Was Sie vor dem Lösen benötigen
Die Challenge, in einer von zwei Formen. Beide werden akzeptiert, senden Sie also die Form, die Ihr Scraper ohnehin schon hat.
| Parameter | Sinnvoll, wenn |
|---|---|
| challenge_json | Sie besitzen das Challenge-Dokument bereits. CapSkip löst es lokal und stellt überhaupt keine Netzwerkanfrage, was der schnellste Weg ist. |
| challenge_url | Sie besitzen nur den Endpunkt, der die Challenge ausliefert. CapSkip ruft sie ab, über Ihren Proxy, falls Sie einen gesendet haben, und löst sie anschließend. |
Wo Sie die Challenge finden
Öffnen Sie die Entwicklertools des Browsers, wechseln Sie auf der Zielseite zum Netzwerk-Tab und suchen Sie nach der Anfrage, die das <altcha-widget> Element für seine Challenge stellt. Oft ist es ein Pfad wie /altcha/challenge. Diese Anfrage-URL ist der Wert für challenge_url, und das JSON, das sie zurückliefert, ist der Wert für challenge_json.
Das Widget-Attribut, das diesen Endpunkt benennt, hat sich zwischen den Versionen geändert. Lesen Sie deshalb den Seitenquelltext, statt etwas anzunehmen. Widget v1 und v2 verwenden challengeurl="...", während v3 und neuer challenge="..." sowohl für eine URL als auch für Inline-Daten verwenden. Manche Installationen erzeugen die Challenge in der Seite selbst und rufen überhaupt nichts ab.
Ein Challenge-Dokument sieht so aus:
{
"algorithm": "SHA-256",
"challenge": "3dd28253be6cc0c54d95f7f98c517e68a1b2c3d4e5f60718293a4b5c6d7e8f90",
"salt": "46d5b1c8871e5152d902ee3f?expires=1893456000",
"signature": "4b1cf0e0be0f4e5247e50b0f9a4498301234567890abcdef1234567890abcdef",
"maxnumber": 1000000
}Challenges laufen ab, und das Zeitfenster ist kurz
Jede Challenge trägt ihre eigene Ablaufzeit, entweder im salt Query-String oder als parameters.expiresAt. Sobald sie verstrichen ist, weist die Zielseite die Lösung mit einem nackten Verifizierungsfehler zurück, der genau wie eine falsche Antwort aussieht. Zeitfenster von nur zwei Minuten sind häufig.
Rufen Sie die Challenge unmittelbar vor dem Erstellen der Aufgabe ab und senden Sie den Token zügig ein. Sammeln Sie keine Challenges auf Vorrat und halten Sie keinen Token vor, während ein Benutzer ein Formular ausfüllt. Senden Sie challenge_url statt challenge_json, ruft CapSkip die Challenge automatisch neu ab, wenn sie abläuft, während sie noch in der Warteschlange steht.
Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| method | String | Ja | Muss sein altcha. Gibt an, dass Sie eine ALTCHA-Challenge einreichen. |
| pageurl | String | Ja | Die vollständige URL der Seite, von der die Challenge stammt. |
| challenge_url | String | Ja* | Der Endpunkt, von dem CapSkip die Challenge abrufen soll. Erforderlich, sofern nicht challenge_json gesendet wird. |
| challenge_json | String | Ja* | Das Challenge-Dokument selbst, als JSON-String. Erforderlich, sofern nicht challenge_url gesendet wird. |
| proxy | String | Nein | Proxy-Adresse. Akzeptiert IP:PORT, LOGIN:PASSWORD@IP:PORT oder IP:PORT:LOGIN:PASSWORD. Wird nur für den challenge_url Abruf verwendet. |
| proxytype | String | Nein | Proxy-Typ: HTTP, HTTPS, SOCKS5 oder SOCKS5H. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
Senden Sie entweder challenge_url oder challenge_json. Beides zu senden ist erlaubt, und das Inline-Dokument gewinnt, weil ein Abruf nur erneut beschaffen würde, was Sie bereits haben.
Senden Sie eine HTTP-GET- oder POST-Anfrage an Ihren CapSkip-API-Endpunkt (/in.php) mit method=altcha. Formularfelder und ein JSON-Body werden beide unter identischen Feldnamen akzeptiert, und GET funktioniert ebenfalls, weil ALTCHA kein Bild zum Hochladen mit sich bringt.
ALTCHA einreichen (Formularfelder):
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=altcha" \ -d "pageurl=https://www.example.com/signup" \ --data-urlencode "challenge_url=https://www.example.com/captcha/api/altcha/challenge" \ -d "json=1" \ http://127.0.0.1:8080/in.php
ALTCHA einreichen (JSON-Body):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "altcha",
"pageurl": "https://www.example.com/signup",
"challenge_url": "https://www.example.com/captcha/api/altcha/challenge",
"json": 1
}' \
http://127.0.0.1:8080/in.phpEin JSON-Body erlaubt drei Dinge, die die Formularkodierung nicht kann. Flags dürfen echte Booleans sein ("json": true), challenge_json darf das verschachtelte Dokument sein statt eines maskierten Strings, und ein Feld, das auf null gesetzt ist, gilt als nicht gesendet.
Wenn alles korrekt ist, gibt CapSkip die Captcha-ID als reinen Text zurück: OK|2122988149. Wenn der Parameter json=1 gesendet wurde, ist die Antwort stattdessen ein JSON-Envelope. So oder so ist der zurückgegebene Wert die Captcha-ID, die Sie für das Ergebnis abfragen.
{
"status": 1,
"request": "2122988149"
}Andernfalls gibt CapSkip einen passenden Fehlercode zurück. Eine fehlerhafte Inline-Challenge wird bereits bei der Einreichungsanfrage abgelehnt und nicht erst beim Abfragen, sodass Sie genau bei der fehlerhaften Anfrage davon erfahren.
Warten Sie etwa 5 Sekunden und senden Sie dann eine HTTP-GET-Anfrage an den Ergebnis-Endpunkt (/res.php) mit der Captcha-ID, die Sie erhalten haben.
Liste der GET-Anfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| action | String | Ja | Angeben get um die Captcha-Lösung abzurufen. |
| id | Integer | Ja | Die vom zurückgegebene Captcha-ID in.php Anfrage. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
Wenn das Captcha gelöst wurde, gibt CapSkip die Lösung im JSON-Format zurück:
{
"status": 1,
"request": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiM2RkMi...",
"solution": {
"token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiM2RkMi...",
"number": 9661
},
"cost": "0.0020",
"createTime": 1788863246,
"endTime": 1788863246,
"errorId": 0,
"solveCount": 1
}request und solution.token sind immer derselbe String, lesen Sie also den Wert, den Ihr Client erwartet. number ist der Zähler, der die Challenge gelöst hat, und wird der Vollständigkeit halber zurückgegeben. Fehlt json=1, ist die Antwort einfach OK|<token>.
Wenn das Captcha noch nicht gelöst wurde, antwortet CapSkip mit CAPCHA_NOT_READY, genau so geschrieben wie bei jeder anderen Methode. Warten Sie 5 Sekunden und wiederholen Sie die Anfrage.
Steuern Sie Ihre Polling-Schleife über errorId, nicht über status. status ist die Ganzzahl 1 und stammt aus dem res.php Vertrag, der sie schon immer zurückgegeben hat, und genau das liest jedes kompatible SDK. Wenn Sie Ihren Client anhand einer Dokumentationsseite geschrieben haben, auf der steht "status": "ready", prüfen Sie errorId === 0 oder das Vorhandensein von solution.token erhalten.
Den Token einreichen
Das ALTCHA-Widget legt seine Payload in einem Formularfeld namens altcha. Senden Sie den Token wortgetreu in diesem Feld, genau so, wie es das Widget getan hätte:
POST https://www.example.com/signup Content-Type: application/x-www-form-urlencodedemail=someone%40example.com&altcha=eyJhbGdvcml0aG0iOiJTSEEtMjU2Iiwi...
Der interne Aufbau der Payload richtet sich nach der Challenge, die sie erzeugt hat. Eine Legacy-Challenge erzeugt ein flaches Dokument mit number, während eine PoW-v2-Challenge ein verschachteltes Dokument erzeugt, mit der ursprünglichen Challenge unter challenge und der Antwort unter solution. Behandeln Sie den Token als undurchsichtigen Wert und reichen Sie ihn unverändert weiter, denn die Zielseite weiß bereits, welche Form sie erwarten muss.
Manche Integrationen lesen die Payload stattdessen aus einem Feld im JSON-Body. Prüfen Sie deshalb, was das Formular der Seite selbst absendet, und bilden Sie genau das nach. Kodieren Sie den Token nicht neu, kürzen Sie ihn nicht und ordnen Sie ihn nicht um. Er ist die Base64-Darstellung eines JSON-Dokuments, dessen Felder von der HMAC-Signatur des Servers abgedeckt sind, sodass jede Änderung ihn ungültig macht.
Unterstützte Algorithmen
Sie müssen nicht herausfinden, welches Verfahren eine Website verwendet. CapSkip liest die Challenge und wählt den Algorithmus selbst aus.
| Verfahren | Generation | Unterstützt | Beschreibung |
|---|---|---|---|
| Legacy PoW | v1 | Ja | Sucht n mit SHA(salt + n) gleich der Challenge. SHA-1, SHA-256, SHA-384 und SHA-512 werden alle unterstützt. Das ist die Form, die die meisten Installationen bis heute einsetzen. |
| PBKDF2 | PoW v2 | Ja | Sucht einen Zähler, dessen abgeleiteter Schlüssel mit dem Zielpräfix beginnt. SHA-256, SHA-384 und SHA-512 werden unterstützt. Das ist die Voreinstellung, die ALTCHA selbst empfiehlt. |
| SHA | PoW v2 | Ja | Die iterative Hash-Variante desselben Verfahrens. |
| Argon2id | PoW v2 | Nein | Speicherintensive Schlüsselableitungsfunktion. Wird abgelehnt statt versucht. |
| scrypt | PoW v2 | Nein | Speicherintensive Schlüsselableitungsfunktion. Wird abgelehnt statt versucht. |
Beide Aufwandsmodi funktionieren und erfordern nichts von Ihnen. Im deterministischen Modus berechnet der Server das Ziel im Voraus, sodass die Lösungszeit vorhersehbar ist, und im probabilistischen Modus schwankt die Lösungszeit von einer Challenge zur nächsten. Alle drei Widget-Typen (native, checkbox und switch) werden unterstützt, denn der Typ ist nur die optische Form des Bedienelements und erreicht die API nie.
Argon2id und scrypt werden abgelehnt statt versucht. Eine Aufgabe, die eines von beiden verwendet, liefert ERROR_CAPTCHA_UNSOLVABLE in etwa einer Drittelsekunde zurück und wird nie erneut versucht, sodass sie nie stillschweigend falsch gelöst wird. Da ALTCHA PBKDF2 als Standard empfiehlt, betrifft das nur eine kleine Minderheit der Websites.
CaptchaFox ist ein datenschutzorientiertes Captcha, das den Browser selbst bewertet, statt den Besucher etwas lesen zu lassen. Die meisten Besucher bekommen nie ein Rätsel zu sehen. CapSkip löst es, indem es das echte Widget in einem echten Browser bedient, und liefert das Verifizierungs-Token zurück, das das Widget erzeugt hätte.
So funktioniert es
CaptchaFox entscheidet in drei Schichten, und nur die letzte ist sichtbar. Das Widget führt einen kurzen Proof of Work aus, sammelt eine große Menge an Browser-Signalen und sendet beides an die eigene API. Genügen diese Nachweise dem Dienst, wird sofort ein Token ausgestellt und es wird gar kein Rätsel angezeigt. Eine interaktive Aufgabe erscheint nur dann, wenn die Nachweise nicht ausreichen.
Dieser Aufbau hat eine praktische Folge, die Sie vor der Integration kennen sollten. Das Token entsteht in einer echten Browser-Sitzung und nicht durch eine Berechnung über Parameter, die Sie liefern. Deshalb lädt CapSkip das Widget gegen Ihre Seiten-URL und lässt es laufen. Sie geben CapSkip den Site-Key und die Seite, und CapSkip liefert das Token zurück.
Der vollständige Ablauf umfasst vier Schritte:
- Lesen Sie den Site-Key von der Zielseite ab.
- Senden Sie sie an
/in.phpmitmethod=captchafox. - Fragen Sie
/res.phpab, bis der Token bereit ist. - Senden Sie den Token an das Zielformular zurück, und zwar im
cf-captcha-response-Feld.
Was Sie vor dem Lösen benötigen
Zwei Werte, und beide werden direkt von der Zielseite abgelesen. Es gibt kein Challenge-Dokument, das erfasst werden müsste, und nichts, was abläuft, während die Aufgabe in der Warteschlange steht.
| Parameter | Woher es kommt |
|---|---|
| sitekey | Der öffentliche Schlüssel, mit dem das Widget gerendert wird. Er ist nicht geheim, er ist für jeden Besucher derselbe, und üblicherweise beginnt er mit sk_. |
| pageurl | Die vollständige URL der Seite, auf der das Widget erscheint. CaptchaFox gleicht sie mit den Domains ab, für die der Schlüssel registriert ist, sie muss also die echte Seite sein. |
Wo Sie den Site-Key finden
Öffnen Sie auf der Zielseite die Entwicklertools des Browsers und suchen Sie nach dem CaptchaFox-Container. Websites rendern das Widget auf eine von zwei Arten, und in beiden Fällen ist der Schlüssel sichtbar.
<!-- Automatic rendering: the key is an attribute -->
<div class="captchafox" data-sitekey="sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G"></div><!-- Explicit rendering: the key is in the render call -->
<script>
captchafox.render("#container", {
sitekey: "sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G",
onVerify: function (token) { /* ... */ }
});
</script>Wenn keines von beiden im ausgelieferten HTML steht, weil die Seite das Widget zur Laufzeit aufbaut, öffnen Sie den Tab Netzwerk und suchen Sie die Anfrage an api.captchafox.com. Der Schlüssel ist das Pfadsegment nach /captcha/.
Die Seiten-URL muss zum Schlüssel passen
CaptchaFox-Schlüssel werden für eine Liste erlaubter Domains registriert, und der Dienst prüft den Host, bevor er überhaupt etwas ausstellt. Ein Schlüssel, der zwar korrekt ist, aber auf einer Seite außerhalb dieser Liste verwendet wird, wird dauerhaft abgelehnt und nicht nur gelegentlich.
CapSkip meldet diesen Fall, statt es erneut zu versuchen, denn ein erneuter Versuch kann nichts ausrichten. Wenn ein Site-Key sofort und dauerhaft fehlschlägt, prüfen Sie, ob pageurl wirklich die Seite ist, auf der das Widget tatsächlich läuft, und nicht etwa eine Suchseite, eine Weiterleitung oder ein gekürzter Link, der woanders landet.
Aufgabentypen
Sie wählen nicht aus, welche Aufgabe erscheint. Das entscheidet CaptchaFox, und CapSkip verarbeitet, was es bekommt.
| Challenge | Wann es erscheint | Unterstützt | Beschreibung |
|---|---|---|---|
| Invisible | Meistens | Ja | Die Browser-Nachweise genügen dem Dienst, und es wird ein Token ausgestellt, ohne dass etwas auf dem Bildschirm gezeichnet wird. Das ist der übliche und zugleich der schnellste Weg. |
| Schieben | Manchmal | Ja | Ein Schiebe-Rätsel, bei dem ein Teil in eine Lücke gezogen werden muss. CapSkip bestimmt die Zielposition und führt die Ziehbewegung aus. |
| Bildauswahl | Selten | Nein | Ein Raster aus Bildern, aus denen ausgewählt werden muss. Wird als nicht lösbar gemeldet, damit Ihr Client die Aufgabe neu anfordern kann, statt das Timeout abzuwarten. |
| Audio | Selten | Nein | Die Alternative für Barrierefreiheit. Wird aus demselben Grund als nicht lösbar gemeldet. |
Die beiden nicht unterstützten Aufgaben kommen selten vor, und bei einem neuen Versuch erscheint meist eine andere. Behandeln Sie ein nicht lösbares Ergebnis als Hinweis, die Aufgabe erneut zu senden, und nicht als dauerhaften Fehler des Schlüssels.
Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| method | String | Ja | Muss sein captchafox. Gibt an, dass Sie ein CaptchaFox-Captcha übermitteln. |
| sitekey | String | Ja | Der von der Zielseite abgelesene Site-Key, üblicherweise mit dem Präfix sk_. |
| pageurl | String | Ja | Die vollständige URL der Seite, auf der das Widget erscheint. |
| api_server | String | Nein | Der zu ladende Einstiegspunkt des Widgets. Standardwert ist https://cdn.captchafox.com/. Siehe Auswahl der Widget-Quelle weiter unten. |
| useragent | String | Nein | Wird aus Kompatibilität mit anderen Diensten akzeptiert, aber nicht angewendet. CapSkip löst in einem echten Browser und verwendet dessen eigene, durchgängig konsistente Identität. |
| proxy | String | Nein | Proxy-Adresse. Akzeptiert IP:PORT, LOGIN:PASSWORD@IP:PORT oder IP:PORT:LOGIN:PASSWORD. |
| proxytype | String | Nein | Proxy-Typ: HTTP, HTTPS, SOCKS5 oder SOCKS5H. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
Anders als die meisten Dienste erzwingt CapSkip für diese Methode keinen Proxy. Sobald Sie in größerem Umfang lösen, brauchen Sie dennoch Proxys: CaptchaFox bewertet nicht nur den Browser, sondern auch das Netzwerk, in dem ein Widget läuft. Wiederholte Lösungen von einer Adresse drängen diese Adresse deshalb in Richtung der interaktiven Challenges und danach in Richtung Ablehnungen. Für Tests und gelegentliche Lösungen genügt eine Adresse. Darüber hinaus richten Sie in CapSkip einen Proxy-Pool ein und lassen ihn die Last verteilen, oder Sie senden einen Proxy pro Anfrage, wenn das Token aus einem bestimmten Netz stammen muss.
Senden Sie eine HTTP-GET- oder POST-Anfrage an Ihren CapSkip-API-Endpunkt (/in.php) mit method=captchafox. Formularfelder und ein JSON-Body werden beide unter identischen Feldnamen akzeptiert, und GET funktioniert ebenfalls, weil CaptchaFox kein Bild zum Hochladen mitbringt.
CaptchaFox übermitteln (Formularfelder):
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=captchafox" \ -d "sitekey=sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G" \ -d "pageurl=https://www.example.com/signup" \ -d "json=1" \ http://127.0.0.1:8080/in.php
CaptchaFox übermitteln (JSON-Body):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "captchafox",
"sitekey": "sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G",
"pageurl": "https://www.example.com/signup",
"json": 1
}' \
http://127.0.0.1:8080/in.phpWenn alles korrekt ist, gibt CapSkip die Captcha-ID als reinen Text zurück: OK|2122988149. Wenn der Parameter json=1 gesendet wurde, ist die Antwort stattdessen ein JSON-Envelope. So oder so ist der zurückgegebene Wert die Captcha-ID, die Sie für das Ergebnis abfragen.
{
"status": 1,
"request": "2122988149"
}Andernfalls gibt CapSkip einen passenden Fehlercode zurück. Ein fehlender Site-Key oder eine unbrauchbare Seiten-URL wird bereits bei der Übermittlungsanfrage selbst abgelehnt und nicht erst beim Abfragen des Ergebnisses, sodass Sie es bei genau der Anfrage erfahren, die falsch war.
Warten Sie etwa 5 Sekunden und senden Sie dann eine HTTP-GET-Anfrage an den Ergebnis-Endpunkt (/res.php) mit der erhaltenen Captcha-ID. Ein CaptchaFox-Lösevorgang führt eine echte Browser-Sitzung aus, rechnen Sie also mit einer längeren Dauer als bei einer reinen Rechenmethode wie ALTCHA, und mit noch mehr Zeit, sobald eine interaktive Aufgabe gezeigt wird.
Liste der GET-Anfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| action | String | Ja | Angeben get um die Captcha-Lösung abzurufen. |
| id | Integer | Ja | Die vom zurückgegebene Captcha-ID in.php Anfrage. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
Wenn das Captcha gelöst wurde, gibt CapSkip die Lösung im JSON-Format zurück:
{
"status": 1,
"request": "177f50c25b845601e5c779cdb51b040d523e8ab69efb4d5b343e28df07d05076",
"solution": {
"token": "177f50c25b845601e5c779cdb51b040d523e8ab69efb4d5b343e28df07d05076"
},
"cost": "0.00145",
"createTime": 1788863246,
"endTime": 1788863262,
"errorId": 0,
"solveCount": 1
}request und solution.token sind immer dieselbe Zeichenfolge, lesen Sie also den Wert aus, den Ihr Client erwartet. Ohne json=1, ist die Antwort einfach OK|<token>.
Wenn das Captcha noch nicht gelöst wurde, antwortet CapSkip mit CAPCHA_NOT_READY, genau so geschrieben wie bei jeder anderen Methode. Warten Sie 5 Sekunden und wiederholen Sie die Anfrage.
Steuern Sie Ihre Polling-Schleife über errorId, nicht über status. status ist die Ganzzahl 1 und stammt aus dem res.php Vertrag, der sie schon immer zurückgegeben hat, und genau das liest jedes kompatible SDK. Wenn Sie Ihren Client anhand einer Dokumentationsseite geschrieben haben, auf der steht "status": "ready", prüfen Sie errorId === 0 oder das Vorhandensein von solution.token erhalten.
Den Token einreichen
Das CaptchaFox-Widget legt sein Token in ein Formularfeld mit dem Namen cf-captcha-response. Senden Sie den Token wortgetreu in diesem Feld, genau so, wie es das Widget getan hätte:
POST https://www.example.com/signup Content-Type: application/x-www-form-urlencodedemail=someone%40example.com&cf-captcha-response=177f50c25b845601e5c779cdb51b040d...
Manche Integrationen lesen das Token stattdessen aus einem Feld im JSON-Body. Prüfen Sie daher, was das Formular der Seite selbst sendet, und bilden Sie das genauso nach. Behandeln Sie das Token als undurchsichtigen Wert und reichen Sie es unverändert weiter. Es wird serverseitig gegen die Sitzung geprüft, die es erzeugt hat, sodass jede Änderung es ungültig macht.
Token sind nur kurz gültig. Senden Sie sie zügig ab, statt eines festzuhalten, während ein Nutzer ein Formular ausfüllt, und lösen Sie erneut, wenn das Formular verlassen und später fortgesetzt wird.
Auswahl der Widget-Quelle
CaptchaFox veröffentlicht sein Widget an zwei Stellen, und welche davon eine Website lädt, bestimmt die Form des Tokens, das sie zurückerwartet. Senden Sie api_server nur dann, wenn die Zielseite nicht den Standard verwendet.
| api_server | Token | Standard | Beschreibung |
|---|---|---|---|
| https://cdn.captchafox.com/ | Einfaches | Ja | Das Standard-Widget, das die große Mehrheit der Websites verwendet. Genau das lädt CapSkip, wenn Sie nichts senden. |
| https://s.uicdn.com/mampkg/ | MAM_ als Präfix | Nein | Der gebündelte Build, den manche Plattformen einbetten. Er liefert ein Token mit dem Präfix MAM_. Übergeben Sie den vollständigen Paketpfad genau so, wie er im Script-Tag der Seite steht. |
Lesen Sie den Wert aus dem <script> Tag aus, das das Widget auf der Zielseite lädt. Wenn Sie die falsche Quelle senden, gelingt das Lösen zwar weiterhin, aber das Token kommt in einem Format zurück, das die Zielseite nicht akzeptiert, was eher wie ein stilles Scheitern der Prüfung wirkt als wie ein Fehler.
Capy Puzzle ist ein Drag-and-Drop-Captcha: Aus einem Foto wird ein Teil ausgeschnitten, und der Besucher schiebt es zurück in die Lücke, aus der es stammt. CapSkip liefert die drei Werte zurück, die das Widget in die Seite geschrieben hätte, bereit zum Absenden mit Ihrem Formular.
So funktioniert es
Capy ist unter den Captchas auf dieser Seite insofern ungewöhnlich, als kein Bestandteil einer Challenge von einem Server ausgestellt wird. Das Widget erzeugt seinen eigenen Challenge-Key, fordert bei der Capy API das Puzzle an, das zu diesem Schlüssel gehört, und der Besucher zieht das Teil an seinen Platz. Es gibt kein Token, das vorab abgeholt werden müsste, und keinen Handshake, der nachgespielt werden müsste.
Die Antwort ist keine Koordinate. Das Widget zeichnet den Pfad auf, entlang dessen das Teil gezogen wurde, und kodiert ihn als Zeichenfolge. Was Sie an die Zielseite zurücksenden, ist damit eine plausible Ziehbewegung und kein Zielpunkt. CapSkip erstellt diesen Pfad für Sie.
Der vollständige Ablauf umfasst vier Schritte:
- Lesen Sie den Captcha-Schlüssel von der Zielseite ab.
- Senden Sie sie an
/in.phpmitmethod=capy. - Fragen Sie
/res.phpab, bis die Lösung bereit ist. - Übermitteln Sie die drei zurückgegebenen Werte im Formular der Zielseite.
Was Sie vor dem Lösen benötigen
Zwei Werte, und beide werden direkt von der Zielseite abgelesen.
| Parameter | Woher es kommt |
|---|---|
| captchakey | Der öffentliche Capy-Schlüssel der Website, üblicherweise mit dem Präfix PUZZLE_. Er erscheint im Quelltext der Seite als capy_captchakey, und als Query-Parameter k in der URL des Widget-Scripts. |
| pageurl | Die vollständige URL der Seite, auf der das Widget erscheint. Capy sieht diesen Wert nie, aber Schlüssel werden für bestimmte Websites registriert, senden Sie also die echte Seite. |
Es gibt einen dritten Wert, der eine Prüfung wert ist: api_server, also die Basis-URL der Capy API, hinter der der Schlüssel liegt. Lesen Sie ihn aus demselben Script-Tag aus. Standardmäßig verwendet CapSkip https://jp.api.capy.me, wo der Live-Dienst erreichbar ist. Einen anderen Wert müssen Sie nur dann angeben, wenn die Zielseite auf eine andere Adresse verweist.
Einige Captcha-Dienste dokumentieren nach wie vor api.capy.me ohne das regionale Präfix. Dieser Host wird nicht mehr aufgelöst. Wenn Sie ihn von anderswo übernommen haben, entfernen Sie ihn und lassen Sie CapSkip seinen Standardwert verwenden.
Wo Sie den Captcha-Schlüssel finden
Öffnen Sie auf der Zielseite die Entwicklertools des Browsers und suchen Sie nach dem Capy-Widget. Der Schlüssel ist in beiden Varianten sichtbar, mit denen Websites das Widget laden.
<!-- In the page source, as the widget configuration -->
<div id="capy"></div>
<script>
window.capyOptions = {
captchakey: "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
puzzle_div: "capy"
};
</script><!-- Or in the script URL itself, as the k parameter -->
<script src="https://jp.api.capy.me/puzzle/get_js/?k=PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v"></script>Die Basis dieser Script-URL, https://jp.api.capy.me/ im Beispiel oben, ist der Wert, den Sie bei Bedarf als api_server senden.
Die Antwort besteht aus drei Werten, nicht aus einem Token
Das ist der eine strukturelle Unterschied zu allen anderen Methoden auf dieser Seite, und es lohnt sich, ihn zu kennen, bevor Sie Ihren Client schreiben. reCAPTCHA, Turnstile und CaptchaFox liefern jeweils eine einzige undurchsichtige Zeichenfolge zurück. Eine Capy-Lösung besteht aus drei getrennten Werten, die nur zusammen funktionieren.
| Zurückgegebener Wert | Gehört in dieses Formularfeld der Zielseite |
|---|---|
| captchakey | capy_captchakey |
| challengekey | capy_challengekey |
| answer | capy_answer |
Weil ein einfaches OK|<token> Platz für einen Wert hat und nicht für drei, gibt /res.php bei dieser Methode das gesamte Lösungsobjekt zurück. Die Klartext-Antwort enthält es, und ebenso das Feld request einer JSON-Antwort. Ein viertes Feld, respKey, wird als leere Zeichenfolge zurückgegeben, damit Clients kompatibel bleiben, die gegen andere Dienste geschrieben wurden. Es trägt bei einem Puzzle-Lösevorgang keine Information und kann ignoriert werden.
Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| method | String | Ja | Muss sein capy. Gibt an, dass Sie ein Capy Puzzle-Captcha übermitteln. |
| captchakey | String | Ja | Der von der Zielseite abgelesene Captcha-Schlüssel, üblicherweise mit dem Präfix PUZZLE_. sitekey und websiteKey werden als Aliase akzeptiert. |
| pageurl | String | Ja | Die vollständige URL der Seite, auf der das Widget erscheint. |
| api_server | String | Nein | Die Basis-URL der Capy API, hinter der der Schlüssel liegt. Standardwert ist https://jp.api.capy.me. |
| version | String Standard: puzzle | Nein | Die Challenge-Familie. Nur puzzle wird gelöst. Siehe Puzzle und Avatar weiter unten. |
| userAgent | String | Nein | Der User-Agent, der mit der Puzzle-Anfrage gesendet wird. Optional und nur selten nötig. |
| proxy | String | Nein | Proxy-Adresse. Akzeptiert IP:PORT, LOGIN:PASSWORD@IP:PORT oder IP:PORT:LOGIN:PASSWORD. |
| proxytype | String | Nein | Proxy-Typ: HTTP, HTTPS, SOCKS5 oder SOCKS5H. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
CapSkip erzwingt für diese Methode keinen Proxy, aber sobald Sie in größerem Umfang lösen, brauchen Sie Proxys. Jede Lösung ruft über eine Live-Anfrage ein frisches Puzzle von der Capy-API ab, und ein stetiger Strom solcher Anfragen von einer Adresse ist genau das Muster, für dessen Erkennung Rate Limiting gebaut ist. Für Tests und gelegentliche Lösungen genügt eine Adresse. Darüber hinaus richten Sie in CapSkip einen Proxy-Pool ein und lassen ihn die Last verteilen, oder Sie senden einen Proxy pro Anfrage, wenn eine Lösung aus einem bestimmten Netz kommen muss.
Senden Sie eine HTTP-GET- oder POST-Anfrage an Ihren CapSkip-API-Endpunkt (/in.php) mit method=capy. Formularfelder, ein Query-String und ein JSON-Body werden alle unter identischen Feldnamen akzeptiert, denn Capy bringt kein Bild zum Hochladen mit.
Capy Puzzle übermitteln (Formularfelder):
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=capy" \ -d "captchakey=PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v" \ -d "pageurl=https://www.example.com/login" \ -d "json=1" \ http://127.0.0.1:8080/in.php
Capy Puzzle übermitteln (JSON-Body):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "capy",
"captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
"api_server": "https://jp.api.capy.me/",
"pageurl": "https://www.example.com/login",
"json": 1
}' \
http://127.0.0.1:8080/in.phpWenn alles korrekt ist, gibt CapSkip die Captcha-ID als reinen Text zurück: OK|2122988149. Wenn der Parameter json=1 gesendet wurde, ist die Antwort stattdessen ein JSON-Envelope. So oder so ist der zurückgegebene Wert die Captcha-ID, die Sie für das Ergebnis abfragen.
{
"status": 1,
"request": "2122988149"
}Andernfalls gibt CapSkip einen passenden Fehlercode zurück. Ein fehlender Captcha-Schlüssel, eine unbrauchbare Seiten-URL oder ein api_server mit einem Wert, der keine URL ist, wird bereits bei der Übermittlungsanfrage selbst abgelehnt und nicht erst beim Abfragen des Ergebnisses, sodass Sie es bei genau der Anfrage erfahren, die falsch war.
Warten Sie etwa 3 Sekunden und senden Sie dann eine HTTP-GET-Anfrage an den Ergebnis-Endpunkt (/res.php) mit der erhaltenen Captcha-ID. Ein Lösevorgang wird absichtlich bis zu einer für Menschen plausiblen Dauer zurückgehalten, bevor er zurückgegeben wird. Den Grund dafür finden Sie im Abschnitt Timing weiter unten.
Liste der GET-Anfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| action | String | Ja | Angeben get um die Captcha-Lösung abzurufen. |
| id | Integer | Ja | Die vom zurückgegebene Captcha-ID in.php Anfrage. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
Wenn das Captcha gelöst wurde, gibt CapSkip die Lösung im JSON-Format zurück:
{
"status": 1,
"request": {
"captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
"challengekey": "BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP",
"answer": "0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx0x26x68x0x2gx5kx0x34x50x",
"respKey": ""
},
"solution": {
"captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
"challengekey": "BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP",
"answer": "0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx0x26x68x0x2gx5kx0x34x50x",
"respKey": ""
},
"cost": "0.00299",
"createTime": 1788863246,
"endTime": 1788863250,
"errorId": 0,
"solveCount": 1
}request und solution enthalten dasselbe Objekt, lesen Sie also den Wert aus, den Ihr Client erwartet. Ohne json=1: Dasselbe Objekt folgt als einzelne JSON-Zeile auf das Präfix OK| , und genau das gibt ein Client zurück, der res.php als Klartext liest:
OK|{"captchakey":"PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v","challengekey":"BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP","answer":"0xax8ex0xax84x0xkx7qx","respKey":""}Wenn das Captcha noch nicht gelöst wurde, antwortet CapSkip mit CAPCHA_NOT_READY, genau so geschrieben wie bei jeder anderen Methode. Warten Sie 3 Sekunden und wiederholen Sie die Anfrage.
Jedes Ergebnis wird nur einmal ausgeliefert. Die erste erfolgreiche Abfrage gibt die Lösung zurück und verwirft sie, jede spätere Abfrage derselben ID liefert einen leeren Antworttext. Bewahren Sie die Werte daher aus der Antwort auf, die sie geliefert hat.
Die Lösung übermitteln
Die drei Werte gehören in die Formularfelder, die das Capy-Widget selbst ausgefüllt hätte. Übermitteln Sie sie unverändert:
<input type="hidden" name="capy_captchakey" value="PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v"> <input type="hidden" name="capy_challengekey" value="BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP"> <input type="hidden" name="capy_answer" value="0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx">
Verändern Sie den Wert von answer nicht: nicht kürzen, nicht neu kodieren und nicht anderweitig bereinigen. Er ist der Ziehpfad, den das Widget aufgezeichnet hätte, und das Backend der Zielseite prüft ihn gegen die ausgestellte Challenge, sodass jede Änderung ihn ungültig macht.
Der Challenge-Key ist nur einmal verwendbar und kurzlebig. CapSkip erzeugt für jeden Lösevorgang einen neuen, und das Puzzle ist daran gebunden. Übermitteln Sie die drei Werte daher zügig, statt sie zwischenzuspeichern, und verwenden Sie einen challengekey niemals ein zweites Mal.
Timing: Capy lehnt zu schnell eintreffende Antworten ab
Das ist der Teil von Capy, der Sie einen Tag kostet, wenn Sie selbst dagegen entwickeln. Capy misst den tatsächlich verstrichenen Abstand zwischen der Ausgabe des Puzzles und dem Eintreffen der Antwort und lehnt alles ab, was übermenschlich wirkt. Die Ablehnung kommt mit derselben Meldung wie bei einer falschen Antwort, sodass ein völlig korrekter Lösevorgang, der nach 200 Millisekunden zurückkommt, von einem defekten Löser nicht zu unterscheiden ist.
Gemessen auf der eigenen Anmeldeseite von Capy, bei durchgehend korrekter Antwort:
| Zeit vom Puzzle bis zur Verifizierung | Ergebnis |
|---|---|
| 0.48 seconds | Refused |
| 1.03 Sekunden und mehr, getestet bis 4 Sekunden | Accepted |
CapSkip hält deshalb jedes Ergebnis zurück, bis seit dem Abruf des Puzzles genügend Zeit verstrichen ist, ungefähr das Doppelte der gemessenen Untergrenze, denn diese Untergrenze gehört Capy und kann sich verschieben. Die Wartezeit wird automatisch auf jede Lösung angewendet, und es gibt nichts einzustellen. Sie kostet Latenz und keinen Durchsatz, und wenn Sie das Ergebnis abfragen, bleibt sie unsichtbar, weil die Aufgabe dann einfach rund zwei Sekunden dauert.
Puzzle und Avatar
Capy veröffentlicht zwei Challenge-Familien. Es sind unterschiedliche Challenges hinter unterschiedlichen Endpunkten, und CapSkip löst eine davon.
| version | Challenge | Unterstützt | Beschreibung |
|---|---|---|---|
| puzzle | Assemble a puzzle | Ja | Der Standard, und das, was fast jede Installation verwendet. Ein Teil wird zurück in die Lücke gezogen, aus der es ausgeschnitten wurde. |
| avatar | Drag an object | Nein | Ein eigener Challenge-Typ. Wird bei der Übermittlung mit ERROR_BAD_PARAMETERS abgelehnt, statt beantwortet zu werden. |
Wird kein version gesendet, gilt puzzle, daher setzen die meisten Integrationen ihn nie. Eine Anfrage mit avatar wird bewusst abgelehnt und nicht versucht: Eine Antwort als Puzzle würde eine Lösung liefern, die die Zielseite ablehnt, und das ist schlimmer als ein klarer Fehler, weil es nach einem versagenden Löser aussieht und nicht nach einer nicht unterstützten Challenge.
Friendly Captcha lässt den Browser des Besuchers eine Rechenaufgabe erledigen, statt vom Besucher selbst etwas zu verlangen. Es gibt kein Bild zum Anklicken, keinen Schieberegler und keine Audio-Alternative, also nichts auf dem Bildschirm, was man falsch machen könnte. CapSkip liefert das Token zurück, das das Widget erzeugt hätte, bereit zum Absenden mit Ihrem Formular.
So funktioniert es
Friendly Captcha ist ein Proof-of-Work-Captcha. Das Widget erhält eine Schwierigkeitseinstellung, sucht nach Werten, deren Hash darunter liegt, und schreibt das Ergebnis in ein verstecktes Feld in Ihrem Formular. Dem Besucher wird nie etwas angezeigt, und genau das ist der Sinn des Produkts: Eine Seite, die es verwendet, sieht aus wie eine Seite ganz ohne Captcha.
Unter diesem einen Namen werden zwei völlig verschiedene Protokolle ausgeliefert, und ein sitekey verrät Ihnen nicht, welches davon eine Website verwendet. Sie teilen sich eine Marke und einen Namensraum für sitekeys, sonst nichts. Die Entscheidung zwischen beiden ist das Erste, was eine Integration richtig treffen muss, deshalb hat sie weiter unten einen eigenen Abschnitt.
Der vollständige Ablauf umfasst vier Schritte:
- Lesen Sie den sitekey von der Zielseite ab, und mit ihm die URL des Widget-Scripts.
- Übermitteln Sie beides an
/in.phpmitmethod=friendly_captcha. - Fragen Sie
/res.phpab, bis der Token bereit ist. - Tragen Sie das Token in das Formularfeld ein, das das Widget ausgefüllt hätte, und senden Sie das Formular ab.
Die Lösezeit ist bei dieser Methode keine Konstante. Der Dienst entscheidet im Moment der Anfrage, wie viel Arbeit sie wert ist, sodass derselbe sitekey zu einem Zeitpunkt deutlich teurer sein kann als zu einem anderen. Planen Sie das in Ihrem Polling ein, statt von einer festen Dauer auszugehen.
Was Sie vor dem Lösen benötigen
Zwei Werte sind erforderlich, und ein dritter lohnt sich immer dann, wenn Sie ihn bekommen können.
| Parameter | Woher es kommt |
|---|---|
| sitekey | The data-sitekey Attribut des Widget-Elements, also des Elements mit class="frc-captcha". |
| pageurl | Die vollständige URL der Seite, auf der das Widget erscheint. |
| module_script | The src des Widget-Script-Tags mit type="module". Nicht erforderlich, aber genau daran erkennt CapSkip, welche Protokollversion die Website verwendet; senden Sie es also, wenn die Seite eines hat. |
Version 1 und Version 2
Das ist der Teil, der Sie einen Nachmittag kostet, wenn Sie ihn überspringen. Beide Versionen sind aktiv, beide sind im Einsatz, und ein sitekey, der für die eine registriert ist, antwortet auch am Endpunkt der anderen. Lösen Sie die falsche, erhalten Sie ein wohlgeformtes Token, das die Zielseite ablehnt, ohne dass irgendwo ein Hinweis darauf auftaucht, dass die Version das Problem war.
| version | Widget-Paket | Unterstützt | Beschreibung |
|---|---|---|---|
| v1 | friendly-challenge | Ja | Das ursprüngliche Open-Source-Widget. Sein Script ist widget.module.min.js oder widget.min.js. Die Standardannahme, wenn nichts anderes darauf hindeutet. |
| v2 | @friendlycaptcha/sdk | Ja | Das aktuelle SDK. Sein Script ist site.min.js. Eine Seite, die dieses Script lädt, ist v2, egal wie sie sonst aussieht. |
CapSkip ermittelt die Version in dieser Reihenfolge und hört bei der ersten Antwort auf:
- The
versionParameter, sofern Sie einen gesendet haben.v1undv2sind die Schreibweisen; ein bloßes1oder2wird ebenfalls akzeptiert. - Die URL des Widget-Scripts, aus
module_scriptodernomodule_script. Das ist das zuverlässigste Signal überhaupt, denn es ist der Build, den die Website tatsächlich lädt. - Fehlen beide, gilt
v1.
CapSkip fragt den Dienst nicht, zu welcher Version ein sitekey gehört, denn der Dienst antwortet für beide. Senden Sie version, oder senden Sie die Script-URL, dann stellt sich die Frage gar nicht.
Wo Sie den sitekey finden
Öffnen Sie auf der Zielseite die Entwicklertools des Browsers und suchen Sie nach dem Widget-Element. Der sitekey und das Script stehen im Quelltext der Seite direkt nebeneinander, und zusammen liefern sie alles, was diese Methode braucht.
<!-- Version 1: the friendly-challenge widget --> <div class="frc-captcha" data-sitekey="FCMEXAMPLE1234AB"></div> <script type="module" src="https://cdn.example.com/[email protected]/widget.module.min.js"></script> <script nomodule src="https://cdn.example.com/[email protected]/widget.min.js"></script><!-- Version 2: the @friendlycaptcha/sdk widget --> <div class="frc-captcha" data-sitekey="FCMEXAMPLE1234AB"></div> <script type="module" src="https://cdn.example.com/@friendlycaptcha/[email protected]/site.min.js"></script>
Manche Installationen liefern das Script von ihrer eigenen Domain aus statt von einem CDN. Entscheidend ist der Dateiname, nicht der Host, von dem es kommt.
Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| method | String | Ja | Muss sein friendly_captcha. Gibt an, dass Sie ein Friendly Captcha übermitteln. |
| sitekey | String | Ja | The data-sitekey Wert, der auf der Zielseite vom Widget-Element abgelesen wird. |
| pageurl | String | Ja | Die vollständige URL der Seite, auf der das Widget erscheint. |
| version | String Standard: v1 | Nein | Die Protokollversion, v1 oder v2. Siehe Version 1 und Version 2 weiter oben. |
| module_script | String | Nein | The src des Widget-Script-Tags mit type="module". Dient dazu, die Version zu ermitteln, wenn version nicht gesendet wurde. |
| nomodule_script | String | Nein | The src des Widget-Script-Tags mit nomodule. Wird aus demselben Grund gelesen. |
| api_server | String | Nein | Nur in CapSkip. Der Endpunkt der Datenresidenz, zu dem der sitekey gehört. Akzeptiert global (Standard), eu, oder eine vollständige URL. Siehe Datenresidenz weiter unten. |
| useragent | String | Nein | Der User-Agent, der mit der Anfrage gesendet wird. Optional und nur selten nötig. |
| proxy | String | Nein | Proxy-Adresse. Akzeptiert IP:PORT, LOGIN:PASSWORD@IP:PORT oder IP:PORT:LOGIN:PASSWORD. |
| proxytype | String | Nein | Proxy-Typ: HTTP, HTTPS, SOCKS5 oder SOCKS5H. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
CapSkip erzwingt für diese Methode keinen Proxy, und Sie werden hier früher einen brauchen als fast überall sonst auf dieser Seite. Der Dienst entscheidet, wie viel Arbeit jede Anfrage wert ist, und er erhöht diesen Wert für Adressen, die er schon oft gesehen hat: Gemessen an einem sitekey von einer einzigen Adresse aus stieg die Schwierigkeitseinstellung im Lauf einer Testsitzung stetig an, und die veröffentlichte Spanne zwischen einer frischen und einer stark genutzten Adresse liegt bei knapp dem Dreißigfachen an Arbeit für dasselbe Token. Eine Adresse reicht zum Testen und für gelegentliche Lösungen. Darüber hinaus richten Sie in CapSkip einen Proxy-Pool ein und lassen ihn die Last verteilen, oder Sie senden einen Proxy pro Anfrage, wenn eine Lösung aus einem bestimmten Netzwerk kommen muss.
Senden Sie eine HTTP-GET- oder POST-Anfrage an Ihren CapSkip-API-Endpunkt (/in.php) mit method=friendly_captcha. Formularfelder, ein Query-String und ein JSON-Body werden alle unter identischen Feldnamen akzeptiert, denn diese Methode überträgt kein Bild, das hochgeladen werden müsste.
Friendly Captcha übermitteln (Formularfelder):
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=friendly_captcha" \ -d "sitekey=FCMEXAMPLE1234AB" \ -d "pageurl=https://www.example.com/signup" \ -d "version=v2" \ -d "json=1" \ http://127.0.0.1:8080/in.php
Friendly Captcha übermitteln (JSON-Body, mit den Script-URLs statt einer explizit angegebenen Version):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "friendly_captcha",
"sitekey": "FCMEXAMPLE1234AB",
"pageurl": "https://www.example.com/signup",
"module_script": "https://cdn.example.com/@friendlycaptcha/[email protected]/site.min.js",
"nomodule_script": "https://cdn.example.com/@friendlycaptcha/[email protected]/site.compat.js",
"json": 1
}' \
http://127.0.0.1:8080/in.phpWenn alles korrekt ist, gibt CapSkip die Captcha-ID als reinen Text zurück: OK|2122988149. Wenn der Parameter json=1 gesendet wurde, ist die Antwort stattdessen ein JSON-Envelope. So oder so ist der zurückgegebene Wert die Captcha-ID, die Sie für das Ergebnis abfragen.
{
"status": 1,
"request": "2122988149"
}Andernfalls gibt CapSkip einen passenden Fehlercode zurück. Ein fehlender sitekey oder eine unbrauchbare Seiten-URL wird bereits bei der Übermittlungsanfrage selbst abgelehnt und nicht erst beim Abfragen, sodass Sie es bei genau der Anfrage erfahren, die falsch war.
Warten Sie etwa 5 Sekunden und senden Sie dann eine HTTP-GET-Anfrage an den Ergebnis-Endpunkt (/res.php) mit der Captcha-ID, die Sie erhalten haben.
Liste der GET-Anfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| key | String | Ja* | Ihr CapSkip-API-Schlüssel. Nur erforderlich, wenn API-Schlüssel-Validierung aktiviert ist. |
| action | String | Ja | Angeben get um die Captcha-Lösung abzurufen. |
| id | Integer | Ja | Die vom zurückgegebene Captcha-ID in.php Anfrage. |
| json | Integer Standard: 0 | Nein | 0 gibt die Antwort als Klartext zurück. 1 gibt die Antwort als JSON zurück. |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
Wenn das Captcha gelöst wurde, gibt CapSkip das Token im JSON-Format zurück. Das Token steht in request, und solution.token enthält dieselbe Zeichenfolge für Clients, die es dort erwarten:
{
"status": 1,
"request": "c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB",
"solution": {
"token": "c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB"
},
"cost": "0.00299",
"createTime": 1789667786,
"endTime": 1789667807,
"errorId": 0,
"solveCount": 1
}Fehlt json=1, folgt dasselbe Token als Klartext auf das Präfix OK| und ist damit genau das, was ein Client zurückgibt, der res.php als Text liest:
OK|c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB
Wenn das Captcha noch nicht gelöst wurde, antwortet CapSkip mit CAPCHA_NOT_READY, genau so geschrieben wie bei jeder anderen Methode. Warten Sie 5 Sekunden und wiederholen Sie die Anfrage.
Jedes Ergebnis wird genau einmal ausgeliefert. Die erste erfolgreiche Abfrage gibt das Token zurück und verwirft es, und jede spätere Abfrage für dieselbe ID liefert einen leeren Body, heben Sie das Token also aus der Antwort auf, die es geliefert hat.
Die beiden Versionen erzeugen Token von sehr unterschiedlicher Form und Größe. Ein v1-Token besteht aus vier durch Punkte getrennten Teilen und kommt auf ein paar hundert Zeichen, wie oben zu sehen. Ein v2-Token ist eine einzige undurchsichtige Zeichenfolge, die mit AQQA. beginnt und rund sechs Kilobyte lang ist. Achten Sie also darauf, dass alles, was es transportiert (ein verstecktes Feld, eine Datenbankspalte oder eine weitergeleitete Anfrage), dafür ausgelegt ist.
Den Token einreichen
Das Token gehört in das versteckte Feld, das das Widget selbst ausgefüllt hätte, und die beiden Versionen verwenden nicht denselben Feldnamen. Daran scheitern Leute, die eine funktionierende v1-Integration auf eine v2-Website übertragen.
| version | Formularfeld, in das das Token gehört |
|---|---|
| v1 | frc-captcha-solution |
| v2 | frc-captcha-response |
<!-- Version 1 --> <input type="hidden" name="frc-captcha-solution" value="c62c4da3...AgAB"><!-- Version 2 --> <input type="hidden" name="frc-captcha-response" value="AQQA.vW7kd3CujKT8PaQgEcW18QaH...">
Übermitteln Sie das Token unverändert. Kürzen Sie es nicht, kodieren Sie es nicht neu und entfernen Sie nichts, was nach Füllzeichen aussieht: Jeder Teil davon wird gegen die Challenge geprüft, für die es ausgestellt wurde, jede Änderung macht es also ungültig.
Eine Website darf dieses Feld umbenennen, und manche tun das. Wenn die Seite, mit der Sie integrieren, einen anderen Namen verwendet, lesen Sie den Namen am Widget-Element ab und nehmen Sie stattdessen diesen. Wenn die Seite einen Callback für das Widget definiert, erledigt ein Aufruf mit dem Token als einzigem Argument dieselbe Aufgabe.
Datenresidenz
Friendly Captcha betreibt getrennte Endpunkte für verschiedene Regionen der Datenresidenz, und ein sitekey gehört zu einer davon. Beide stellen für denselben sitekey ein Token aus, wenn Sie die Anfrage also an den falschen schicken, entsteht ein Token, das hier vollkommen gültig aussieht und von der Zielseite mit nichts Aussagekräftigerem als einer fehlgeschlagenen Prüfung abgelehnt wird.
Das Widget nennt seine Region in einem data-api-endpoint Attribut. Wenn die Zielseite eines enthält, übergeben Sie denselben Wert als api_server. Dieser Parameter existiert nur in CapSkip und hat anderswo keine Entsprechung, daher sendet ihn ein Client, der für einen anderen Dienst geschrieben wurde, nicht: Ergänzen Sie ihn selbst, wenn die Zielseite auf einem regionalen Endpunkt liegt.
| api_server | Was damit ausgewählt wird |
|---|---|
| global | Der Standard. Wird verwendet, wenn das Attribut fehlt, was der Normalfall ist. |
| eu | Der europäische Endpunkt, ausgewählt durch data-api-endpoint="eu". |
| A full URL | Eine selbst gehostete oder anderweitig angepasste Installation. Senden Sie den Endpunkt genau so, wie die Seite ihn angibt. |
Proxys verwenden
Für reCAPTCHA v2, v3, Invisible, Enterprise und Cloudflare können Sie mit jeder Aufgabe einen Proxy senden. CapSkip löst das Captcha dann über diesen Proxy, anstatt den in der CapSkip-Anwendung konfigurierten Proxy-Pool zu verwenden.
Das ist nützlich, wenn die Zielwebsite prüft, ob der Captcha-Token von derselben IP-Adresse wie Ihre eigenen Anfragen erzeugt wurde, zum Beispiel bei Websites hinter Cloudflare, strengem reCAPTCHA-Scoring oder geografisch eingeschränkten Seiten.
Liste der POST-Request-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| proxy | String | Nein | Proxy-Adresse. Format für die IP-Authentifizierung: IP:PORT (Beispiel: 123.123.123.123:3128). Format für die Anmeldung mit Login/Passwort: login:password@IP:PORT |
| proxytype | String | Nein | Art des Proxys. Unterstützte Werte: HTTP, HTTPS, SOCKS5, SOCKS5H. Standard: HTTP wenn proxy wird bereitgestellt, aber proxytype weggelassen wird. |
Fehlercodes
| Code | Bedeutung |
|---|---|
ERROR_KEY_DOES_NOT_EXIST | Ungültiger API-Schlüssel. |
ERROR_WRONG_USER_KEY | API-Schlüssel fehlt oder ist leer. |
ERROR_WRONG_METHOD | Ungültige HTTP-Methode oder action -Parameter. |
ERROR_WRONG_ID_FORMAT | Ungültiges Captcha-ID-Format. |
ERROR_BAD_PARAMETERS | Fehlende oder ungültige Pflichtparameter. |
ERROR_UPLOAD | Keine Bilddaten bereitgestellt oder Upload fehlgeschlagen. |
ERROR_INVALID_IMAGE | Ungültiges Bildformat oder beschädigte Bilddaten. |
ERROR_INVALID_BASE64 | Ungültige base64-Kodierung. |
ERROR_TOO_BIG_CAPTCHA_FILESIZE | Bildgröße überschreitet 600 kB oder Abmessungen überschreiten 1000px. |
ERROR_CAPTCHA_UNSOLVABLE | Captcha konnte nicht gelöst werden. Senden Sie eine neue Aufgabe und versuchen Sie es erneut. |
ERROR_GOOGLEKEY | Ungültig googlekey -Parameter. |
ERROR_PAGEURL | Ungültig pageurl -Parameter. |
ERROR_ZERO_BALANCE | Der API-Schlüssel hat für diese Methode kein Guthaben mehr. |
ERROR_PROXY_FORMAT | The proxy Wert konnte nicht geparst werden. |
CAPCHA_NOT_READY | Das Captcha wird noch verarbeitet. Fragen Sie weiter ab. |
| (leere Antwort) | Das Ergebnis wurde bereits abgerufen, oder die ID existiert nicht. |
