Что такое бот и как он общается с Telegram

Telegram-бот — это аккаунт, которым управляет не человек, а твоя программа: она получает сообщения и сама на них отвечает.
Бот (Telegram-бот) — специальный аккаунт в Telegram, которым управляет программа, а не человек: он принимает сообщения и автоматически на них отвечает.

Зачем тебе это вообще нужно

Представь обычный школьный день. Ты приходишь домой, открываешь Telegram, а там тебе пишет аккаунт по имени «Цыплёнок-помощник»: «Привет! Не забудь, завтра сдавать реферат по истории. И, кстати, на улице +3 и дождь — бери куртку». Ты не настраивал будильник, не лез в приложение погоды — просто кто-то сам всё вспомнил и написал.

Только это не «кто-то». Это программа, которую ты сам напишешь к концу этого курса. Через все уроки мы будем собирать одного и того же бота — «Цыплёнка-помощника». Сначала он научится отвечать на одну команду, потом показывать кнопки и меню, вести диалог по шагам, запоминать тебя, ходить за погодой и новостями в интернет, рассылать напоминания и даже работать в чате с друзьями. К финалу это будет настоящий бот, который живёт на сервере и работает сам по себе.

Но прежде чем писать код, надо понять одну простую вещь: что такое бот на самом деле и как он умудряется переписываться с тобой. Без этой картинки весь дальнейший код будет казаться магией, а магия пугает. Давай разберёмся — и страх уйдёт.

Звучит сложно? На самом деле нет. Если ты уже писал на Python хоть пару функций — ты справишься. Никаких «серверов» и «асинхронности» прямо сейчас разбирать не будем, оставим их на потом. Сегодня — только идея.

Бот — это аккаунт без человека внутри

Открой список своих чатов. Там есть мама, лучший друг, классный чат, может быть, какой-нибудь канал с мемами. С точки зрения Telegram все собеседники устроены примерно одинаково: у каждого есть имя, аватарка, и каждому можно написать сообщение.

Бот выглядит ровно так же. У него есть имя, аватарка, ему можно написать. Разница только одна, но важная: за обычным аккаунтом сидит человек, а за ботом — программа. Когда ты пишешь другу, твоё сообщение читает живой человек и отвечает, когда захочет. Когда ты пишешь боту, сообщение читает код, и он отвечает мгновенно — потому что в нём заранее прописано, что делать.

Хорошая аналогия: бот — это как автоответчик, только умный. Ты говоришь — он реагирует по заранее заданным правилам. Только правила эти пишешь ты, и они могут быть какими угодно.

Из этого следует пара вещей, которые сразу полезно понять.

  • Бот не «думает» сам — он делает ровно то, что ты запрограммировал. Если ты не написал, как отвечать на слово «привет», бот промолчит.
  • Бот не может первым написать незнакомому человеку. Сначала пользователь должен сам начать диалог (обычно кнопкой «Старт»). Это защита от спама — и хорошо, что она есть.
  • Бота невозможно создать просто так из приложения. Его регистрируют через специального бота-родителя. Про него поговорим чуть ниже.

Чем бот отличается от обычного аккаунта: коротко

Обычный аккаунтБот
Кто отвечаетЖивой человекПрограмма (код)
Как создаётсяРегистрация по номеру телефонаЧерез бота BotFather, выдаётся токен
Может написать первымДаНет, пока пользователь сам не начнёт
Скорость ответаКогда человек прочитаетМгновенно, по правилам в коде

Как бот «слышит» тебя: официант между тобой и кухней

Вот тут начинается самое интересное. Ты пишешь боту в своём телефоне. А программа бота крутится где-то совсем в другом месте — может, на твоём ноутбуке, может, на сервере в другой стране. Как же твоё сообщение до неё доходит?

Представь ресторан. Ты сидишь за столиком (это ты в Telegram на телефоне). Где-то далеко есть кухня, где готовят (это программа твоего бота). Напрямую ты с поваром не общаешься — между вами ходит официант. Ты говоришь официанту заказ, он несёт его на кухню, забирает готовое блюдо и приносит тебе.

В нашем случае официант — это серверы Telegram. Твоё сообщение сначала улетает к ним, они складывают его в очередь для нужного бота, а программа бота забирает сообщение оттуда, готовит ответ и отдаёт обратно серверам Telegram. А те уже доставляют ответ тебе в чат.

