Обрабатывайте опрос задач CAPTCHA и тайм-ауты
Создайте одну задачу, сохраните ее ID и опрашивайте ее, пока она не перейдет в ready или failed либо не истечет установленный срок. Тайм-аут клиента не означает сбой задачи, а завершение ожидания long polling не означает, что решение прекратилось.
На этой странице
Настраивайте ожидание сервера и тайм-аут клиента отдельно
waitMs определяет, сколько API-запрос ожидает результат перед отправкой ответа. Это параметр строки запроса URL, а не поле JSON задачи. Значения по умолчанию при создании различаются в зависимости от продукта; у опроса через GET есть собственный предел.
| Запрос | Ожидание сервера |
|---|---|
| Создание задачи reCAPTCHA v3 Enterprise | По умолчанию ожидает до 15000 мс. |
| Создание задачи Kasada | По умолчанию ожидает до 75000 мс. |
| Создание задачи Ticketmaster TMPT | По умолчанию асинхронно: waitMs=0. Явно заданное значение waitMs может достигать 75000. |
| Получение существующей задачи через GET | По умолчанию без ожидания. Явно заданное значение waitMs может достигать 15000. |
Выделите HTTP-клиенту достаточно времени на запрошенное ожидание сервера с учетом сетевых задержек. Если тайм-аут клиента короче ожидания сервера, ответ может быть прерван до получения текущего состояния задачи.
Создавайте задачу один раз и ограничивайте время опроса
Метод solve официальных SDK создает задачу один раз и опрашивает ее до готового результата или ошибки. Python предоставляет timeout и poll_interval в секундах; Node.js — timeoutMs и pollIntervalMs в миллисекундах. В документированных настройках срок решения составляет три минуты, а интервал опроса — одну секунду.
Для прямого управления Python предоставляет create_task и get_task, а Node.js — createTask и getTask. Используйте следующую последовательность:
- 1.
Задайте предельный срок и создайте одну задачу
До создания задайте общий предельный срок. Сохраните requestId вместе с точными входными данными задачи, чтобы восстановить ее после прерванного создания. Чтобы не ждать при создании, явно задайте нулевое ожидание.
- 2.
Сохраните возвращенный ID задачи и проверьте ее статус
Создание уже может вернуть конечный результат. При ready верните решение. При failed проверьте errorCode и error и остановитесь; средства за неудачные решения возвращаются. Дальнейший опрос нужен только при pending и solving.
- 3.
Получайте ту же задачу, пока остается время
Используйте GET /v1/tasks/:id, при необходимости задав ожидание long polling до 15000 мс. Обрабатывайте неуспешные HTTP-ответы до чтения данных успешного ответа. Если в ответе по-прежнему указано pending или solving, повторите запрос с тем же ID, а не создавайте другую задачу.
- 4.
Остановитесь по истечении срока
Ограничивайте каждый запрос оставшимся временем с учетом сетевых задержек. Когда установленный срок истечет, остановите локальный цикл и сохраните ID задачи для восстановления. Не считайте задачу неудачной лишь потому, что клиент перестал ждать.
Этот запрос получает существующую задачу с ожиданием сервера 15 секунд и тайм-аутом клиента 30 секунд. Задайте TASK_ID равным сохраненному ID и храните SOLVETHREE_API_KEY на сервере. Ни один из этих тайм-аутов не задает общий предельный срок для повторяющегося цикла опроса.
curl --fail-with-body --max-time 30 \
"https://api.solvethree.com/v1/tasks/$TASK_ID?waitMs=15000" \
-H "Authorization: Bearer $SOLVETHREE_API_KEY"Проверяйте статус задачи, а не только HTTP-статус
Успешный HTTP-ответ может содержать задачу, которую еще нужно опрашивать. pending и solving — не конечные состояния; только ready содержит пригодное для использования решение. failed — конечное состояние, включающее errorCode и error.
{
"nonterminal": [
{
"id": "example-task",
"status": "pending"
},
{
"id": "example-task",
"status": "solving"
}
],
"ready": {
"id": "example-task",
"status": "ready",
"solution": {
"token": "EXAMPLE_TOKEN",
"userAgent": "EXAMPLE_USER_AGENT",
"secChUa": "EXAMPLE_CLIENT_HINTS"
}
},
"failed": {
"id": "example-task",
"status": "failed",
"errorCode": "site-unreachable",
"error": "target page did not respond"
}
}Показанный здесь готовый ответ содержит токен reCAPTCHA. Kasada вместо него возвращает заголовки, а TMPT — необработанное значение cookie. Готовый результат означает, что решение создано, а не что целевой сайт принял его. Если готовый токен reCAPTCHA отклонен, перейдите от диагностики опроса к проверке отправленного токена.
Восстановите существующую задачу после тайм-аута
Тайм-аут соединения означает, что клиент не получил полный ответ. Он не доказывает, что создание не удалось. Прежде чем оплачивать еще одно решение, восстановите задачу, которую вы, возможно, уже создали.
- 1.
Если у вас есть ID задачи, возобновите опрос через GET
Запросите задачу с этим ID, задав новый ограниченный локальный срок ожидания. Тайм-аут GET не является причиной отправлять еще один запрос на создание.
- 2.
Если создание прервано, повторно используйте его requestId
Повторите идентичный запрос задачи с тем же requestId, чтобы восстановить существующую задачу. Изменение входных данных задачи при повторном использовании этого ID вызывает конфликт. Полные условия описаны в разделе восстановления по ID запроса.
Оба SDK генерируют requestId, если он не указан, и никогда автоматически не повторяют создание. Их SolvethreeError предоставляет ID для восстановления: request_id и task_id в Python либо requestId и taskId в JavaScript. Проверьте эти поля, прежде чем решать, создавать ли новую логическую задачу.
- Запрос опроса возвращает HTTP-ошибку
Проверяйте HTTP-статус отдельно от статуса задачи. ApiError в SDK предоставляет этот статус и задержку перед повторной попыткой, если она указана.
Попробуйте: При временных сбоях опроса соблюдайте Retry-After в пределах общего срока решения. В SDK для этого используются поля retry_after в Python в секундах и retryAfterMs в JavaScript в миллисекундах.
- Задача возвращает failed
Прочитайте errorCode и error; в SDK это представлено как TaskFailedError.
Попробуйте: Прекратите опрос этой задачи. Прежде чем создавать другую, выясните указанную причину; не повторяйте вслепую запросы с неизмененными некорректными входными данными и не считайте, что проблема в средствах на балансе.
- Получение задачи возвращает HTTP 410
Срок хранения результата истек.
Попробуйте: Прекратите повторять получение, как если бы это была временная ошибка опроса. Готовые результаты хранятся ограниченное время и не являются постоянным кешем решений.
Сохранение готового ответа не продлевает срок действия токена или cookie на целевом сайте.
Источники и справочник API
Проблема не решена?
Отправьте в поддержку ID задачи и полученную ошибку.