Массовая рассылка в Telegram: почему альбом на 800 юзеров шёл 30 минут
Написал рассылку альбома из 6 картинок на 871 пользователя @hashslash_bot. Ожидал минуту-две. Полчаса — 100 человек.
Я загружал 18 мегабайт 871 раз.
Что пошло не так
Попросил Claude Code на Opus 4.5 написать скрипт:
Агент выдал код. Выглядит правильно: 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 запроса = меньше минуты.
Три правила
- Загружай один раз — отправь себе, сохрани
file_id - Рассылай через file_id — мгновенно, без upload
- file_id персистентный — храни в базе, используй повторно
По-моему, это самая недооценённая фича Bot API. Я раньше пролистывал эту секцию в доках. Оказалось — критическая оптимизация для любой рассылки с медиа.
Источники
Подписаться на обновления — @sereja_tech