Загрузил pro.etcontra

Статья о компьютерном зрении

реклама
СОЗДАНИЕ БОТОВ В TELEGRAM: С ИСПОЛЬЗОВАНИЕМ ЯЗЫКА ПРОГРАММИРОВАНИЯ PYTHON
Павлов И.Ю., Колосков В.Л., Иванов Е.Б.
НИУ ВШЭ
+7 (916) 657-73-72, pavlov.ilya.y@gmail.com
Статья посвящена исследованию процесса создания ботов в популярном мессенджере Telegram с
использованием языка программирования Python. В работе описываются основные этапы создания ботов с приведением
фрагментов кода с комментариями, а также объяснением принципов работы созданного кода и ботов в целом.
Приводятся основные преимущества и недостатки выбранного метода разработки ботов.
Ключевые слова: Telegram, боты, python, код, создание.
Telegram bots creation using Python programming language. Pavlov I.Y., Koloskov V.L., Ivanov E.B. NRU HSE.
The article investigates the process of creating bots in the popular messenger Telegram using the Python programming
language. The paper describes the basic steps of creating bots with bringing pieces of code with comments, as well as principles
of explanation for the generated code and bots in general. The basic advantages and disadvantages of the chosen method of
development bots are provided.
Keywords: Telegram, bots, python, code, creation.
Введение
В современном обществе возможность оставаться на связи, обмениваться фотографиями и видео привлекает
миллионы людей. Практически у каждого владельца смартфона установлен как минимум один мессенджер по
умолчанию. Вместе с появлением подобных сервисов появились и роботы (или просто боты) для них, которые могут
выполнять практически любые задачи – например, рассылать новости, регистрировать пользователей на сайте и многие
другие. На заре развития данной технологии создание бота было прерогативой программистов, но в связи с широким
распространением мессенджеров, а также усовершенствований технологии некоторые мессенджеры предлагают
возможность создать своего бота каждому. Одним из таких приложений является Telegram. Возможности ботов
возрастают с каждым днем и в будущем вполне возможна ситуация, когда эта технология вытеснит другие продукты со
схожими идеями.
Создание погодного бота при помощи кода
Перед непосредственным созданием бота его необходимо добавить и зарегистрировать. Добавление
осуществляется с помощью отправления команды /addbot к Manybot, а регистрация при помощи Botfather. На этапе
регистрации необходимо придумать имя создаваемому боту. Единственным ограничением на имя является то, что имя
должно обязательно заканчиваться на «bot». После задания имени BotFather присваивает боту HTTP API token и
возвращает его вместе с ссылкой для быстрого добавления бота в контакты.
В качестве языка разработки был выбран python. В связи с его адаптивностью – алгоритмы, написанные на
этом языке, достаточно легко переносятся на любой другой язык. В данной работе для разработки боты будет
использована библиотека для python pyTelegramBotAPI, которая существенно упрощает процесс программирования,
взяв на себя все нюансы отправки и получения запросов, позволяя сконцентрироваться непосредственно на логике. Для
написания скрипта используется среда разработки PyCharm. Также для создания используются две библиотеки,
необходимые для правильного функционирования бота - библиотека pyTelegramBotAPI и библиотека pywapi.
Напишем бота, который будет сообщать нам погоду в двух столицах – Москве и Санкт-Петербурге. Для начала
создаем новый проект в PyCharm. Внутрь этого проекта помещаем два файла: main.py и constants.py. В первом из них
будет находиться скрипт нашего бота, а второй, в свою очередь, будет содержать все константы (такие как:
приветственное сообщение, сообщение для команды /help и другие), чтобы не засорять код в main.py.
Токен позволяет управлять ботом как угодно, а мы не хотим, чтобы управление нашим ботом случайно
оказалось в руках какого-либо злоумышленника, поэтому лучше не вставлять токен в основной код программы, а
вынести его в отдельный файл. В нашем случае помещаем его вместе с константами в constants.py. Дальнейшее
написание кода производится в файле main.py. Для начала импортируем все необходимые нам файлы: Telebot – файл,
который существенно упрощает нам процесс создания бота; Constants – созданный нами файл с константами и токеном
бота; Pywapi – поможет получить новостную сводку [3]
Для начала создадим объект бота, через который будет осуществляться обращение к API Telegram с
использованием методов, описанных на сайте telegram в описании bot API. Для создания нужно вызвать его
конструктор и в качестве параметра передать токен бота. По мере усложнения функций бот – код начинает расти, что
становится проблемой. Чтобы не загромождать код огромным количеством циклов и конструкций if-elif-else в
библиотеке pyTelegramBotAPI существует хэндлеры или декораторы, которые помогают справиться с этой проблемой.
Декораторы указываем библиотеке, что следующая дальше функция должны быть вызвана, когда боту приходит
сообщение с подходящим типом содержимого. Хэндлеры существует для всех типов сообщения, что очень удобно и
позволяет разделить кода на логичные части, не нагромождая его в одном месте, что повышает читабельность.
Важно отметить, что сообщение будет обработано только в одном декораторе. Декораторы будут проверяться в
порядке их следования в коде. Использоваться будет тот, который подошел под тип сообщения первым [4].
Внутри декораторов будем производить работу с текстом входящих сообщений. Для того, чтобы отправлять
сообщение нам нужно знать id чата или пользователя. Id чата и Id пользователя, которому планируется отправить
сообщение, совпадут только в том случае, если переписка осуществляется в приватном чате типа «пользователь бот». Поэтому рекомендуется использовать from_user.id вместо chat.id, но в нашем примере бот пишется для
приватного чата, поэтому можно воспользоваться chat.id.
Напишем 3 декоратора: первый предназначен для отправления «вступительного сообщения» при начале
работы с ботом, когда пользователь отправит команду /start, второй будет посылать сообщение, при получении
команды /help, третий будет при помощи pywapi получать погоду с сайта weather.com и преобразовывать
полученный json объект в удобный для пользователя вид. Код третьего декоратора приведен ниже:
Разберёмся для начала с тем, каким образом боты принимают сообщения. Первый и наиболее простой вариант
заключается в периодическом опросе серверов Telegram на предмет наличия новой информации. Осуществляется этой
при помощи механизма, называемого Long Polling, при котором на непродолжительное время открывается соединение
и все обновления тут же прилетают боту. Этот способ прост, но не очень надежен. Первая причина, почему этот метод
не надежен – это проблемы с серверами Telegram. Cерверы Telegram периодически могут возвращать ошибку 504
(Gateway Timeout), из-за чего некоторые боты впадают в ступор. Даже использование библиотеки pyTelegramBotAPI не
всегда может помочь избежать такую ситуацию. Второй причиной может стать одновременный запуск нескольких
ботов, что повышает вероятность столкнуться с ошибками.
Альтернативой первому варианту являются вебхуки, которые работают несколько иначе. При установке
вебхука отпадает необходимость периодически самому опрашивать серверы, тем самым, исчезает неприятная причина
падений ботов. Однако за это приходится платить необходимостью установки полноценного веб-сервера на ту машину,
на которой планируется запускать ботов. Для примера погодного бота воспользуемся самым простым вариантом на
основе Long Polling.[4]
Для того, чтобы код не останавливался после одного выполнения нужно заставить скрипт постоянно
опрашивать сервер об обновлениях для этой цели можно использовать цикл, но Telebot позволяет нам обойтись без
цикла. Библиотека pyTelegramBotAPI предоставляет нам функцию polling. Функция polling запускает Long Polling, а
параметры none_stop=True и interval = 0 говорят, что бот должен стараться не прекращать работу при возникновении
каких-либо ошибок и обновляться без задержек. При этом за ботом нужно следить все равно нужно следить, поскольку
сервера Telegram периодически перестают отвечать на запросы или делают это с большой задержкой приводя к
ошибкам 5xх.
Теперь разберем одну из особенностей Bot API, а именно кастомные клавиатуры. Такие клавиатуры
представляют собой обычные шаблоны сообщений. Важной особенности таких клавиатур является то, что команда,
отправляемая кнопкой клавиатуры, полностью соответствует её названию. К примеру, если кнопка называется /hellobot,
то команда, которая отправляется при нажатии на эту кнопку будет /hellobot. В связи с этим использовать кастомные
клавиатуры нужно осторожно. Для создания кастомной клавиатуры нужно создать объект типа ReplyKeyboardMarkup(),
Далее добавляем построчно элементы ( также существует возможность сделать автоматическое разделение на строки,
используя аргумент row_width), после чего передаем в метод send_message(). Для того, чтобы убрать кастомную
клавиатуру, к примеру, заменив её на кнопку [/], необходимо вместо объекта ReplyKeyboardMarkup() создать объект
ReplyKeyboardHide() и также передать его в send_message().[1] Добавим кастомную клавиатуру, состоящую из 3
клавиш: /help, /moscow и /piter. Теперь при отправке боту команды /start, кроме приветственного сообщения получим
еще и кастомную клавиатуру с клавишей /help в нижнем ряду и клавишами /moscow и /piter в верхнем. Для клавиши
/moscow и /piter добавим декораторы, которые при нажатии на эти клавиши отправят запрос на сайт с целью получения
прогноза погоды для Москвы и Санкт-Петербурга соответственно:
На рис.1 представлен пример реализации бота с кастомной клавиатурой.
Рисунок 1 - Пример реализации бота с кастомной клавиатурой
Заключение
В данной статье был разобран способ создания бота с использованием «классического» программирования.
Главным преимуществом данного метода является гибкость процесса создания бота, а к недостаткам, в свою очередь,
можно отнести необходимость установки полноценного веб-сервера на машину с запущенным ботом. Также надо
иметь собственный SSL-сертификат, т.к. вебхуки в телеграмме работают только по HTTPS. К счастью, сейчас
появилась поддержка самоподписанных сертификатов. Данный метод не подойдет для людей, не обладающих
базовыми знаниями в программировании.
Литература
1. Сайт с описанием BOT API - https://core.telegram.org/bots/api
2. Документация Python - https://www.python.org/doc/
3. Сайт с библиотекой pywapi - https://pypi.python.org/pypi/pywapi
4. Сайт библиотеки pyTelegramBotAPI - https://pypi.python.org/pypi/pyTelegramBotAPI
5. Колосков В.Л., Павлов И.Ю., Иванов Е.Б., «Создание ботов Telegram: с использованием языка
программирования Python и облачной операционной системы Corezoid», журнал «Системный администратор» №5(162)
май 2016
Скачать