reCAPTCHA Enterprise mit PHP lösen

Von solvethree2 Min. Lesezeit

Sie können solvethree direkt aus PHP aufrufen. Das folgende Beispiel fordert ein reCAPTCHA v3 Enterprise-Token an, verfolgt die Aufgabe bis zum Abschluss und bricht bei einem fehlgeschlagenen Lösungsversuch ab.

Auf dieser Seite

Vor der Ausführung

Verwenden Sie PHP 8+ mit der cURL-Erweiterung. Führen Sie das Beispiel auf Ihrem Server mit aktivierter cURL-Erweiterung aus.

  • Erstellen Sie in der Konsole ein aktives Websiteprofil für Ihren Zielhostnamen. Siehe Websiteprofil einrichten.
  • Setzen Sie SOLVETHREE_API_KEY auf den API-Schlüssel Ihres Workspaces und SOLVETHREE_PROXY auf Ihre HTTP(S)-Proxy-URL.
  • Ersetzen Sie accounts.example.com und login durch Ihren Hostnamen und die von der Seite verwendete Aktion. Verwenden Sie für site einen Hostnamen ohne Schema oder Pfad.

Aufgabe erstellen und auf das Ergebnis warten

Speichern Sie den Code als solve.php und führen Sie php solve.php aus.

PHP 8 · solve.php
<?php
// Requires PHP 8+ with the cURL extension.
$apiKey = getenv('SOLVETHREE_API_KEY');
$proxy = getenv('SOLVETHREE_PROXY');
if (!$apiKey || !$proxy) throw new RuntimeException('Set the API key and proxy');

function api(string $path, ?array $body = null): array {
    global $apiKey, $deadline;
    $remaining = $deadline - microtime(true);
    if ($remaining <= 0) throw new RuntimeException("Keep the task ID and resume polling");
    $curl = curl_init('https://api.solvethree.com/v1' . $path);
    curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT_MS => min(30000, max(1, (int) ceil($remaining * 1000))),
        CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey, 'Content-Type: application/json'],
    ]);
    if ($body !== null) {
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($body, JSON_THROW_ON_ERROR));
    }
    $raw = curl_exec($curl);
    $error = curl_error($curl);
    $status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
    curl_close($curl);
    if ($raw === false) throw new RuntimeException('Connection failed: ' . $error);
    if ($status < 200 || $status >= 300) throw new RuntimeException('API HTTP ' . $status);
    return json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
}

$requestId = bin2hex(random_bytes(16)); // Save this with the task inputs for recovery.
$deadline = microtime(true) + 180;
$task = api('/tasks?waitMs=0', [
    'site' => 'accounts.example.com', 'action' => 'login',
    'proxy' => $proxy, 'requestId' => $requestId,
]);
while (in_array($task['status'], ['pending', 'solving'], true)) {
    if (microtime(true) >= $deadline) throw new RuntimeException('Keep the task ID and resume polling');
    $task = api('/tasks/' . rawurlencode($task['id']) . '?waitMs=15000');
    if (in_array($task['status'], ['pending', 'solving'], true)) usleep(1000000);
}
if ($task['status'] !== 'ready') throw new RuntimeException(
    ($task['errorCode'] ?? 'Unexpected task state') . ': ' . ($task['error'] ?? '')
);
$solution = $task['solution'];
// Use $solution['token'], ['userAgent'] and ['secChUa'] with the same proxy.
echo 'Ready task: ' . $task['id'] . PHP_EOL;

Der POST verwendet waitMs=0, um sofort eine Aufgabe zurückzugeben. Jeder GET wartet anschließend bis zu 15 Sekunden auf eine Aktualisierung. Die Schleife läuft bei pending oder solving weiter und endet bei ready oder failed.

Die Anfrage verwendet standardmäßig Enterprise v3. Fügen Sie für Standard-v3 recaptchaType: v3 hinzu. Lassen Sie type und url im Body einer reCAPTCHA-Aufgabe weg.

Token in Ihrer Anwendung verwenden

Das Token steht in $solution['token']. Die vom Programm ausgegebene Aufgaben-ID dient zum Abrufen der Aufgabe; verwenden Sie den Tokenwert im CAPTCHA-Feld Ihrer Anwendung.

Verwenden Sie $solution['userAgent'] als User-Agent und $solution['secChUa'] als sec-ch-ua in der Anfrage an das Ziel.

Senden Sie diese Anfrage über denselben Proxy, der für den Lösungsversuch verwendet wurde. Prüfen Sie anschließend die Antwort der Anwendung: Ein generiertes Token belegt nicht, dass das Ziel die Anfrage akzeptiert hat.

Wenn die Anfrage fehlschlägt

Eine fehlgeschlagene Aufgabe enthält errorCode und error; das Beispiel bricht ab und gibt beide aus. Fehlgeschlagene Lösungsversuche werden erstattet. Ein HTTP-Fehler wie 401 oder 402 ist ein separates Problem mit der Anfrage. Prüfen Sie vor einem erneuten Versuch die API-Fehlerreferenz.

Bewahren Sie die requestId und die exakten Aufgabeneingaben auf, wenn Sie nach einer Zeitüberschreitung oder einem Prozessneustart eine Wiederherstellung benötigen. Wenn Sie die Aufgaben-ID haben, fragen Sie die Aufgabe per Polling ab. Andernfalls senden Sie die ursprünglichen Eingaben mit derselben requestId erneut. Ein einfacher Neustart des Programms generiert eine weitere ID und kann einen weiteren kostenpflichtigen Lösungsversuch erzeugen.

Der Aufrufer wartet nach Ablauf seines Zeitlimits nicht mehr; eine bereits erstellte Aufgabe wird dadurch nicht abgebrochen. Den vollständigen Ablauf finden Sie unter Polling und Wiederherstellung nach Zeitüberschreitungen.

Führe deinen ersten Task aus.

Starte mit $5 Workspace-Guthaben.

Workspace erstellen
reCAPTCHA Enterprise mit PHP lösen · solvethree