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

reCAPTCHA v2 hat drei Varianten, und in PHP sind sie eine Methode mit einem Options-Array. Checkbox ist der bloße Aufruf, Invisible und Enterprise sind Flags, und beide lassen sich zusammen setzen. PHP ist außerdem das eine CapSkip SDK ganz ohne Async-Ansatz, was den Code vereinfacht, aber ändert, wie Sie Massenarbeit strukturieren sollten.
Einrichtung
# PHP 8.0 or newer. Needs the curl and json extensions, # both of which ship with almost every PHP install. composer require capskip/capskip
CapSkip löst auf Ihrer eigenen Maschine, die Desktop-App muss also laufen. Richten Sie den Client auf den Port aus den Einstellungen aus:
use CapSkip\CapSkip;
$solver = new CapSkip([
'apiKey' => 'capskip', // any string when key validation is off
'host' => '127.0.0.1',
'port' => 8080,
'recaptchaTimeout' => 300, // seconds
]);Lesen Sie diese in der Produktion aus der Umgebung:
use CapSkip\CapSkip;
$solver = new CapSkip([
'apiKey' => getenv('CAPSKIP_API_KEY') ?: 'capskip',
'host' => getenv('CAPSKIP_HOST') ?: '127.0.0.1',
'port' => (int) (getenv('CAPSKIP_PORT') ?: 8080),
]);Die drei Varianten
| Variante | Option zum Hinzufügen |
|---|---|
| Checkbox | keine |
| Invisible | ['invisible' => 1] |
| Enterprise | ['enterprise' => 1] |
| Invisible Enterprise | beide Schlüssel |
// Checkbox: sitekey and page URL only.
$result = $solver->recaptcha(
'6Lc...YOUR_SITEKEY',
'https://example.com/login'
);
echo $result['code']; // g-recaptcha-response token
// Invisible.
$result = $solver->recaptcha($sitekey, $pageUrl, ['invisible' => 1]);
// Enterprise, and both together.
$result = $solver->recaptcha($sitekey, $pageUrl, ['enterprise' => 1]);
$result = $solver->recaptcha($sitekey, $pageUrl, [
'enterprise' => 1,
'invisible' => 1,
]);Der Rückgabewert ist ein assoziatives Array, daher $result['code'] ist der Token. $result['captchaId'] ist ebenfalls vorhanden, falls Sie protokollieren möchten, welche Lösung ihn erzeugt hat.
Die Eingaben richtig hinbekommen
Der sitekey ist der data-sitekey Attribut auf dem Widget-Container oder das erste Argument von grecaptcha.render wenn der Invisible-Modus bedeutet, dass es keinen Container gibt, den man betrachten könnte. Es beginnt immer mit 6L und ist öffentlich.
Die URL muss die Seite sein, auf der das Widget gerendert wird. Das Übergeben Ihres Formular-Handlers oder einer Weiterleitung nach dem Login ist die übliche Ursache für einen Token, der problemlos gelöst wird und dann bei der Verifizierung scheitert.
Den Token übermitteln
$ch = curl_init('https://example.com/login');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'g-recaptcha-response' => $result['code'],
'username' => '...',
'password' => '...',
]),
]);
$response = curl_exec($ch);
curl_close($ch);Tokens sind zum einmaligen Gebrauch und halten etwa zwei Minuten, lösen Sie also so spät wie möglich im Ablauf. Wenn die Website den Token an einen JavaScript-Callback statt an ein Formularfeld übergibt, ist das Lösen identisch, aber das Absenden unterscheidet sich. Unser reCAPTCHA-v2-Callback-Löser -Seite behandelt diese Form.
Fehler und der Namespace, den man übersieht
PHP legt seine Exceptions unter einem eigenen Namespace ab, was jeden stolpern lässt, der Imports aus den Python- oder Node-Beispielen kopiert:
use CapSkip\CapSkip;
use CapSkip\Exceptions\ValidationException;
use CapSkip\Exceptions\NetworkException;
use CapSkip\Exceptions\ApiException;
use CapSkip\Exceptions\TimeoutException;
try {
$result = $solver->recaptcha($sitekey, $pageUrl);
} catch (ValidationException $e) {
// missing or malformed arguments
} catch (NetworkException $e) {
// CapSkip is not running on the configured port
} catch (ApiException $e) {
// the sitekey or pageurl was rejected
} catch (TimeoutException $e) {
// exceeded recaptchaTimeout
}Alle vier erweitern CapSkip\Exceptions\CapSkipError, sodass ein einziges catch auf der Basisklasse alles abfängt, wenn Sie Fehler lieber an einer Stelle behandeln möchten.
Mehrere lösen
PHP wird synchron ausgeführt, sodass jede Lösung blockiert, bis sie abgeschlossen ist:
use CapSkip\CapSkip;
$solver = new CapSkip();
foreach ($targets as $target) {
$results[] = $solver->recaptcha($target['sitekey'], $target['url']);
}Das Paket exportiert AsyncCapSkip, aber in PHP ist es nur ein Alias, damit aus den anderen SDKs portierter Code weiter läuft. Es fügt keine Nebenläufigkeit hinzu. Für echte Parallelität führen Sie mehrere Worker-Prozesse aus oder verwenden eine Queue, statt zu erwarten, dass das SDK Lösungen überlappt.
Einen Proxy verwenden
$result = $solver->recaptcha($sitekey, $pageUrl, [
'proxy' => ['type' => 'HTTPS', 'uri' => 'user:[email protected]:3128'],
]);Proxys werden für reCAPTCHA, Turnstile und GeeTest unterstützt, aber nicht für Bild-Captchas, die aus den Bild-Bytes gelöst werden und die Zielseite nie erreichen.
Häufig gestellte Fragen
Muss ich das Ergebnis abfragen?
Nein. Das SDK pollt intern und gibt den fertigen Token zurück, sodass CAPCHA_NOT_READY erreicht Ihren Code nie. Es beginnt nach 250 ms mit der Prüfung und wird von da an langsamer.
Blockiert eine Lösung meine Web-Anfrage?
Ja, und das ist in PHP von Bedeutung. Eine reCAPTCHA-Lösung kann mehrere Sekunden dauern, sodass das Ausführen innerhalb eines Seiten-Renderings einen Worker blockiert. Verlagern Sie das Lösen in einen Warteschlangen-Job oder einen CLI-Worker, anstatt einen Anfrage-Thread zu blockieren.
Was sind die Voraussetzungen?
PHP 8.0 oder neuer mit der curl und json Erweiterungen, beide bei den meisten Installationen mitgeliefert. Es gibt keine weiteren Laufzeitabhängigkeiten, sodass es sich in ein bestehendes Projekt einfügt, ohne einen ganzen Baum von Paketen nachzuziehen.
Zusammenfassung
Eine Methode, drei Varianten, ausgewählt mit invisible und enterprise im options-Array. Lesen Sie $result['code'], übermitteln Sie es als g-recaptcha-response, importieren Sie Exceptions von CapSkip\Exceptions, und halten Sie Lösungen von Ihren Anfrage-Threads fern.
Der umfassendere PHP-Funktionsumfang befindet sich auf der PHP-Captcha-Löser Seite, andere Sprachen auf der reCAPTCHA-v2-Löser Seite, und es gibt eine Live-v2-Demo zum Testen. CapSkip ist ein lokaler Captcha-Löser, sodass nichts pro Lösung abgerechnet wird.