Bot API — набор HTTP-запросов, через которые твоя программа общается с серверами Telegram: получает сообщения и отправляет ответы.

Этот «язык», на котором программа разговаривает с официантом-Telegram, и называется Bot API. Не пугайся слова API: это просто строгий список того, что можно попросить у Telegram и в каком виде. «Дай мне новые сообщения», «отправь вот этот текст вот этому человеку», «покажи кнопку» — всё это отдельные запросы Bot API.

Путь одного сообщения по шагам

Давай проследим, что происходит, когда ты пишешь боту «Привет». Запомни эту цепочку — она лежит в основе вообще всего, что мы будем делать дальше.

  1. Ты набираешь «Привет» и жмёшь отправить. Сообщение уходит с твоего телефона на серверы Telegram.
  2. Telegram видит, что сообщение адресовано боту, и кладёт его в «ящик» этого бота.
  3. Программа бота спрашивает у Telegram: «Есть что-нибудь новое для меня?» — и забирает твоё «Привет».
  4. Код бота смотрит на сообщение и по своим правилам решает, что ответить, например «И тебе привет!».
  5. Бот отправляет этот ответ через Bot API обратно на серверы Telegram.
  6. Telegram доставляет ответ тебе в чат. Ты видишь сообщение от бота.

Вся эта цепочка проскакивает за доли секунды, поэтому тебе кажется, что бот отвечает мгновенно. На самом деле сообщение успело сгонять туда-обратно между твоим телефоном, серверами Telegram и программой бота.

Откуда бот узнаёт, что новое сообщение именно для него

Хороший вопрос: ботов миллионы, как Telegram понимает, какому из них отдать твоё «Привет»? Ответ — по токену.

Токен — секретный ключ вида 123456:ABC..., который Telegram выдаёт боту и по которому отличает его от других; его нельзя публиковать.

Токен — это как пароль от аккаунта бота. Когда твоя программа спрашивает у Telegram «есть что-то новое?», она прикладывает токен, и Telegram понимает: «А, это запрос от Цыплёнка-помощника, вот его сообщения». Если кто-то узнает твой токен — он сможет управлять твоим ботом, читать переписку и слать сообщения от его имени. Поэтому токен никогда не выкладывают в открытый код и не показывают друзьям. Мы ещё вернёмся к этому в разделе про ошибки.

Разбираем на примерах

Пример 1. Как рождается бот: BotFather и токен

Бота нельзя просто создать кнопкой «Регистрация». Его регистрируют через особого бота — он называется BotFather (по-русски «бот-отец»).

BotFather — официальный бот Telegram, через которого создают новых ботов и получают для них токен.

Диалог с ним выглядит примерно так — это просто переписка в Telegram, никакого кода:

Ты:        /newbot
BotFather: Хорошо! Как назовём бота? (это имя увидят люди)
Ты:        Цыплёнок-помощник
BotFather: А теперь придумай username, он должен заканчиваться на 'bot'.
Ты:        chick_helper_bot
BotFather: Готово! Вот токен твоего бота:
           123456789:AAEhBOweik6ad-z...держи в секрете!

Результат: в чате BotFather пришлёт тебе длинную строку — это и есть токен. С этого момента бот существует: его уже можно найти в поиске по username. Но пока он мёртвый — на сообщения не отвечает, потому что программы, которая им управляет, ещё нет. Эту программу мы и начнём писать в следующих уроках.

Пример 2. Как программа забирает сообщения: polling

Мы говорили, что программа бота сама спрашивает у Telegram «есть что-то новое?». У этого способа есть название — polling (от англ. poll — «опрашивать»).

Polling — способ получать обновления, при котором бот сам регулярно спрашивает у Telegram «есть ли что-то новое?».

Представь, что ты ждёшь важную посылку и каждые пять минут заглядываешь в почтовый ящик: пусто, пусто, пусто… а потом — есть! Polling работает так же: программа в цикле снова и снова стучится к Telegram и спрашивает про новые сообщения. Каждое такое сообщение или нажатие кнопки называется обновлением.

Update (обновление) — единица входящих данных от Telegram: новое сообщение, нажатая кнопка или другое событие.

Есть и второй способ — webhook, когда уже не бот спрашивает, а Telegram сам присылает обновление на адрес твоего сервера, как только оно появилось.

Webhook — способ получать обновления, при котором Telegram сам присылает их на адрес твоего сервера.

