← Блог

Массовая рассылка в Telegram: почему альбом на 800 юзеров шёл 30 минут

Сережа Рис · 25 January 2026

telegram botpython

Написал рассылку альбома из 6 картинок на 871 пользователя @hashslash_bot. Ожидал минуту-две. Полчаса — 100 человек.

Я загружал 18 мегабайт 871 раз.

Что пошло не так

Попросил Claude Code на Opus 4.5 написать скрипт:

Напиши broadcast.py для @hashslash_bot. Отправь альбом из 6 картинок с caption, следом — сообщение с inline-кнопкой. Используй asyncio.

Агент выдал код. Выглядит правильно: sendMediaGroup, asyncio.gather. Запустил.

50 юзеров — минута. 100 — две. На 871 это 17+ минут.

Почему так медленно

Вот что делал мой код:

# НЕПРАВИЛЬНО — upload каждый раз
for user_id in users:
    files = {f"photo{i}": open(path, 'rb') for i, path in enumerate(images)}
    requests.post(f"{API}/sendMediaGroup", files=files, data={"chat_id": user_id})

6 картинок × 3 МБ = 18 МБ на юзера. 871 человек — 15 гигабайт upload.

Параллельность не помогает. Упираешься в скорость сети. Telegram ждёт файлы, потом отправляет.

Решение: file_id

Telegram хранит файлы на своих серверах. При отправке возвращается file_id. Дальше можно использовать его вместо файла.

Отправляю альбом себе один раз:

resp = requests.post(f"{API}/sendMediaGroup", files=files, data={
    "chat_id": MY_ID,
    "media": json.dumps([{"type": "photo", "media": f"attach://photo{i}"} for i in range(6)])
})

file_ids = [msg['photo'][-1]['file_id'] for msg in resp.json()['result']]

Теперь рассылка — это JSON без загрузки:

for user_id in users:
    media = [{"type": "photo", "media": fid} for fid in file_ids]
    media[0]["caption"] = "Текст подписи"
    requests.post(f"{API}/sendMediaGroup", json={"chat_id": user_id, "media": media})

Килобайты вместо мегабайт.

Разница

Способ Трафик Время
Upload каждый раз ~15 ГБ 30+ мин
file_id ~5 МБ ~60 сек

Лимит Telegram — 30 сообщений/секунду на токен. 871 × 2 запроса = меньше минуты.

Три правила

  1. Загружай один раз — отправь себе, сохрани file_id
  2. Рассылай через file_id — мгновенно, без upload
  3. file_id персистентный — храни в базе, используй повторно

По-моему, это самая недооценённая фича Bot API. Я раньше пролистывал эту секцию в доках. Оказалось — критическая оптимизация для любой рассылки с медиа.

Источники

Подписаться на обновления — @sereja_tech