Вызывайте API CAPTCHA из Laravel

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

Используйте HTTP-клиент Laravel, чтобы создать задачу solvethree, а затем получать её по ID. Храните API-ключ и учётные данные прокси на сервере. Успешного HTTP-ответа недостаточно: проверьте статус задачи, прежде чем использовать её решение.

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

Настройте сайт и серверные учётные данные

  1. 1.

    Активируйте профиль сайта

    Настройте целевое имя хоста в консоли, чтобы в рабочем пространстве был активный профиль reCAPTCHA. Передача имени хоста в задаче не создаёт профиль. См. настройку профиля сайта.

  2. 2.

    Добавьте серверную конфигурацию

    Добавьте запись solvethree из примера в существующий массив в config/services.php. Задайте SOLVETHREE_API_KEY, CAPTCHA_SITE и SOLVETHREE_PROXY в окружении сервера. Не включайте эти значения в браузерный код; CAPTCHA_SITE — это имя хоста, а не полный URL.

  3. 3.

    Укажите действие целевого запроса

    Пример отправляет login. Замените его на действие, используемое в вашем целевом запросе. Пример передаёт один proxy; не отправляйте одновременно proxyCandidates.

Создайте сервис с отдельными методами создания и получения

Сервис Laravel · создание и получение через 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 отправляет ключ рабочего пространства для Bearer-аутентификации. Тело POST имеет плоскую структуру: site, action, proxy и requestId — поля верхнего уровня. Не добавляйте поля type или url для reCAPTCHA. Если не указать recaptchaType, используется документированное значение по умолчанию enterprise-v3.

Оба метода вызывают throw() перед json(). По умолчанию HTTP-клиент Laravel не выбрасывает исключения при неуспешных HTTP-ответах, поэтому такой порядок не позволяет вызывающему коду принять тело HTTP-ошибки за успешный ответ с задачей. Сервис задаёт тайм-ауты соединения и запроса и намеренно не выполняет автоматические повторы POST.

Сохраняйте ID задачи и проверяйте её статус

  1. 1.

    Создавайте задачу один раз для каждого логического запроса на решение

    В контроллере или задании с аутентификацией сохраните сгенерированный вызывающей стороной requestId перед вызовом create. Он должен содержать 1–64 символа: буквы ASCII, цифры, подчёркивания или дефисы. Отдельно сохраните возвращённый ID задачи: логический ID запроса нужен для восстановления создания, а retrieve принимает ID задачи.

  2. 2.

    Получение существующей задачи

    Вызовите retrieve с сохранённым ID задачи. Если статус — pending или solving, запланируйте повторное получение позже, а не запускайте непрерывный цикл в контроллере. Задайте для вызывающей стороны общее предельное время ожидания; HTTP-тайм-аут сервиса ограничивает каждый запрос, а не время выполнения решения. Достижение этого предела не является поводом создавать новую задачу.

  3. 3.

    Обработайте конечный результат

    При failed прекратите получение задачи и проверьте errorCode и error; средства за неудачные решения возвращаются. При ready используйте возвращённый токен решения. Отправьте его с возвращёнными данными идентификации userAgent и secChUa и через тот же прокси, который использовался для решения. Готовое решение ещё должно быть принято целевым сайтом.

Разделяйте HTTP-ошибки и сбои задач. Неуспешный HTTP-ответ обрабатывается через throw(); успешный ответ, содержащий failed, требует обработки на уровне задачи. Не повторяйте запросы с неизменными некорректными данными и не считайте, что любой сбой означает недостаток средств. См. обработку ошибок API.

Восстановите создание после тайм-аута без оплаты ещё одного решения

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

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

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

Создать рабочее пространство
Вызывайте API CAPTCHA из Laravel · solvethree