Разница как между двумя способами узнать о новом сообщении: либо ты сам постоянно проверяешь чат (polling), либо телефон сам пиликает уведомлением, когда что-то пришло (webhook). В курсе мы почти везде будем использовать polling — он проще и не требует своего «адреса в интернете». А webhook прибережём на самый конец, для деплоя на сервер.

Пример 3. Из чего состоит обновление — заглянем внутрь

«Обновление» звучит абстрактно. На деле это просто аккуратный набор данных: кто написал, что написал, в какой чат. Давай для интуиции разберём такой набор обычным Python — без всякого Telegram, просто словарём. Это поможет почувствовать, что внутри обновления нет ничего страшного.

# Так примерно выглядит одно "обновление" от Telegram —
# мы упростили его до обычного словаря Python
update = {
    "from": "Аня",
    "chat_id": 555,
    "text": "Привет",
}

# Бот достаёт из обновления нужные кусочки
kto = update["from"]
tekst = update["text"]

# И по простому правилу решает, что ответить
if tekst == "Привет":
    otvet = kto + ", и тебе привет! Я Цыплёнок-помощник."
else:
    otvet = "Я пока знаю только слово \"Привет\"."

print(otvet)

Вывод:

Аня, и тебе привет! Я Цыплёнок-помощник.

Видишь? Никакой магии. Бот достал из обновления текст и имя, сравнил текст со своим правилом и составил ответ. Настоящий aiogram сделает примерно то же самое, только обновление он сам получит от Telegram, а ответ сам отправит обратно. А мы будем лишь описывать правила: «на такое сообщение — такой ответ».

Пример 4. Кто отправляет ответ: знакомимся с действующими лицами

В коде на aiogram нам встретятся два главных объекта. Знакомиться с ними поближе будем в следующих уроках, но имена полезно запомнить уже сейчас, потому что они пройдут через весь курс.

Bot — объект aiogram, который умеет отправлять запросы в Telegram: слать сообщения, фото, кнопки.
Dispatcher — объект aiogram, который принимает входящие обновления и раздаёт их нужным хэндлерам.

Вернёмся к ресторану. Объект Bot — это рука, которая выносит готовое блюдо: всё, что бот отправляет наружу (текст, картинку, кнопку), идёт через него. Объект Dispatcher (для краткости его обычно зовут dp) — это администратор зала: он смотрит на каждое входящее обновление и решает, какой функции его передать.

Хэндлер — функция-обработчик, которую aiogram вызывает в ответ на определённое сообщение, команду или нажатие кнопки.

А функции, которые в итоге готовят ответ, называются хэндлерами (от англ. handle — «обрабатывать»). Один хэндлер на команду /start, другой на нажатие кнопки, третий на обычный текст. Вся будущая программа бота — это, по сути, набор таких хэндлеров плюс Bot и Dispatcher, которые связывают их с Telegram. Файл с этим кодом мы по традиции назовём bot.py — он будет с нами до конца курса.

Частые ошибки и подводные камни

Эти грабли подстерегают почти каждого новичка. Прочитай сейчас — сэкономишь себе нервы потом.

1. Выложить токен на всеобщее обозрение

Самая частая и самая болезненная ошибка. Кто-то делает первого бота, радуется, выкладывает код на GitHub или скидывает скриншот в чат — а там виден токен. Всё, считай, пароль от бота утёк. Любой, кто его увидел, может слать сообщения от имени твоего бота. Токен — это секрет, как пароль от почты. Позже мы научимся хранить его в переменных окружения, чтобы он вообще не попадал в код. Пока просто запомни правило: токен никому не показываем.

2. Ждать, что бот напишет первым

Новички иногда создают бота и удивляются: «Я ему ничего не писал, а он молчит, сломался?». Нет, всё в порядке. Бот не может написать незнакомому пользователю первым — сначала человек должен сам начать диалог, обычно нажав кнопку «Старт». Это правило Telegram против спама.

3. Путать «бот создан» и «бот работает»

После разговора с BotFather бот уже существует и находится в поиске. Но он будет молчать, пока не запущена программа, которая им управляет. Это как купить телефон, но не вставить симку: устройство есть, а звонить пока нечем. Сам факт регистрации не делает бота «живым» — оживляет его наш код.

4. Думать, что код бота крутится «внутри Telegram»

