Die CAPTCHA-API aus Laravel aufrufen

Von solvethree3 Min. Lesezeit

Verwenden Sie den HTTP-Client von Laravel, um einen solvethree-Task zu erstellen, und rufen Sie ihn anschließend über seine ID ab. Belassen Sie den API-Schlüssel und die Proxy-Zugangsdaten auf dem Server. Eine erfolgreiche HTTP-Antwort allein reicht nicht aus: Prüfen Sie den Task-Status, bevor Sie die Lösung verwenden.

Auf dieser Seite

Website und Serverzugangsdaten konfigurieren

  1. 1.

    Websiteprofil aktivieren

    Richten Sie den Zielhostnamen in der Konsole ein, damit Ihr Workspace über ein aktives reCAPTCHA-Profil verfügt. Das Senden eines Hostnamens in einem Task erstellt kein Profil. Siehe Websiteprofil einrichten.

  2. 2.

    Serverkonfiguration hinzufügen

    Fügen Sie den Eintrag solvethree aus dem Beispiel zum vorhandenen Array in config/services.php hinzu. Setzen Sie SOLVETHREE_API_KEY, CAPTCHA_SITE und SOLVETHREE_PROXY in Ihrer Serverumgebung. Halten Sie diese Werte aus dem Browsercode heraus; CAPTCHA_SITE ist der Hostname, keine vollständige URL.

  3. 3.

    Aktion an das Ziel anpassen

    Das Beispiel sendet login. Ändern Sie dies in die Aktion, die Ihre vorgesehene Zielanfrage verwendet. Es übergibt einen proxy; senden Sie nicht zusätzlich proxyCandidates.

Service mit getrennten Methoden zum Erstellen und Abrufen erstellen

Laravel-Service · Authentifiziertes Erstellen und Abrufen über HTTP
<?php
// app/Services/CaptchaApi.php — configure services.solvethree in config/services.php.
namespace App\Services;

use Illuminate\Support\Facades\Http;
use InvalidArgumentException;

final class CaptchaApi
{
    private function client()
    {
        return Http::baseUrl('https://api.solvethree.com/v1')
            ->withToken(config('services.solvethree.key'))
            ->acceptJson()->asJson()->connectTimeout(10)->timeout(25);
    }

    public function create(string $requestId): array
    {
        if (!preg_match('/^[A-Za-z0-9_-]{1,64}$/', $requestId)) {
            throw new InvalidArgumentException('Invalid logical request ID');
        }
        // The caller keeps this requestId; do not generate another on a timeout.
        return $this->client()->post('/tasks?waitMs=0', [
            'site' => config('services.solvethree.site'),
            'action' => 'login',
            'proxy' => config('services.solvethree.proxy'),
            'requestId' => $requestId,
        ])->throw()->json();
    }

    public function retrieve(string $taskId): array
    {
        if (!preg_match('/^[A-Za-z0-9_-]{1,128}$/', $taskId)) {
            throw new InvalidArgumentException('Invalid task ID');
        }
        return $this->client()->get('/tasks/'.rawurlencode($taskId), ['waitMs' => 15000])
            ->throw()->json();
    }
}
// config/services.php entry:
// 'solvethree' => ['key' => env('SOLVETHREE_API_KEY'),
//   'site' => env('CAPTCHA_SITE'), 'proxy' => env('SOLVETHREE_PROXY')],
// Invoke from your authenticated controller/job. Poll retrieve only while pending
// or solving; ready contains the solution, failed is terminal. Never use retry()
// on create without preserving both this ID and the exact original inputs.

withToken sendet den Workspace-Schlüssel als Bearer-Authentifizierung. Der POST-Body ist flach: site, action, proxy und requestId sind Felder auf oberster Ebene. Fügen Sie für reCAPTCHA kein Feld type oder url hinzu. Wenn Sie recaptchaType weglassen, wird der dokumentierte Standardwert enterprise-v3 verwendet.

Beide Methoden rufen throw() vor json() auf. Der HTTP-Client von Laravel löst bei nicht erfolgreichen HTTP-Antworten standardmäßig keine Ausnahme aus. Dadurch wird verhindert, dass der Aufrufer die Nutzdaten eines HTTP-Fehlers als erfolgreiche Task-Antwort behandelt. Der Service setzt Verbindungs- und Anfragetimeouts und verzichtet bewusst auf automatische POST-Wiederholungen.

Task-ID speichern und Status prüfen

  1. 1.

    Für jeden logischen Lösungsversuch einmal erstellen

    Speichern Sie in Ihrem authentifizierten Controller oder Job eine vom Aufrufer generierte requestId, bevor Sie create aufrufen. Sie muss 1–64 ASCII-Buchstaben, Ziffern, Unterstriche oder Bindestriche enthalten. Speichern Sie die zurückgegebene Task-ID separat: Die logische Anfrage-ID dient zur Wiederherstellung der Erstellung; retrieve akzeptiert dagegen die Task-ID.

  2. 2.

    Die bestehende Aufgabe abrufen

    Rufen Sie retrieve mit der gespeicherten Task-ID auf. Planen Sie bei Status pending oder solving einen späteren Abruf, statt im Controller eine eng getaktete Schleife auszuführen. Legen Sie für den Aufrufer eine Gesamtwartefrist fest; das HTTP-Timeout des Services begrenzt jede einzelne Anfrage, nicht die Lebensdauer des Lösungsversuchs. Das Erreichen dieser Frist ist kein Grund, einen weiteren Task zu erstellen.

  3. 3.

    Endergebnis behandeln

    Beenden Sie bei failed die Abrufe und prüfen Sie errorCode und error; fehlgeschlagene Lösungsversuche werden erstattet. Verwenden Sie bei ready das zurückgegebene Lösungstoken. Übermitteln Sie es mit der zurückgegebenen Identität aus userAgent und secChUa sowie demselben Proxy, der beim Lösen verwendet wurde. Eine fertige Lösung muss weiterhin vom Ziel akzeptiert werden.

Behandeln Sie HTTP-Fehler getrennt von Task-Fehlern. Eine nicht erfolgreiche HTTP-Antwort wird durch throw() behandelt; eine erfolgreiche Antwort mit failed erfordert eine Behandlung auf Task-Ebene. Wiederholen Sie unveränderte ungültige Eingaben nicht und gehen Sie nicht davon aus, dass jeder Fehler auf unzureichendes Guthaben zurückzuführen ist. Siehe API-Fehlerbehandlung.

Erstellung nach einem Timeout wiederherstellen, ohne einen weiteren Lösungsversuch zu kaufen

Ein Verbindungstimeout sagt nicht aus, ob solvethree den Task erstellt hat. Wenn Sie seine Task-ID bereits haben, rufen Sie ihn ab. Andernfalls wiederholen Sie die Erstellung mit derselben requestId und exakt denselben Task-Eingaben, um den vorhandenen Task wiederherzustellen.

Führe deinen ersten Task aus.

Starte mit $5 Workspace-Guthaben.

Workspace erstellen
Die CAPTCHA-API aus Laravel aufrufen · solvethree