Как работают боты в Telegram?
Данная статья носит более технический характер, нежели публицистический, и предназначена она для тех, кто абсолютно не представляет, однако действительно хочет поднять и разобраться в механике работы ботов в мессенджерах - в частности в Telegram.
Мы понимаем, что разговор о ботах для вас, наверное, было бы удобнее вести начиная с интерфейса бота, в том его виде в котором он встречается в самом мессенджере, однако это будет не совсем корректно, потому как, во-первых, боты могут быть и без интерфейса, а, во-вторых, интерфейс у них может быть совершенно разным. Так или иначе, обсуждение ботов через их интерфейс было бы непоследовательно и не системно.
Давайте начнём с того, что каждый бот - это некий кусок кода - скрипт. Для тех, кто хоть немного представляет как устроен интернет, можно провести простую аналогию: бот это фактически веб-сайт, только без самой веб страницы (точнее его веб-страница это кнопки бота которые вы видите в мессенджере)... Простой Бот, как и простой веб-сайт, может состоять из нескольких строк текста (кода) и выполнять какую-то определённую небольшую задачу. Такие небольшие статичные боты, как и статичные веб-сайты, не меняют свои данные при использовании. Они только выполняют заложенную в них программу (если вы знакомы с концепцией Web 1.0, то это именно она). Так же, как и большие веб-сайты - порталы, большой и сложный бот может представлять собой самостоятельное полноценное приложение со всеми соответствующими ему атрибутами - внутренней структурой и собственной базой данных, а иногда и несколькими - позволяющей боту вести себя по разному для разных пользователей в зависимости от сохраненных ранее данных (это уже концепция Web 2.0).
Для того чтобы скрипт бота мог работать и взаимодействовать с пользователями, он должен находиться на сервере, подключённом к сети интернет.
Да - как видите боты не хранятся в Telegram, более того ни о каком Telegram речи пока и не идёт.
Итак, скрипт, хранящейся на сервере, это логика бота - то что он знает и умеет. В то же время то, каким образом вы обращаетесь к боту - является его интерфейсом.
Обращаться к боту можно разными способами, например при помощи API (Application Programming Interface) - программный интерфейс приложения. Другими словами некий набор инструкций или команд имеющих определённый понятный боту синтаксис (язык). Чаще всего эти команды выглядят как ссылки в интернет с дополнительными параметрами. Такая "ссылка" тоже содержит в себе адрес бота, нужные данные и параметры. Бот получая такие команды отвечает заложенным в него образом.
Справедливости ради, надо отметить что любое обращение к боту осуществляется при помощи его API - никак по-другому обратиться к боту, по сути, нельзя. Однако, в рамках данной статьи на том уровне, на котором ведётся обсуждение вопроса, давайте разделим интерфейсы обращения к боту на два вида:
1. Программный интерфейс приложения API.
2. Пользовательский интерфейс приложения UI.
Пользовательский интерфейс - UI (User Interface) может быть представлен в виде кнопок, которые будут показаны пользователю посредством того клиента (приложения), при помощи которого он будет пользоваться ботом (в нашем случае клиент Telegram). Пользовательский интерфейс может вообще не быть представлен визуально. То есть, бот может работать inline и не иметь никаких кнопок, управляться при помощи текста отправляемого пользователем в чат (например чат боты поддержки), либо при помощи набора команд, имеющих заранее оговоренный синтаксис. Есть боты настолько узкоспециализированные, что им вообще не требуется управление. Например, бот который удаляет системные сообщения из групп Telegram. Такой бот можно просто добавить в чат и он сразу начнёт выполнять свою работу - ему не нужны никакие настройки и у него нет никакого интерфейса.
Итак, что мы имеем на данный момент... У нас есть некий скрипт (бот), который находится на сервере, подключённом к интернет. У данного скрипта есть своя внутренняя логика и интерфейс для обращения к нему извне. Интерфейс будет показан вам в Telegram, а логика будет исполняться на сервере, где хранится его код.
Вот теперь мы переходим в Telegram.
Основная функция бота в Telegram, и вообще его концепция, это получать какой-то запрос от пользователя, обрабатывать его и выдать обратно какую-то информацию, либо совершать действие в соответствии с полученным запросом (командой).
Поскольку Telegram является мессенджером, то и общение в нём происходит при помощи сообщений (текста). Пользователи Telegram общаются друг с другом при помощи текста - в личных сообщениях или в чатах. С этой точки зрения бота можно представить как одного из собеседников. Боты также могут находиться в группах и с ними так же можно начать личный чат. Таким образом, боты созданные для Telegram, это фактически роботы принимающие текст сообщения и способные реагировать на него. Все эти кнопки и команды которые вы видите "в ботах" - ни что иное, как способ передать боту текст сообщения. Нажимая кнопку вы просто отправляйте сообщение с её именем в чат. Для Бота не имеет значения, нажали вы кнопку в чате с ним, отправили ему команду или просто отправили сообщение с текстом соответствующим тексту на кнопке - единственное, что увидит бот это сообщение (текст), и на него он и будет реагировать, если подобная реакция заложена в него разработчиком.
Итак, скрипт бота хранится на сервере в интернете, а пользователь может обращаться к его функционалу при помощи текстовых сообщений в чате, которые будут переданы боту клиентом Telegram.
Возникает вопрос: а откуда Telegram знает, куда отправлять сообщения пользователя - на какой сервер в интернет? Как Telegram-у связать пользователя, его запрос и код бота находящийся на удалённом сервере где-то в интернете? Для того, чтобы ответить на этот вопрос, давайте рассмотрим процесс создания бота в Telegram.
Все боты которые могут работать через Telegram и имеют там свой Адрес, создаются при помощи специального бота: @BotFather.
Основная его задача состоит в том, чтобы присвоить новому боту: Telegram ID, Секретный Ключ и ассоциировать их с Адресом в Telegram. Конечно у @BotFather существуют и другие функции, однако в рамках данной статьи мы рассмотрим только эту.
Telegram ID: представляет собой последовательность цифр, фактически это порядковый номер бота. Этот номер позволяет однозначно идентифицировать бот. Изменить его нельзя, можно только удалить бот и создать новый.
Секретный Ключ: это набор латинских букв и цифр. Знание данного секретного ключа говорит Telegram о том, что Вы являетесь хозяином данного бота. Не размещайте данный ключ в публичных местах. Секретный Ключ изменить можно, в частности в том случае если он стал известен кому-то ещё.
Адрес бота в Telegram: это некое слово или последовательность латинских букв и цифр. Адрес Бота начинается с "@" и заканчивается словом "bot". Может содержать символ нижнего подчёркивания "_". В общем случае изменить Адрес бота, также как и его ID, тоже нельзя.
Поговаривают, что существует возможность изменения Адреса бота, через поддержку самого Telegram, однако насколько это рабочий способ нам неизвестно.
Итак, при создании нового бота, вы сами укажете его Адрес, а BotFather сгенерирует и пришлет вам его Токен.
Токен (Token): сочетание ID и Ключа - записанные через двоеточие.
ПримерTelegram ID: 123556789
Пример Секретного Ключа: Whyf4653vhiy5f3f48ij5gh54sf3t7jh54f68
Пример Адреса: @Address777_Bot
Пример Токена: 123556789:Whyf4653vhiy5f3f48ij5gh54sf3t7jh54f68
Такое сочетание ID и Ключа в Telegram все называют: Токеном, Секретным Ключом, API или Ключом API.
Так или иначе, эти данные позволяют однозначно идентифицировать ваш бот в Telegram и обращаться к Telegram от имени этого бота - подтверждая свои права при помощи Секретного Ключа.
Давайте подведём промежуточный итог. У нас есть код бота на удалённом сервере, у Telegram есть возможность передавать этому боту обращения юзера в виде текстовых сообщений. Мы создали Адрес бота в Telegram для пользователей и получили персональный Идентификатор (ID) и Секретный Ключ для бота.
Как же связать их вместе и заставить работать?
Нам нужно чтобы Telegram, получив сообщение от пользователя, мог передать его боту на удалённый сервер, а бот, обработав полученный запрос, вернуть свой ответ Telegram, который, в свою очередь, покажет его пользователю в виде сообщения...
Так мы плавно подошли к концепции Вебхуков (Webhooks).
Для того чтобы Telegram мог обращаться к коду бота на удалённом сервере и получать от него ответы, используются Вебхуки (Webhooks). Как же работают Вебхуки?
Мы передаём созданный нами Токен бота (сочетание ID и Секретного Ключа) на удалённый сервер, который при помощи специального запроса устанавливает Вебхук - то есть связь с Telegram. Вебхук позволяет Telegram передавать коду бота на удалённом сервере сообщения от пользователя, потому что имея установленный Вебхук, Telegram знает IP адрес удаленного сервера, к которому нужно обращаться. Другими словами, удалённый сервер, устанавливая Вебхук для Telegram, представляется при помощи ID и подтверждает свои права на этот ID при помощи Секретного Ключа, а также предоставляет Telegram-у свой IP адрес в интернете для связи.
В общем случае цепочка общения пользователя с ботом выглядит так:
1. Пользователь отправляет сообщения в чат с Адресом бота.
2. Telegram имея ассоциацию Адреса и ID бота обращается к Вебхуку, в котором хранится IP адрес удалённого сервера с кодом бота, и передаёт ему обращение.
3. Бот на удалённом сервере обрабатывает запрос и возвращает ответ Telegram, который, в свою очередь, представляет ответ в виде сообщения в чате.
Итак, Вебхук позволяет Telegram обращаться к удалённому серверу при необходимости, не ожидая запроса от этого сервера. Это нужно для того, чтобы пользователь бота мог сам инициировать взаимодействие с ботом, а Telegram знал, а главное мог сразу отправлять его запросы по нужному адресу. Это делает взаимодействие моментальным.
Для полноты картины надо заметить, что взаимодействие бота с Telegram может осуществляться и без Вебхуков. Такая модель работы может использоваться, если бот не очень активный и будет достаточно, если он сам будет спрашивать Telegram, чтобы получить список запросов от юзеров. Бывают боты, работа которых вообще не предусматривает получение информации от пользователя, бот сам отправляет какие-то данные с нужной ему периодичностью. Такие боты тоже работают без Вебхуков.
На каждый ID бота в Telegram может быть установлен только один Вебхук. Таким образом Telegram всегда знает к какому удалённому серверу с кодом обращаться.
Вы установили Вебхук - связь Telegram с удалённым сервером. Что же произойдёт, если на другом удалённом сервере также попытаться установить Вебхук используя ваши ID и Ключ? Давайте представим, что вы разместили свой Секретный Ключ в публичном пространстве и кто-то другой захотел подключиться к Telegram от имени вашего бота используя свой удаленный сервер. Зная ваш Токен, то есть ID бота и Секретный Ключ, он может со своего сервера также обратиться к Telegram и установить свой Вебхук.
Любой, кто знает правильное сочетание ID и Секретного Ключа, для Telegram является Владельцем бота и получает все соответствующие возможности.
Как мы писали выше, Telegram может хранить только один Вебхук для одного бота, таким образом все запросы пользователей будут передаваться на тот удалённый сервер который ПОСЛЕДНИМ установил Вебхук в Telegram.
Старый Вебхук всегда перезаписывается новым.
Поэтому все запросы ваших пользователей будут пересылается на удаленный сервер злоумышленника, а юзеры и вы будете видеть интерфейс ЕГО бота.
В этом случае может сложиться впечатление, что вы потеряли свой бот, однако это не совсем так. Вы по-прежнему Владелец бота, потому как его Адрес и ID по-прежнему ассоциированы с вашим аккаунтом в Telegram. То есть в любой момент вы можете сменить Токен (Секретный Ключ) и злоумышленник, не зная нового Секретного Ключа, утратит возможность связи с Telegram от имени вашего бота.
Надо заметить, что временная утрата доступа к боту НЕ всегда имеет криминальный характер. Более того она довольно редка именно из-за того, что легко исправляется сменной Токена.
Иногда с подобным поведением можно столкнуться, если вы создаёте бот одновременно на нескольких сторонних конструкторах, либо создавая бот на конструкторе вы отправляете Токен в какой-нибудь веб-сервис для работы по API.
Когда вы создаёте и запускаете бот у себя на сервере, то вы сами и устанавливаете Вебхук для Telegram при помощи своего Токена, давая им возможность взаимодействовать. При создании же бота на конструкторе, уже конструктор создаёт код вашего бота у СЕБЯ на сервере и соответственно, для связи с Telegram, ВЫ должны предоставить конструктору имеющийся Токен для создания Вебхука. После предоставления Токена конструктору он моментально создает Вебхук для Telegram. Если вы предоставите данный Токен нескольким конструкторам или веб-сервисам одновременно, то каждый из них будет переписывать Вебхук для Telegram на свой. В общем случае работать всегда будет тот сервис который последним записал свой Вебхук в Телеграм, однако возможны варианты. Так или иначе, поведение вашего бота может стать непредсказуемым.
Подробнее об этом смотрите в статье "Меню бота пропадает и появляется само собой". Для целей данной статьи, основная мысль которую вы должны понять: что бот это некий программный код, работающий на удалённом сервере и связанный с Telegram при помощи Вебхука, который позволяет ему передавать запросы пользователей и возвращать ответы бота. Тот, кто последним установил Вебхук, и является ботом для Telegram. Поэтому не нужно использовать один и тот же Токен в разных сервисах одновременно, а переходя на новый сервис лучше сменить и Токен.
Теперь вы знаете как работают боты в Telegram.