Это не так. Telegram только передаёт сообщения туда-обратно (помнишь официанта?). Сама программа работает там, где ты её запустил: на твоём компьютере или на сервере. Если ты выключишь компьютер с запущенной программой — бот замолчит, потому что «кухня» закрылась, хотя официант-Telegram на месте.

5. Бояться слов «сервер» и «API»

Эти слова звучат серьёзно, но за ними простые идеи. Сервер — это просто компьютер, который работает постоянно, чтобы программа не выключалась. API — это список запросов, которые можно отправлять Telegram. Не нужно знать всё про серверы, чтобы написать бота: на старте программа спокойно крутится прямо на твоём ноутбуке.

Мини-практика: нарисуй путь сообщения

Кода тут не будет — этот урок про понимание. Зато упражнение закрепит главную картинку курса. Возьми лист бумаги или заметки в телефоне и сделай вот что.

  1. Нарисуй четыре «коробочки» в ряд: Ты (телефон), Серверы Telegram, Программа бота. Между ними оставь место для стрелок.
  2. Стрелками покажи путь сообщения «Привет», которое ты отправил боту: от тебя — к Telegram — к программе. Подпиши над стрелкой, что именно передаётся.
  3. Теперь стрелками обратно покажи путь ответа бота «И тебе привет!»: от программы — к Telegram — к тебе.
  4. На стрелках между программой и Telegram подпиши Bot API — ведь именно по нему они общаются.
  5. Рядом с программой бота нарисуй маленький ключик и подпиши токен — то, без чего Telegram не узнает твоего бота.

А теперь вопрос на подумать (ответь себе словами): если ты выключишь компьютер, на котором запущена программа бота, какая из коробочек «погаснет» и почему бот перестанет отвечать? Если ты можешь объяснить это другу — значит, главную идею урока ты усвоил.

Итоги

Соберём всё в одну картину.

  • Бот — это аккаунт в Telegram, которым управляет программа, а не человек; он отвечает по правилам, которые пишешь ты.
  • Бот общается с тобой не напрямую: посередине стоят серверы Telegram — как официант между столиком и кухней.
  • Язык этого общения — Bot API: список запросов «дай новые сообщения», «отправь ответ» и так далее.
  • Telegram узнаёт твоего бота по токену — секретному ключу, который нельзя никому показывать.
  • Программа забирает сообщения через polling (сама спрашивает) или webhook (Telegram присылает сам); каждое сообщение — это обновление.
  • В коде на aiogram нам встретятся Bot (отправляет наружу), Dispatcher (раздаёт обновления) и хэндлеры (обрабатывают их).

В следующем уроке мы перейдём от теории к делу: создадим нашего Цыплёнка-помощника через BotFather, получим токен, поставим библиотеку aiogram и напишем первые строчки в файле bot.py. Уже совсем скоро твой бот ответит на первое /start — и ты увидишь, как вся эта цепочка с официантом оживает по-настоящему.

Проверьте себя
1. Чем Telegram-бот отличается от обычного аккаунта?
AБотом управляет программа, а обычным аккаунтом — живой человек
BБот не виден в поиске, а обычный аккаунт виден
CБоту нельзя отправить сообщение
DМежду ними нет никакой разницы
2. Что такое Bot API?
AИмя бота, которое видят пользователи
BНабор HTTP-запросов, через которые программа общается с серверами Telegram
CПрограмма на компьютере, где запущен бот
DКнопка для создания нового бота
3. Зачем боту нужен токен?
AЧтобы пользователи знали, как бота зовут
BЧтобы Telegram отличал твоего бота от других и понимал, чьи это запросы
CЧтобы ускорить ответы бота
DЧтобы бот мог писать первым
4. Через кого проходит сообщение по пути от тебя к программе бота?
AНапрямую, минуя кого-либо
BЧерез серверы Telegram, которые работают как официант между тобой и программой
CЧерез BotFather
DЧерез другого пользователя
5. Что такое polling?
AСпособ, при котором бот сам регулярно спрашивает у Telegram про новые обновления
BСекретный ключ бота
CИмя функции-обработчика
DСпособ создать бота через BotFather
6. Почему только что созданный через BotFather бот может молчать?
AПотому что у него нет аватарки
BПотому что Telegram его ещё не одобрил
CПотому что ещё не запущена программа, которая им управляет
DПотому что пользователь не оплатил подписку