Вызывайте API CAPTCHA из Laravel
Используйте HTTP-клиент Laravel, чтобы создать задачу solvethree, а затем получать её по ID. Храните API-ключ и учётные данные прокси на сервере. Успешного HTTP-ответа недостаточно: проверьте статус задачи, прежде чем использовать её решение.
На этой странице
Настройте сайт и серверные учётные данные
- 1.
Активируйте профиль сайта
Настройте целевое имя хоста в консоли, чтобы в рабочем пространстве был активный профиль reCAPTCHA. Передача имени хоста в задаче не создаёт профиль. См. настройку профиля сайта.
- 2.
Добавьте серверную конфигурацию
Добавьте запись
solvethreeиз примера в существующий массив вconfig/services.php. ЗадайтеSOLVETHREE_API_KEY,CAPTCHA_SITEиSOLVETHREE_PROXYв окружении сервера. Не включайте эти значения в браузерный код;CAPTCHA_SITE— это имя хоста, а не полный URL. - 3.
Укажите действие целевого запроса
Пример отправляет
login. Замените его на действие, используемое в вашем целевом запросе. Пример передаёт одинproxy; не отправляйте одновременноproxyCandidates.
Создайте сервис с отдельными методами создания и получения
<?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.
Создавайте задачу один раз для каждого логического запроса на решение
В контроллере или задании с аутентификацией сохраните сгенерированный вызывающей стороной
requestIdперед вызовомcreate. Он должен содержать 1–64 символа: буквы ASCII, цифры, подчёркивания или дефисы. Отдельно сохраните возвращённый ID задачи: логический ID запроса нужен для восстановления создания, аretrieveпринимает ID задачи. - 2.
Получение существующей задачи
Вызовите
retrieveс сохранённым ID задачи. Если статус —pendingилиsolving, запланируйте повторное получение позже, а не запускайте непрерывный цикл в контроллере. Задайте для вызывающей стороны общее предельное время ожидания; HTTP-тайм-аут сервиса ограничивает каждый запрос, а не время выполнения решения. Достижение этого предела не является поводом создавать новую задачу. - 3.
Обработайте конечный результат
При
failedпрекратите получение задачи и проверьтеerrorCodeиerror; средства за неудачные решения возвращаются. Приreadyиспользуйте возвращённый токен решения. Отправьте его с возвращёнными данными идентификацииuserAgentиsecChUaи через тот же прокси, который использовался для решения. Готовое решение ещё должно быть принято целевым сайтом.
Разделяйте HTTP-ошибки и сбои задач. Неуспешный HTTP-ответ обрабатывается через throw(); успешный ответ, содержащий failed, требует обработки на уровне задачи. Не повторяйте запросы с неизменными некорректными данными и не считайте, что любой сбой означает недостаток средств. См. обработку ошибок API.
Восстановите создание после тайм-аута без оплаты ещё одного решения
Тайм-аут соединения не позволяет определить, создал ли solvethree задачу. Если у вас уже есть ID задачи, запросите её. В противном случае повторите создание с тем же requestId и точно такими же входными данными задачи, чтобы получить существующую задачу.
Источники и справочник API
Запустите первую задачу.
Начните с $5 на балансе рабочего пространства.