Решение reCAPTCHA Enterprise с PHP

Автор: solvethree2 мин на чтение

Вы можете обращаться к solvethree напрямую из PHP. Пример ниже запрашивает токен reCAPTCHA v3 Enterprise, отслеживает задачу до завершения и останавливается при неудачном решении.

На этой странице

Перед запуском

Используйте PHP 8+ с расширением cURL. Запускайте код на своём сервере с включённым расширением cURL.

  • Создайте в консоли активный профиль сайта для целевого имени хоста. См. настройку профиля сайта.
  • Задайте для SOLVETHREE_API_KEY API-ключ вашего рабочего пространства, а для SOLVETHREE_PROXY — URL вашего HTTP(S)-прокси.
  • Замените accounts.example.com и login на своё имя хоста и действие, используемое страницей. В site укажите имя хоста без схемы и пути.

Создайте задачу и дождитесь результата

Сохраните код в файл solve.php и выполните php solve.php.

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;

POST использует waitMs=0, чтобы сразу вернуть задачу. Затем каждый GET ожидает обновления до 15 секунд. Цикл продолжается при статусе pending или solving и останавливается при ready или failed.

По умолчанию запрос использует Enterprise v3. Для стандартной v3 добавьте recaptchaType: v3. Не включайте type и url в тело задачи reCAPTCHA.

Используйте токен в своём приложении

Токен находится в $solution['token']. ID задачи, который выводит программа, нужен для получения задачи; в поле CAPTCHA вашего приложения передавайте значение токена.

В запросе к целевому приложению используйте $solution['userAgent'] в качестве User-Agent, а $solution['secChUa'] — в качестве sec-ch-ua.

Отправьте этот запрос через тот же прокси, который использовался для решения. Затем проверьте ответ приложения: сгенерированный токен не подтверждает, что целевое приложение приняло запрос.

Если запрос завершился ошибкой

Задача с неудачным результатом содержит errorCode и error; пример останавливается и выводит их. Стоимость неудачных решений возвращается. Ошибка HTTP, например 401 или 402, — отдельная проблема запроса. Перед повторной попыткой сверьтесь со справочником ошибок API.

Сохраните requestId и точные входные данные задачи, если требуется восстановление после тайм-аута или перезапуска процесса. Если у вас есть ID задачи, опрашивайте её статус. В противном случае повторно отправьте исходные данные с тем же requestId. Простой перезапуск программы генерирует другой ID и может создать ещё одно платное решение.

Вызывающий код прекращает ожидание по истечении своего срока; уже созданная задача при этом не отменяется. Полная последовательность описана в руководстве по опросу статуса и восстановлению после тайм-аутов.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Решение reCAPTCHA Enterprise с PHP · solvethree