Telegram Bot API или MTProto: что выбрать
Bot API — HTTPS-интерфейс по токену BotFather: простой и безопасный, но бот видит только новые события, адресованные ему. MTProto — API для клиентов Telegram: пользовательский аккаунт (юзербот) читает историю, список участников и отправляет файлы до 2 ГБ, но упирается в FLOOD_WAIT и рискует баном. Сервис для клиентов — бот, автоматизация своего аккаунта — MTProto.
Обновлено:
Разница в двух словах
В Bot API вы работаете как бот: по токену, через HTTPS и только в рамках того, что разрешено ботам. В MTProto вы обычно входите как пользователь — по телефону, коду и 2FA — и можете из кода делать почти всё, что доступно в приложении Telegram. Больше возможностей — больше ответственности и рисков.
Важное уточнение: MTProto не равно «юзербот». Боты тоже могут авторизоваться через MTProto (auth.importBotAuthorization, с api_id), но ограничения ботов при этом сохраняются. На практике под «MTProto» чаще всего имеют в виду работу от имени пользовательского аккаунта — в этом смысле термин используется и в статье.
Термины
- Bot API
- HTTP-интерфейс на api.telegram.org. Каждый запрос: /bot<token>/имяМетода, ответ в JSON.
- MTProto API
- Протокол и API для клиентов Telegram. Для подключения нужны api_id и api_hash с my.telegram.org.
- Юзербот
- Обычный пользовательский аккаунт, автоматизированный через MTProto. Не официальный термин, а жаргон разработчиков.
- Telethon
- Популярная Python-библиотека для MTProto. Клиент
TelegramAccountв Socialift построен поверх Telethon. - Локальный сервер Bot API
- Собственный экземпляр открытого сервера Bot API: расширяет лимиты на файлы и ограничения вебхука.
Большая сравнительная таблица
| Критерий | Bot API | MTProto (аккаунт пользователя) |
|---|---|---|
| Авторизация | Токен BotFather | api_id + api_hash, затем телефон → код → 2FA; результат — строка сессии |
| Транспорт | HTTPS + JSON, запросы без состояния | Постоянное соединение MTProto, состояние сессии хранится |
| Написать первым | Нельзя: человек должен написать боту или добавить его в группу | Можно, но действуют настройки приватности и антиспам-ограничения |
| Чтение истории | Метода нет; только новые update, они хранятся до 24 часов | Полная история (если в группе не скрыта от новых участников) |
| Список участников | Только администраторы, статус одного участника и их число | Список доступен; подписчиков канала видят только админы, админы могут скрыть список |
| Сообщения в группах | Privacy mode: только команды и ответы (всё — если бот админ или режим выключен) | Всё в чатах, где состоит аккаунт |
| Вступление в чаты | Сам вступить не может — его добавляют | По инвайт-ссылке или публичному @username |
| Отправка файлов | 50 МБ (фото 10 МБ); на локальном сервере 2000 МБ | 2 ГБ, с Telegram Premium 4 ГБ |
| Скачивание файлов | 20 МБ; на локальном сервере без ограничений | Файлы, доступные аккаунту, до 4 ГБ |
| Лимиты скорости | Документированы: ~1 сообщение/с в чат, 20/мин в группу, ~30/с в рассылке; превышение — 429 + retry_after | Публичных цифр нет; превышение — 420 FLOOD_WAIT_X, ждать X секунд |
| Отложенные сообщения | Нет | Есть: Telegram сам отправит сообщение в заданное время |
| Статистика канала | Нет | Для админов каналов от определённого размера |
| Риск по ToS | Низкий; главный риск — утечка токена | Аккаунты неофициальных клиентов под наблюдением; спам, флуд, накрутка — вечный бан |
| Хостинг | Вебхук (443/80/88/8443) или long polling, подходит для serverless | Долгоживущий процесс; одну сессию нельзя использовать параллельно (AUTH_KEY_DUPLICATED) |
| SDK Socialift | Telegram | TelegramAccount (pip install "socialift[telegram]") |
Как выбрать: решение под задачу
| Задача | Выбор | Почему |
|---|---|---|
| Ответы клиентам, статусы заказов, уведомления | Bot API | Человек сам жмёт /start, есть кнопки и вебхук, низкий риск бана |
| Новости для тысяч подписчиков | Канал + бот (публикует как админ) | Не упираетесь в лимиты личных сообщений |
| Модерация своей группы | Bot API | Бан, ограничения и заявки на вступление есть у бота |
| Экспорт или анализ истории своих чатов | MTProto | У бота нет метода истории |
| Список участников своей группы | MTProto (как админ) | Bot API не отдаёт полный список |
| Отложенные посты в канале, статистика | MTProto | В Bot API этого нет |
| Файлы больше 50 МБ | MTProto или локальный сервер Bot API | Лимит официального сервера Bot API — 50 МБ |
| Массовые сообщения или инвайты незнакомым | Ни то, ни другое | Противоречит правилам Telegram, аккаунт могут заблокировать навсегда |
Юзербот — это законно? Что говорят правила Telegram
Telegram приглашает разработчиков создавать приложения на своём API и не берёт за это плату. Значит, сама автоматизация аккаунта через MTProto не запрещена. Но есть условия: у приложения должен быть собственный api_id, оно не должно действовать от имени пользователя без его ведома и согласия и не должно использовать данные Telegram для обучения моделей ИИ.
На официальной странице прямо сказано: все аккаунты, вошедшие через неофициальные клиенты, автоматически ставятся под наблюдение, а за флуд, спам и накрутку подписчиков или просмотров каналов — вечный бан. У Bot API тоже есть правила, но главный риск бота обычно — утечка токена, и она решается командой /token в BotFather.
Оба подхода в одном проекте
Часто правильный ответ — «оба»: аккаунт читает то, что закрыто для бота, а бот выполняет видимую клиенту часть.
import asyncio
from socialift import Telegram, TelegramAccount
async def main():
async with Telegram.from_env() as bot, TelegramAccount.from_env() as account:
# Аккаунт: то, чего бот не может, — поиск по истории группы
last = await account.messages("@my_group", limit=100)
found = await account.search("@my_group", "цена", limit=100)
# Бот: публикует отчёт в канал от своего имени (бот — админ канала)
await bot.send_message("@my_channel",
f"Прочитано сообщений: {len(last)}, со словом «цена»: {len(found)}")
asyncio.run(main())Telegram.from_env() читает TELEGRAM_BOT_TOKEN, а TelegramAccount.from_env() — TELEGRAM_API_ID, TELEGRAM_API_HASH и TELEGRAM_SESSION.
Лимиты: две разные ошибки — один except
Bot API возвращает 429 и retry_after, MTProto — FLOOD_WAIT_X. SDK приводит оба случая к RateLimitError; если время ожидания известно, оно в retry_after, иначе делайте резервную паузу.
import asyncio
from socialift import RateLimitError
async def send_with_backoff(client, chat, text: str):
"""client — Telegram или TelegramAccount."""
try:
return await client.send_message(chat, text)
except RateLimitError as exc:
await asyncio.sleep(exc.retry_after or 5)
return await client.send_message(chat, text)Когда бота недостаточно
- Нужно читать сообщения до добавления бота или те, что бот не получает.
- Нужен список участников группы или канала, а не только их число или админы.
- Нужна статистика канала или отложенные посты, которые отправит сам Telegram.
- Нужны файлы больше 50 МБ, а поднять локальный сервер Bot API нет возможности.
- Нужны пользовательские действия: создать группу или канал, вступить в чат по ссылке.
Частые вопросы
Telethon или Bot API — что лучше?
Они для разных задач. Bot API удобнее и безопаснее для публичных сервисов, уведомлений и модерации. Telethon (MTProto) нужен для работы от имени аккаунта, истории, списков участников и больших файлов, но требует серьёзного внимания к FLOOD_WAIT и правилам ToS.
Что такое юзербот в Telegram и запрещён ли он?
Юзербот — обычный аккаунт, автоматизированный через MTProto. Сам по себе он не запрещён, но действуют Telegram API Terms of Service: запрещены действия без согласия пользователя, спам, флуд и накрутка. Аккаунты неофициальных клиентов автоматически находятся под наблюдением.
Может ли бот прочитать историю группы?
Нет. В Bot API нет метода для чтения истории чата: бот получает только новые обновления, а в группах из-за privacy mode — лишь их часть. Если нужна история, используйте MTProto через аккаунт, состоящий в группе.
Какой лимит на размер файла в MTProto?
Обычный аккаунт загружает файлы до 2 ГБ, аккаунт с Telegram Premium — до 4 ГБ. На официальном сервере Bot API лимит отправки — 50 МБ, скачивания — 20 МБ.
Можно ли использовать бота через MTProto?
Да: auth.importBotAuthorization авторизует бота по токену и api_id, после чего работает большинство методов MTProto. Ограничения ботов при этом сохраняются. В Socialift для бота есть клиент Telegram (Bot API), для пользовательского аккаунта — TelegramAccount.
Можно ли использовать оба API в одном проекте?
Да, это распространённая схема: бот общается с клиентами и модерирует, а аккаунт получает закрытые для бота данные — историю, список участников или статистику. В SDK у обоих клиентов единая модель ошибок.