Перейти к содержимому
СтатусПанель

Справочник API

Лимит параллельных задач и автоматическая приостановка

Эта страница переведена с китайской версии машинным переводом и может содержать ошибки. Приоритет имеет китайская версия.

Чтобы распознавание оставалось быстрым для всех пользователей, в YesCaptcha действуют три защитных правила: число одновременно обрабатываемых задач ограничено для каждого аккаунта (лимит параллельных задач); clientKey, который за короткое время дал слишком много ошибок, приостанавливается на несколько минут (автоматическая приостановка); параметры, уже признанные неверными, в течение некоторого времени сразу возвращают прежнюю ошибку (кэш неверных параметров). Во всех трёх случаях баллы не списываются.

Мы ограничиваем число задач, которые аккаунт обрабатывает одновременно, отдельно для каждого типа задачи. Ограничивается число параллельных задач, а не число запросов в минуту.

  • Задача считается «в обработке» с момента вызова createTask до возврата ответа на этот вызов. Типы распознавания изображений возвращают результат прямо в createTask, поэтому число параллельных задач ≈ число задач в секунду × время на одну задачу. Например, при 0.5 секунды на задачу и 40 задачах в секунду получается примерно 20 параллельных задач.
  • Запросы одного аккаунта суммируются; каждый тип задачи считается отдельно.
  • Запросы сверх лимита сразу получают ERROR_THREADS_MAXIMUM, а в поле limit указан ваш текущий лимит. Баллы не списываются, и такие запросы не засчитываются в автоматическую приостановку.
  • Если серверы распознавания перегружены, у аккаунта, который занимает больше всего времени распознавания, лимит для этого типа задачи временно уменьшается вдвое и автоматически восстанавливается через 10 минут. Это только ограничение скорости, аккаунт не приостанавливается.
  • Если нужен более высокий лимит, свяжитесь с поддержкой. Лимиты по умолчанию для каждого типа будут опубликованы на этой странице и в журнале обновлений сервиса после того, как их утвердят.
{
"errorId": 1,
"errorCode": "ERROR_THREADS_MAXIMUM",
"errorDescription": "This account already has 30 tasks of this type in progress, which is the limit. Lower the concurrency and wait for pending requests to return before sending more; rejected requests are not charged and do not lead to a block.",
"limit": 30
}

(Числа в примере приведены только для иллюстрации.)

  1. Ограничивайте в программе число запросов, которые одновременно ждут результата, например с помощью семафора (Semaphore) или пула потоков фиксированного размера, а не только число запросов в секунду.
  2. Получив ERROR_THREADS_MAXIMUM, дождитесь возврата уже отправленных запросов и только потом отправляйте новые либо подождите 1–2 секунды и повторите. Не повторяйте запрос сразу в цикле.
  3. Отправляйте пакеты задач равномерно, не запускайте десятки тысяч задач одновременно.

Пример на Python (asyncio):

import asyncio
import os
import aiohttp
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
LIMIT = 15 # below your concurrency limit
sem = asyncio.Semaphore(LIMIT)
async def solve(session, task):
async with sem: # at most LIMIT requests in progress at a time
result = {}
for attempt in range(5):
async with session.post(
"https://api.yescaptcha.com/createTask",
json={"clientKey": CLIENT_KEY, "task": task},
) as resp:
result = await resp.json()
if result.get("errorCode") != "ERROR_THREADS_MAXIMUM":
return result
await asyncio.sleep(1 + attempt) # over the limit: wait and retry
return result

Если clientKey за короткое время отправляет много запросов с ошибками, создание задач для него автоматически приостанавливается:

Условие срабатывания Длительность приостановки
100 перечисленных ниже ошибок в течение одной календарной минуты 5 минут
Одна ошибка ERROR_IMAGE_TYPE_NOT_SUPPORTED 30 минут
1,000 попаданий в «кэш неверных параметров» в течение одной календарной минуты 5 минут

Ошибки, которые засчитываются в приостановку:

ERROR_THREADS_MAXIMUM, возвращаемая при превышении лимита параллельных задач аккаунта (с полем limit), не засчитывается; одноимённая ошибка, возвращаемая при перегрузке сервиса распознавания (без limit), засчитывается. Не засчитываются ошибки распознавания (ERROR_CAPTCHA_UNSOLVABLE), нехватка баланса (ERROR_ZERO_BALANCE), отсутствие обязательных полей (ERROR_REQUIRED_FIELDS), неподдерживаемый вопрос (ERROR_UNKNOWN_QUESTION) и подобные.

Во время приостановки:

  • Затрагиваются только createTask и getBalance, они возвращают ERROR_IP_BLOCKED_5MIN. getTaskResult работает как обычно: результаты задач, созданных до приостановки, можно получить.
  • В ответе есть retryAfter (сколько секунд осталось), blockReason (код ошибки, вызвавшей приостановку) и blockDetail (тип, URL и sitekey таких запросов); по ним можно исправить программу.
  • Дальнейшая отправка запросов не продлевает приостановку. Она снимается автоматически по истечении срока, обращаться в поддержку не нужно.
  • В Панели на yescaptcha.com на странице «Обзор» можно увидеть записи о приостановках за последние 24 часа.
{
"errorId": 1,
"errorCode": "ERROR_IP_BLOCKED_5MIN",
"errorDescription": "...",
"retryAfter": 182,
"blockReason": "ERROR_TASK_NOT_SUPPORTED"
}

Некоторые ошибки определяются параметрами запроса, поэтому при повторной отправке тех же параметров результат не изменится:

Эти ошибки не засчитываются в автоматическую приостановку, а кэшируются на уровне всего сервиса: после первого определения — на 2 минуты, а если в течение часа ошибка подтверждается повторно — на 10 минут. Пока кэш действует, такой же запрос (с тем же типом задачи и websiteKey или с тем же доменом сайта) сразу возвращает прежнюю ошибку, баллы не списываются, а в ответе есть "cached": true, retryAfter (сколько секунд осталось до конца кэширования) и badRequest (параметры, попавшие в кэш). Если исправить websiteKey или сменить тип задачи, изменения вступают в силу сразу.

Чем отличаются лимит параллельных задач и автоматическая приостановка

Заголовок раздела «Чем отличаются лимит параллельных задач и автоматическая приостановка»
Лимит параллельных задач Автоматическая приостановка
Причина Слишком много одновременно обрабатываемых задач Слишком много запросов с ошибками за короткое время
Проявление Отклоняются только запросы сверх лимита, ERROR_THREADS_MAXIMUM Для этого clientKey приостанавливается создание задач, ERROR_IP_BLOCKED_5MIN
Восстановление Новые запросы можно отправлять, как только предыдущие обработаны; вдвое уменьшенный лимит восстанавливается через 10 минут Снимается автоматически по истечении срока
Списание баллов Нет Нет