Справочник 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}(Числа в примере приведены только для иллюстрации.)
Рекомендации
Заголовок раздела «Рекомендации»- Ограничивайте в программе число запросов, которые одновременно ждут результата, например с помощью семафора (Semaphore) или пула потоков фиксированного размера, а не только число запросов в секунду.
- Получив
ERROR_THREADS_MAXIMUM, дождитесь возврата уже отправленных запросов и только потом отправляйте новые либо подождите 1–2 секунды и повторите. Не повторяйте запрос сразу в цикле. - Отправляйте пакеты задач равномерно, не запускайте десятки тысяч задач одновременно.
Пример на Python (asyncio):
import asyncioimport os
import aiohttp
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]LIMIT = 15 # below your concurrency limitsem = 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_REQUEST_FORMATSERROR_TASK_ABSENTERROR_TASK_NOT_SUPPORTEDERROR_KEY_DOES_NOT_EXISTERROR_KEY_EXPIREDERROR_TASKID_INVALIDERROR_SETTLEMENT_FAILEDERROR_HIGH_DEMAND_DOMAINERROR_ZERO_CAPTCHA_FILESIZEERROR_TOO_BIG_CAPTCHA_FILESIZEERROR_IMAGE_TYPE_NOT_SUPPORTEDERROR_ILLEGAL_IMAGE
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"}Кэш неверных параметров
Заголовок раздела «Кэш неверных параметров»Некоторые ошибки определяются параметрами запроса, поэтому при повторной отправке тех же параметров результат не изменится:
ERROR_RECAPTCHA_INVALID_SITEKEYERROR_RECAPTCHA_INVALID_DOMAINERROR_INVALID_KEY_TYPEERROR_DOMAIN_NOT_ALLOWED
Эти ошибки не засчитываются в автоматическую приостановку, а кэшируются на уровне всего сервиса: после первого определения — на 2 минуты, а если в течение часа ошибка подтверждается повторно — на 10 минут. Пока кэш действует, такой же запрос (с тем же типом задачи и websiteKey или с тем же доменом сайта) сразу возвращает прежнюю ошибку, баллы не списываются, а в ответе есть "cached": true, retryAfter (сколько секунд осталось до конца кэширования) и badRequest (параметры, попавшие в кэш). Если исправить websiteKey или сменить тип задачи, изменения вступают в силу сразу.
Чем отличаются лимит параллельных задач и автоматическая приостановка
Заголовок раздела «Чем отличаются лимит параллельных задач и автоматическая приостановка»| Лимит параллельных задач | Автоматическая приостановка | |
|---|---|---|
| Причина | Слишком много одновременно обрабатываемых задач | Слишком много запросов с ошибками за короткое время |
| Проявление | Отклоняются только запросы сверх лимита, ERROR_THREADS_MAXIMUM |
Для этого clientKey приостанавливается создание задач, ERROR_IP_BLOCKED_5MIN |
| Восстановление | Новые запросы можно отправлять, как только предыдущие обработаны; вдвое уменьшенный лимит восстанавливается через 10 минут | Снимается автоматически по истечении срока |
| Списание баллов | Нет | Нет |