Бот — это программа
Телеграм-бот кажется собеседником, который живёт внутри мессенджера. На самом деле бот — это ваша программа, которая работает на вашем компьютере или сервере, а Телеграм только передаёт ей сообщения и доставляет ответы. Этот простой факт объясняет почти все первые недоумения: почему бот молчит, когда закрыт ноутбук, почему «забыл» всё после перезапуска и почему двое одновременно запущенных ботов ругаются друг на друга.
Разговор с Телеграмом идёт через Bot API — набор адресов, по которым программа делает обычные интернет-запросы: «дай новые сообщения», «отправь текст в такой-то чат», «покажи кнопки». Каждый такой запрос — это вызов метода: getUpdates, sendMessage, sendPhoto и десятки других. Программа на любом языке может вызывать их напрямую, но так быстро становится неудобно: нужно разбирать ответы, повторять запросы после сбоев, следить за порядком.
Поэтому пишут на библиотеке. В этом курсе это aiogram третьей версии — одна из самых распространённых библиотек для ботов на Python. Она берёт на себя разговор с Bot API и даёт удобный язык: «когда придёт команда /start — сделай вот это». Но под ней по-прежнему те же запросы, и знать, что происходит внизу, полезно: когда что-то сломается, сообщение об ошибке придёт именно от Bot API.
Отсюда первое правило работы с ботами: бот отвечает, только пока работает программа. Пока вы учитесь, программа запущена у вас на компьютере; закрыли крышку — бот замолчал. Сообщения, пришедшие за это время, Телеграм сохранит и отдаст, когда программа снова спросит, — но не навсегда, об этом ниже. Чтобы бот отвечал круглые сутки, программу переносят на сервер; это тема последнего урока.
BotFather и токен
Чтобы Телеграм знал, какой программе отдавать сообщения, бота регистрируют. Делается это у служебного бота @BotFather — в самом мессенджере, без сайтов и анкет. Ему пишут команду /newbot, и он задаёт два вопроса.
Первый — имя: то, что человек видит в списке чатов, например «Запись в барбершоп». Его можно менять когда угодно. Второй — имя пользователя, адрес бота: латиницей, уникальное на весь Телеграм и обязательно оканчивающееся на «bot» — например barber_zapis_bot. По нему бота находят поиском и открывают ссылкой t.me/barber_zapis_bot.
В ответ BotFather выдаёт токен — длинную строку из числа, двоеточия и набора знаков:
123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
Число до двоеточия — номер бота, остальное — секрет. Токен — это одновременно логин и пароль: кто его знает, тот может от имени бота читать сообщения и писать людям. Поэтому токен не публикуют: не вставляют в код, который уходит в общий репозиторий, не пересылают в чатах, не показывают на скриншотах. Как хранить его правильно, разберём в седьмом уроке.
Если токен всё-таки утёк, его не нужно «надеяться, что никто не заметил». У BotFather есть команда /revoke: старый токен перестаёт работать, выдаётся новый. Бот при этом остаётся тем же — с тем же адресом и теми же людьми, — меняется только ключ, которым программа к нему подключается.
У BotFather настраивают и внешний вид: описание, которое человек видит до первого сообщения, картинку, список команд, всплывающий при наборе косой черты (/setcommands). Это не требует программирования и хорошо делать сразу: пустой бот без описания выглядит заброшенным.
Обновления
Всё, что происходит с ботом, Телеграм оформляет как обновление (update). Пришло сообщение — обновление. Человек нажал кнопку под сообщением — обновление. Отредактировал своё сообщение, добавил бота в группу, заблокировал его — тоже обновления, каждое своего вида.
У каждого обновления есть номер — update_id, — и номера растут по порядку. Когда программа забирает обновления, она сообщает Телеграму: «всё до такого-то номера я получила». После этого Телеграм их больше не отдаёт. Если не сообщить, программа будет получать одно и то же сообщение снова и снова — библиотека делает это за вас, но знать об этом стоит.
Вот как выглядит обновление с обычным сообщением, если заглянуть под библиотеку:
{
"update_id": 815273041,
"message": {
"message_id": 12,
"from": { "id": 58201937, "first_name": "Аня" },
"chat": { "id": 58201937, "type": "private" },
"date": 1758790000,
"text": "/start"
}
}
Здесь есть всё, что нужно для ответа: кто написал (from), в каком чате (chat) и что именно (text). В личной переписке номер чата совпадает с номером человека; в группе чат свой, а людей в нём много. Отвечают всегда в чат, а не человеку: так ответ в группе увидят все, а в личке — только он.
Пока программа не забрала обновления, Телеграм их хранит — но не дольше суток. Если бот был выключен двое суток, сообщения за первые сутки пропадут. Для учебного бота это не страшно; для бота, который принимает заявки, — это потерянные клиенты, и ещё один довод в пользу сервера.
И последнее: бот не может написать первым человеку, который его ни разу не запускал. Это защита от рассылок. Пока человек не нажал «Запустить» (то есть не отправил /start), у бота нет права ему писать, и попытка закончится ошибкой.
Опрос и вебхук
Остался вопрос: как программа узнаёт, что пришло новое? Способов два.
Опрос (polling) — программа сама спрашивает Телеграм: «есть новые обновления?» Спрашивает хитро: если нового нет, Телеграм не отвечает сразу «нет», а держит запрос открытым до минуты и отвечает, как только что-то появится. Это называется длинный опрос, и благодаря ему бот отвечает почти мгновенно, не засыпая Телеграм запросами. Опросу не нужно ничего, кроме интернета: он работает на ноутбуке, за домашним роутером, где угодно.
Вебхук (webhook) — наоборот: программа один раз сообщает Телеграму свой адрес, и дальше Телеграм сам присылает каждое обновление на этот адрес. Для этого нужен сервер, доступный из интернета, с доменом и сертификатом HTTPS. Вебхук удобен для больших ботов и для площадок, где программа просыпается только по запросу, но настраивать его сложнее.
Способы взаимоисключающие: пока у бота настроен вебхук, опрос не работает, и наоборот. Для учёбы и для большинства небольших ботов берут опрос — весь этот курс написан на нём.
С опросом связана частая ошибка новичка: программа запущена дважды — например, в двух окнах терминала или на ноутбуке и на сервере одновременно. Два опроса с одним токеном мешают друг другу: Телеграм отвечает второму ошибкой о конфликте, а обновления достаются то одному, то другому. Правило простое: один токен — одна запущенная программа. Для экспериментов заводят второго, тестового бота со своим токеном.