Glitch
Документация API · Пределы частоты

Основы

Пределы частоты

Пределы защищают каналы от потока сообщений, а сервер от перегрузки. Устроены они так же, как в Discord. discord.py и discord.js следят за ними сами, ждут, когда нужно, и повторяют запрос. Если вы пишете без библиотеки, прочитайте эту страницу целиком.

Как считаются пределы

У каждого действия есть своё «ведро» запросов. В ведро помещается несколько запросов подряд, а потом оно постепенно наполняется снова. Например, предел «5 за 2 секунды» значит, что 5 сообщений можно отправить сразу, а дальше по одному каждые 0,4 секунды.

Один запрос может тратить сразу несколько вёдер. Сообщение вебхука тратит и ведро самого вебхука, и общее ведро канала. Запрос проходит, только если место есть во всех. Запрос, упёршийся в предел, ничего не сделал, поэтому его можно спокойно повторить.

Пределы вебхука

ЧтоПределВедро
Отправка и правка сообщений одним вебхуком5 за 2 секундыwebhook.execute
Сообщения всех вебхуков одного канала вместе30 в минутуwebhook.place
Чтение, изменение и удаление самого вебхука и чтение и удаление его сообщений10 за 30 секундwebhook.manage
Запросы с неверным ключом вебхука с одного IP-адреса30 в минутуwebhook.bad_token

Предел на канал общий для всех его вебхуков. Если в канал пишут несколько программ, вместе они не отправят больше, чем 30 в минуту.

Заголовки ответа

В каждом ответе есть заголовки с остатком самого тесного из вёдер, которые потратил запрос.

ЗаголовокЗначение
X-RateLimit-LimitСколько запросов помещается в ведро
X-RateLimit-RemainingСколько запросов можно сделать прямо сейчас
X-RateLimit-Reset-AfterЧерез сколько секунд ведро наполнится полностью, дробное число
X-RateLimit-ResetТо же самое моментом времени, в секундах Unix
X-RateLimit-BucketИмя ведра. У ручек с общим пределом оно одинаковое
HTTP
HTTP/1.1 204 No Content
X-RateLimit-Limit: 5
X-RateLimit-Remaining: 3
X-RateLimit-Reset-After: 0.800
X-RateLimit-Reset: 1793176200.800
X-RateLimit-Bucket: webhook.execute

Когда X-RateLimit-Remaining равен 0, следующий запрос в это ведро получит отказ. Лучше подождать X-RateLimit-Reset-After секунд заранее, а не дожидаться отказа.

Ответ 429

Если предел исчерпан, сервер отвечает статусом 429 Too Many Requests.

JSON
{
  "code": 0,
  "message": "Слишком часто — подождите 2 с",
  "retry_after": 1.6,
  "global": false
}
ПолеЧто значит
retry_afterСколько секунд подождать перед повтором. Дробное число
globaltrue, если исчерпан общий предел вызывающего, а не предел этого действия

Заголовки этого ответа такие же, плюс Retry-After (то же ожидание целыми секундами с округлением вверх), X-RateLimit-Scope и X-RateLimit-Global.

Как обработать 429 без библиотеки

Подождите ровно retry_after секунд и повторите тот же запрос. Не повторяйте раньше, такой запрос тоже упрётся в предел.

Python
import time

import requests


def send(url, payload, attempts=5):
    for _ in range(attempts):
        response = requests.post(url, json=payload)
        if response.status_code != 429:
            response.raise_for_status()
            return response
        time.sleep(response.json()["retry_after"])
    raise RuntimeError("Не удалось отправить: сервер просит подождать слишком часто")

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

Защита от потока запросов

Помимо пределов API сервер отсекает слишком частые запросы с одного IP-адреса ещё до того, как они дойдут до API. Обычная программа в эту защиту не упирается. Если она всё же сработала, придёт тот же ответ 429, но с "global": true и без заголовков X-RateLimit-*. Подождите retry_after секунд и уменьшите частоту запросов.

На этой странице
  1. Как считаются пределы
  2. Пределы вебхука
  3. Заголовки ответа
  4. Ответ 429
  5. Как обработать 429 без библиотеки
  6. Защита от потока запросов