Die CAPTCHA-API aus Laravel aufrufen
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.
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.
Serverkonfiguration hinzufügen
Fügen Sie den Eintrag
solvethreeaus dem Beispiel zum vorhandenen Array inconfig/services.phphinzu. Setzen SieSOLVETHREE_API_KEY,CAPTCHA_SITEundSOLVETHREE_PROXYin Ihrer Serverumgebung. Halten Sie diese Werte aus dem Browsercode heraus;CAPTCHA_SITEist der Hostname, keine vollständige URL. - 3.
Aktion an das Ziel anpassen
Das Beispiel sendet
login. Ändern Sie dies in die Aktion, die Ihre vorgesehene Zielanfrage verwendet. Es übergibt einenproxy; senden Sie nicht zusätzlichproxyCandidates.
Service mit getrennten Methoden zum Erstellen und Abrufen erstellen
<?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.
Für jeden logischen Lösungsversuch einmal erstellen
Speichern Sie in Ihrem authentifizierten Controller oder Job eine vom Aufrufer generierte
requestId, bevor Siecreateaufrufen. 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;retrieveakzeptiert dagegen die Task-ID. - 2.
Die bestehende Aufgabe abrufen
Rufen Sie
retrievemit der gespeicherten Task-ID auf. Planen Sie bei Statuspendingodersolvingeinen 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.
Endergebnis behandeln
Beenden Sie bei
faileddie Abrufe und prüfen SieerrorCodeunderror; fehlgeschlagene Lösungsversuche werden erstattet. Verwenden Sie beireadydas zurückgegebene Lösungstoken. Übermitteln Sie es mit der zurückgegebenen Identität aususerAgentundsecChUasowie 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.
Quellen und API-Referenz
Führe deinen ersten Task aus.
Starte mit $5 Workspace-Guthaben.