Для начала давайте определимся с тем что такое бот. Бот представляет из себя интерфейс telegram с помощью которого может вызываться любая программа. То есть это прослойка между чатом в вашем телефоне и кодом на компьютере или сервере, помогающая отправить и получить данные в чате.
С ботом можно начать диалог как и с обычным человеком, или добавить его в группу. Разница в том, что бот понимает только ограниченный набор заранее заданных команд, которые передаются в программу. В зависимости от логики программы, бот может отвечать в чат или выполнять любые другие действия, доступные языку программирования на котором написан код. То есть можно, например, получить данные из базы данных, найти нужный файл, сохранить изображение и еще много чего.
Схематично это взаимодействие выглядит примерно так:
Папа ботов
Для того, чтобы создать своего бота, необходимо обратиться с этой просьбой к отцу всех ботов:) На полном серьезе.
Ищем бота с ником @botfather и начинаем с ним диалог:
Пишем ему сообщение /help и получаем перечень всех команд для botfather.
Здесь мы не будем подробно останавливаться на описании каждой команды. Сейчас нас интересует только создание нового бота. Это команда /newbot. Отправим её botfather и посмотрим что будет.
При получении этого сообщения botfather начинает процесс создания и просит вас задать имя для вашего нового бота, а затем и username. Разница в том, что имя может быть любым, тогда как username обязательно должно оканчиваться на «bot» (для того чтобы человек сразу понимал, что общается с ботом, а не с другим человеком). Для упрощения мы зададим одинаковые имя и username нашему боту.
После того, как название выбрано, botfather присылает нам токен бота.
Токен – это уникальный идентификатор нашего бота. Точка связи между ботом и кодом на сервере/компьютере. Именно по нему наш код будет обращаться к боту и попадать туда куда нужно, а бот в свою очередь идентифицировать то, что обращаются именно к нему.
На этом наше общение с botfather окончено.
Пишем функционал бота
Переходим ко второй части создания бота – написанию кода. В этой статье мы будем рассматривать в качестве основы python, который для начла нужно установить, если он у вас еще не установлен. Сделать это можно на официальном сайте python просто следуя инструкциям установщика.
После того как питон установлен, нам нужно установить библиотеку telepot, обеспечивающую взаимодействие python с telegram. Сделать это можно за 5 секунд. Открываем командную строку и пишем там $ pip install telepot.
В случае успешной установки мы увидим, Successfully installed. Вот как это выглядит у меня после всего «птичьего текста» процесса установки.
Описание всего функционала библиотеки доступно здесь. Написано легко и понятно. Но на английском.
Теперь у нас есть python и библиотека telepot, позволяющая взаимодействовать с telegram. Время написать простой код.
import telepot
from pprint import pprint
bot = telepot.Bot('***** Сюда надо вставить токен, полученный у botfather *****')
response = bot.getUpdates()
pprint(response)
Здесь мы подключили библиотеки telepot и pprint, добавили токен, полученный нами ранее у botfather, послали запрос боту на то чтобы он отправил нам последние сообщения (bot.getUpdates()) и вывели результат на экран. Полученное сообщение выглядит так:
{'message': {'chat': {'first_name': 'Nick',
'id': 999999999,
'type': 'private'},
'date': 1465283242,
'from': {'first_name': 'Nick', 'id': 999999999},
'message_id': 10772,
'text': 'Hello'},
'update_id': 100000000}
Важный нюанс! Бот не человек, сам инициировать беседу не может, поэтому до того как выполнять код, вам необходимо проявить инициативу:) Для этого найдем в telegram нашего бота @rtportal_tp_bot и напишем ему что-нибудь.
Как мы видим, сообщение представляет собой массив, представленный в виде словаря python. Сообщение содержит в себе идентификатор чата (id), то, с кем ведется чат (first_name), тип чата, дату сообщения, от кого получено сообщение, номер сообщение и собственно сам текст. Вообще наполнение полученного сообщения постоянно обновляется, поэтому вполне вероятно, что когда вы будете читать этот текст, в ответе будет приходить гораздо больше параметров. Актуальная версия описания всегда доступна в описании api на официальном сайте telegram.
Теперь, когда мы знаем как выглядит сообщение, можно написать простого бота-калькулятора. Код будет выглядеть следующим образом:
import telepot
from telepot.loop import MessageLoop
TOKEN = '***** Сюда надо вставить токен, полученный у botfather *****'
bot = telepot.Bot(TOKEN)
def handle(msg):
""" Process request like '3+2' """
content_type, chat_type, chat_id = telepot.glance(msg)
text = msg["text"]
try:
answer = eval(text)
except:
answer = "Can't calculate :("
bot.sendMessage(chat_id, "answer: {}".format(answer))
MessageLoop(bot, handle).run_as_thread()
# Keep the program running.
while True:
n = input('To stop enter "stop":')
if n.strip() == 'stop':
break
Здесь мы подключили библиотеку telepot, добавили информацию о токене бота, прочитали полученное сообщение и, если оно представляет собой математическую операцию, выполняем его функцией eval. В противном случае выводим сообщение о том, что калькуляция не возможна.
Для того, чтобы программа выполнялась, в конце добавлен цикл, выполняющий код до момента написания слова 'stop'.
Запускаем код и проверяем результат в telegram. Все работает!
Нюансы
Есть несколько важных нюансов, которые нужно понимать при работе с ботами telegram:
- Бот сам не может являться инициатором беседы в чате. Это можете сделать только вы. До момента как вы напишете что-нибудь боту, он считается выключенным.
- Так как код python (и любой другой) запускается на компьютере или сервере, он будет выполняться только если компьютер/сервер доступен. То есть в случае если компьютер с кодом «заснул», отвалилась сессия или код завис - бот работать не будет. То же самое относится к серверу.
- Если компьютер/сервер с кодом бота перезагрузился, нужно запускать код заново, а так же инициировать беседу с ботом в telegram (см.п.1) иначе бот работать не будет.
- Есть два метода получения сообщений. Это getUpdates и webhooks. В этой статье описан метод getUpdates как наиболее простой для старта. Отличие getUpdates от webhooks в том что в первом случае ваш компьютер/сервер через заданные промежутки времени проверяет наличие новых сообщений, а во втором telegram сам отправляет новые сообщение при их наличии к вам на сервер. Webhooks меньше грузит и ваш сервер и сервера telegram, однако требует дополнительной настройки и наличия ssl сертификата.
В этой статье мы рассмотрели как самостоятельно написать код для бота, однако, стоить отметить, что в telegram уже есть всевозможные боты с типовым функционалом и если вам надо сделать что-то простое, то можно воспользоваться ими. Так же есть конструкторы ботов, позволяющие создавать логику без написания кода. Например, @chatfuelbot. Но если вам нужен нетиповой функционал, то все же лучше написать код самостоятельно.
Из ограничений готовых ботов и платформ-конструкторов можно отметить то, что в результате их популярности и большого количества пользователей, такие боты могут работать не стабильно в зависимости от нагруженности серверов, на которых размещены боты. Это может выражаться как в увеличенном времени реакции бота, так и в полном отсутствии реакции в части случаев.
Зачем все это:
Ключевой вопрос: «как можно применить бота?». Можно, например, научить бота python читать логи на предмет ошибок и выдавать сообщение если в процессе что-то пошло не так. Можно обрабатывать aml события и блокировать счета мошенников в реальном времени (привет sas-форум). Можно создать библиотеку знаний по нужной области рисков и отправлять нормативные документы по запросу.
Применить бот в работе рисковика можно. Все зависит от вашей фантазии и наличия открытых портов для api telegram в вашем банке :)
О том как научить вашего бота следить за событиями Google Calendar можно прочитать в этой статье.
Полезные ссылки:
Официальное описание api telegram (англ.) https://core.telegram.org/api
Любительское описание api telegram (рус. но материал отстает от официального) https://tlgrm.ru/docs/bots
Официальное описание возможностей библиотеки telepot для python http://telepot.readthedocs.io/en/latest/