Обрабатывайте опрос задач CAPTCHA и тайм-ауты

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

Создайте одну задачу, сохраните ее ID и опрашивайте ее, пока она не перейдет в ready или failed либо не истечет установленный срок. Тайм-аут клиента не означает сбой задачи, а завершение ожидания long polling не означает, что решение прекратилось.

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

Настраивайте ожидание сервера и тайм-аут клиента отдельно

waitMs определяет, сколько API-запрос ожидает результат перед отправкой ответа. Это параметр строки запроса URL, а не поле JSON задачи. Значения по умолчанию при создании различаются в зависимости от продукта; у опроса через GET есть собственный предел.

Настройки ожидания API задач
Настройки ожидания API задач
ЗапросОжидание сервера
Создание задачи 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. 1.

    Задайте предельный срок и создайте одну задачу

    До создания задайте общий предельный срок. Сохраните requestId вместе с точными входными данными задачи, чтобы восстановить ее после прерванного создания. Чтобы не ждать при создании, явно задайте нулевое ожидание.

  2. 2.

    Сохраните возвращенный ID задачи и проверьте ее статус

    Создание уже может вернуть конечный результат. При ready верните решение. При failed проверьте errorCode и error и остановитесь; средства за неудачные решения возвращаются. Дальнейший опрос нужен только при pending и solving.

  3. 3.

    Получайте ту же задачу, пока остается время

    Используйте GET /v1/tasks/:id, при необходимости задав ожидание long polling до 15000 мс. Обрабатывайте неуспешные HTTP-ответы до чтения данных успешного ответа. Если в ответе по-прежнему указано pending или solving, повторите запрос с тем же ID, а не создавайте другую задачу.

  4. 4.

    Остановитесь по истечении срока

    Ограничивайте каждый запрос оставшимся временем с учетом сетевых задержек. Когда установленный срок истечет, остановите локальный цикл и сохраните ID задачи для восстановления. Не считайте задачу неудачной лишь потому, что клиент перестал ждать.

Этот запрос получает существующую задачу с ожиданием сервера 15 секунд и тайм-аутом клиента 30 секунд. Задайте TASK_ID равным сохраненному ID и храните SOLVETHREE_API_KEY на сервере. Ни один из этих тайм-аутов не задает общий предельный срок для повторяющегося цикла опроса.

API задач · получение существующей задачи
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. 1.

    Если у вас есть ID задачи, возобновите опрос через GET

    Запросите задачу с этим ID, задав новый ограниченный локальный срок ожидания. Тайм-аут GET не является причиной отправлять еще один запрос на создание.

  2. 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 на целевом сайте.

Проблема не решена?

Отправьте в поддержку ID задачи и полученную ошибку.

Связаться с поддержкой
Обрабатывайте опрос задач CAPTCHA и тайм-ауты · solvethree