ВВЕДЕНИЕ
Программы-мессенджеры быстро приобрели огромную популярность среди пользователей параллельно с ростом популярности мобильных устройств. Пользователи быстро поняли, что такой способ переписки имею много преимуществ по сравнению с классическими SMS: нет ограничения на размер одного сообщения: можно быстро прикрепить файл или сделанное фото, также стоимость значительно ниже (расходуется только интернет-трафик). Несколько лет наибольшую распространенность получили два мобильных приложения – Viber и Whatsapp, которые имели схожий функционал. Однако в августе 2013 года в данном секторе появился новый игрок – Telegram, разработанный Павлом Дуровым (основатель сети «ВКонтакте»). Новый мессенджер быстро набрал популярность и начал успешно конкурировать с Viber и Whatsapp. Этому способствовало наличие двух значительных преимуществ:
— скорость отправки сообщений и работы самого приложения у Telegram была заметно выше;
— инфраструктура Telegram была более защищена. Сообщения не сохранялись не внешних серверах, также использовалось полное шифрование. Дополнительно пользователи имели возможность создавать секретные чаты, в которых сообщения автоматически уничтожались через определенное время.
В дальнейшем разработчики расширили функционал сервиса, добавив возможность создания специальных ботов общедоступных каналов. Каналы предоставляли возможность быстро поделиться информацией с широким кругом пользователей, сохраняя при этом анонимность.
Боты представляют собой специальные аккаунты, управляемые программой (используется API). Бот может использоваться как для взаимодействия с одним пользователем, так и для работы с каналом или групповым чатом. Обычно работа с ботом подразумевает отправку определенных команд, которые обрабатываются программой. В ответ выполняется определенное действие: отправляется ответное сообщение, присылается ссылка или документ и т.п. Функционал постоянно расширяется – сегодня такие боты могут использоваться для полноценных игр, оплаты услуг и товаров, осмысленных диалогов и многого другого.
Сегодня многие крупные организации имеют собственного Telegram-бота, облегчающего работу как плане взаимодействия с клиентами, так и для использования сотрудниками. Не стало исключением и ООО «Системная интеграция и энергоинжиниринг», пожелав автоматизировать часть рутинных операций и создать бота-помощника для своих клиентов.
В процессе работы компании возникла необходимость оптимизировать коммуникации с широкой аудиторией, ускорить время реакции на запросы, тем самым удерживая большее количество клиентов. Опыт других компаний показывает, что внедрение таких чат-ботов компаниями, предоставляющими услуги или продающими товары через Интернет, повышает вероятность покупки при обращении клиента. Также такой чат-бот может выполнять консультации и осуществлять некоторые шаблонные операции.
Выбор мессенджера Telegram был сделан с силу универсальности и распространенности платформы. Разработка отдельного мобильного приложения заняла бы значительно больше времени, поскольку необходима разработка отдельных программ для iOS и Android. При этом Telegram уже используется на разных платформах, включая компьютеры.
Одним из наиболее удобных языков программирования для написания бота является Python, поскольку предоставляет широкий набор инструментов и является относительно простым.
Для взаимодействия с Telegram API уже доступны готовые модули. Наиболее подходящим для создания простых чат ботов является модуль pyTelegramBotAPI. Для хранения данных была выбрана СУБД PostgreSQL из-за простоты подключения и возможности полноценной работы с серверными приложениями. Для начального размещения и функционирования созданного приложения была выбрана платформа Heroku (бесплатный хостинг-сервис).
Пояснительная записка включает четыре раздела. В первом дана постановка задачи, рассмотрена предметная область, а также основные требования к приложению. Во втором разделе рассмотрен набор средств разработки. В третьем разделе описаны этапы разработки программы. В четвертом разделе рассмотрен процесс тестирования основных функций.
ПОСТАНОВКА ЗАДАЧИ
Целью данной работы является Telegram-бот, который способен предоставить пользователю информацию о текущем статусе заявки, а также автоматически создать новую заявку. Вместе с разработкой основного модуля бота требуется создать базу данных, в которой будет храниться актуальная информация по заявкам, а также разметить бота на внешнем сервере для обеспечения непрерывного функционирования и доступа пользователей.
Взаимодействие с ботом должно быть максимально простым в силу разного уровня технического образования пользователей. Доступ к редактированию базы данных должен быть только у ограниченного числа сотрудников компании.
Для простоты работы подключение к боту сводится к добавлению его в список контактов. При первом открытии чата отображается меню с набором доступных команд, пользователю не нужно искать список доступных команд и вручную вводить нужную.
Для достижения данных целей требуется выполнить следующие задачи:
— выбрать язык программирования и среду разработки;
— определить нужный набор кнопок и разработать соответствующий интерфейс;
— определить структуру и создать базу данных;
— обеспечить стабильное подключение бота к базе данных;
— разместить базу данных и бота на внешнем сервере для непрерывной работы;
— провести тестирование приложения.
ЭТАПЫ РАЗРАБОТКИ
Разработка чат-бота для Telegram включает следующие этапы:
1. Анализ предметной области.На э
том этапе определяется необходимость разработки, совместно с сотрудником компании задачи приложения, алгоритм работы и возможное дальнейшее развитие.
2. Анализ функциональных возможностей существующих ботов.
Изучаются различные популярные Telegram-боты, рассматривается их функционал для формирования функций в разрабатываемом боте.
3. Определяется алгоритм взаимодействия с пользователями.
Анализируется текущая схема взаимодействия с клиентами компании для определения оптимальных принципов работы бота с пользователями.
4. Начальный этап разработки бота.
Выбирается язык программирования и начинается разработка программы с учетом полученных ранее результатов.
5. Разработка базы данных.
Совместно с сотрудником ООО «Системная интеграция и энергоинжиниринг» формируется структура базы данных, которая будет использоваться для хранения информации.
6. Тестирование.
Проверка созданного бота на отсутствие ошибок и стабильность работы с базой данных.
7. Размещение на выбранном сервере.
После успешного прохождения этапов разработки и согласования с директором организации модули бота будут размещены на сервере и пользователи смогут получить к нему доступ.
Проблема использования чат-ботов
Мессенджеры
Мессенджер – это клиентская программа для смартфона или персонального компьютера, позволяющая мгновенно обмениваться сообщениями.
На данный момент на рынке количество мессенджеров постоянно растет, но самые популярные, это: Viber, WhatsApp, Telegram, Facebook Messenger, Skype.
Эти программы давно уже вышли за рамки обычного обмена текстового сообщения. Они стали превосходной альтернативой SMS- сообщениям и телефонным звонкам. Мало того, эти программы совершенно бесплатны, где бы не находился клиент, и работают от интернет-соединения, либо подключения к Wi-Fi сети. Плата взымается только за мобильный трафик, предоставленный оператором мобильный связи с учетом тарифных планов. Данный способ обмена информации стал настоящей конкуренцией для операторов мобильной сети по причине того, что население перестало отправлять друг другу SMS-сообщения.
Помимо обычного обмена текстового сообщения мы можем создавать либо с близкими, либо с коллегами групповые чаты для общения сразу с несколькими людьми. Использовать для выражения эмоций: картинки, смайлы и стикеры. Отправлять такие файлы, как: фотографии, видео, аудио и запись голосовых сообщений, если не имеется возможности набрать текст руками.
Приложение никогда не выключается, и работает круглые сутки, позволяя получать уведомления в фоновом режиме.
В существовании мессенджеров есть как большое количество полезных инновационных технологий, так и наличие старых недостатков, таких как спам-рассылки, что уже носит в своем названии отрицательное отношение.
На программном уровне всегда происходила борьба со спам- рассылками, но полностью искоренить это явление невозможно, поэтому пользователь сам всегда должен быть бдительным и внимательным при переходе на различные ссылки во входящем сообщении. Во-вторых, изобилие типов мессенджеров создает дискомфорт использования приложений, например, определенная часть окружения использует Skype, другие исключительно WhatsApp или Viber, что принуждает рядового пользователя устанавливать даже те приложения, которые ему неинтересны или неудобны.
Один из самых популярных мессенджеров на сегодняшний день является Telegram, который привлекает к себе внимание из-за минималистичного и строгого дизайна интерфейса, постоянной борьбы за безопасность персональных данных пользователей и очень простой документации для написания Telegram-ботов. Пользование приложением абсолютно бесплатно. Из преимуществ приложения для пользователей хотелось бы сказать о низком потреблении заряда батареи мобильного устройства, что позволяет человеку как можно дольше оставаться на связи, а также приложение отличается высокой скоростью передачи данных, что делает его более производительным и универсальным по сравнению с другими мессенджерами. Приложение гарантирует максимальную конфиденциальность получаемой и передаваемой информации по собственному протоколу безопасности MTProto.
Общие понятия чат-бота
Чат-боты – специальный аккаунты, за которыми не закреплен определенный пользователь, а для отправки и получения сообщений используется внешняя система. Для пользователя диалог выглядит как стандартная переписка с человеком.
Такие аккаунты могут выполнять разные функции:
1. Поддержка клиентов. Чат-бот может заменить громоздкий FAQ на интернет-сайте, отвечая на типовые вопросы. Бот может функционировать круглосуточно и снизить нагрузку на сотрудников компании.
2. Клиентский сервис. При помощи чат-бота можно выбирать товары, делать покупки, а также запрашивать услуги. В розничной торговле нередко наблюдается активное расширение ассортимента, что осложняет поиск определенного товара. После небольшого анализа программа может определить, что именно нужно клиенту и отправить соответствующую ссылку.
3. Маркетинг. Чат-бот можно использовать как мощный маркетинговый инструмент, который поможет собрать аналитику, поддержать лояльность клиентов, а также распространить контент. Можно делать массовые рассылки, собирать отзывы и комментарии об услугах и товарах.
4. Работа внутри организации. Чат-боты можно использовать для оптимизации таких процессов как: информирование сотрудников о различных событиях (назначенные собрания, расписание корпоративного транспорта, сроки отпусков и т.д.).
5. Рекрутинг. Боты можно успешно использовать для первичного сбора информации о потенциальных кандидатах. Прохождение стандартного опроса менеджер по персоналу может определить, кого можно сразу пригласить, кому отказать, а кому предоставить дополнительное тестовое задание.
Классификация чат-ботов
В зависимости от функций чат-ботов их можно разделить на пять видов:
1. Персональный ассистент
2. Техническая поддержка, сюда входят:
— информация о товарах, услугах, продуктах;
— консультации;
— отслеживание статуса заказа;
— информация об отделениях и времени работы;
— корректировка персональных данных;
3. Поиск и создание контента.
4. Продажа товаров и предоставление услуг.
5. Развлечения, игры.
Сегодня существует много типов классификации таких программ, чаще всего используется бизнес-классификация и классификация по техническому типу.
Диаграмма бизнес-классификации представлена на рисунке 1.

Рисунок 1 – Бизнес-классификация чат-ботов
Рассмотрим каждый тип более подробно:
— Разговорные. Созданы для поддержки диалога, имитируя общение с живым человеком (например, при помощи готового файла с парами вопрос-ответ), не заточены под определенные задачи.
— Ассистенты. Разрабатываются для определенных задач, извлекая необходимые данные из сообщений пользователей.
— Q&A (вопрос-ответ). Алгоритм работы: один вопрос – один ответ.
Разделение по технической реализации представлено на диаграмме, изображенной на рисунке 2.
Рассмотрим более подробно каждый тип:
— Основанные на бизнес-правилах. В этом случае структура диалога закладывается на этапе разработки, используется древовидная структура. Например, при помощи готового меню с подпунктами пользователь проходит по определенному пути. В таком типе реализации не используются произвольные фразы.
— На базе искусственного интеллекта. Кардинально отличаются от первого типа, заранее прописана структура отсутствует. Путь диалога определен неявным образом на основе большого объема тестируемых данных для обучения модели машинного обучения. Большой объем данных необходим для качественного обучения и дальнейшей работы.
— Гибридные. Данный тип чат-ботов основан на взаимодействии приложений первого и второго типа. Разговор ведется по заранее определенным ответам, но для выбора варианта используется искусственный интеллект.

Рисунок 2 – Виды технической реализации чат-ботов
Преимущества чат ботов в бизнесе
Исследования LiveWorld показывают, что пять лет назад 58% маркетологов не рекомендовали вкладывать средства в чат-боты и мессенджеры. При этом аналитики уже делали более оптимистичные прогнозы – 85% были уверены, что месенджер-маркетинг станет новый стандартом для бизнеса. Время показало, что они были правы.
Социальные сети являются популярными уже более 10 лет, являясь не только платформой для общения, но и площадкой для ведения бизнеса. Многие успешные компании обязаны своим успехом именно социальным сетям.
Кардинальные изменения произошли в 2018 году, когда мессенджеры обогнали социальные сети по общему количеству пользователей. По оценкам издания The Economist, в среднем, пользователи тратят более двух часов в сутки на обмен сообщений. Такая активная аудитория может влиять только на новые направления в маркетинге. Компании разного уровня начали использовать такие мессенждеры не только как удобный инструмент для общения с клиентами и рекламирования своих услуг, но и для прямых продаж.
Специалисты выделяют следующие преимущества мессенджеров:
1. Конфиденциальность. Типичные социальные сети являются открытими платформами. Это позволяет компании легко транслировать сообщения, взаимодействовать с аудиторией, которая уже знает данный бренд, а также привлекать новых пользователей. Но слабая сторона социальных ресурсов – слабая защита персональных данных. Крупные утечки информации о пользователях происходят регулярно. Один из наиболее крупных инцидентов произошел в 2019 году, когда Facebook был оштрафован на 5 миллионов долларов.
При этом мессенджеры Telegram, Viber и WhatsApp передают сообщения напрямую пользователю. Более того, большинство приложения данного типа используют полноценное сквозное шифрование, что делает их безопасными и для финансовых операций.
2. Управление репутацией. При общении через мессенджеры общение осуществляется тет-а-тет, что имеет свои преимущества. При личной переписке запрос можно выполнить более качественно, возрастает вероятность, что клиент останется довольным. Анонимность переписки позволяет выявить как положительные, так и отрицательные стороны компании.
3. В основе мессенджеров – быстро доставки, асинхронность и удобное хранение всех диалогов в одном месте. Сочетание данных свойств только увеличивает их популярность.
Обзор аналогов чат-ботов
Чат-бот Flibusta Book
Чтение хорошей литературы было и остается лучшим способом провести свободное время с пользой.

Рисунок 3 — Чат-бот Flibusta Book
Появление чат – бота Flibusta Book – Книги (@flibustafreebookbot) направлено на развитие литературного интереса среди общественности.
Для начала работы с данным ботом необходимо прописать команду
/start. Далее будет прислано текстовое сообщение с инструкцией о дальнейших действиях.

Рисунок 4 — Запрос книги на Flibusta Book
Пользователю доступны следующие команды:
/help – Краткая справка
/setting – Настройки
/search – Поиск
/book – Поиск только по книгам
/author – Поиск только по авторам
/random – Случайная книга
После ввода названия книги либо автора, будет прислана подборка со всеми подходящими книгами. После выбора определенной книги бот предложит выбрать наиболее подходящий формат из доступных:
FB2 (FictionBook) – лучше всего подходит для структурированной (художественной) литературы. Занимает небольшой объем, отлично архивируется, хорошо конвертируется в другие форматы. Представляет собой XML-файл, структурно похожий на письмо электронной почты. Главный недостаток – это российская разработка, совершенно неизвестен и почти не поддерживается ни одним из брендовых ридеров.
EPUB (Electronic PUBlishing) – наиболее распространенный в мире (и уже очень распространенный в России) формат электронных книг. По структуре он похож на веб-сайт, упакованный в архив. Подходит для Apple Books и большинства ридеров.
MOBI – специализированный формат, созданный специально для ридера Amazon Kindle и, соответственно, поддерживаемый только этим ридером. Причем Kindle никакие другие форматы электронных книг (кроме PDF и TXT) не поддерживает.
Чат-бот TempMail
Очень оригинальный и на самом деле полезный бот для повседневной жизни.
Целью этого бота является регистрация и выдача рандомных почтовых ящиков с их логином и паролем, протяженностью жизни в десять минут.

Рисунок 5 – Чат-бот TempMail
Для взаимодействия с пользователем имеются пять команд:
/start – начало общения с ботом
/new – создание нового e-mail
/change – премиум подписка
/list – показать созданные e-mails
/english – изменение языка с Ru на Eng
После команды /new приходит сообщение вида: «E-mail: ххххххххх@geo-crypto.com Password: ххххххх» с почтой и паролем. Их можно использовать для регистрации на одноразовых форумах для полноценного доступа к его функционалу, регистрация на торрент-площадках и т.д. Одним словом-использовать там, где не хотелось бы предоставлять свою основную почту.
Помимо сообщения отображается также inline-клавиатура с функциями:
— Входящие – с получением входящих сообщений для подтверждения регистрации;
— Ключик – для изменения пароля на данном почтовом ящике;
— Корзина – для удаления почтового ящика;
Чат-бот AntiEBot
Цель бота — выполнение важных практических функций, позволяя путем нетрудных операций узнать, какие химические ингредиенты добавлены в продукт, Интерфейс чат-бота изображен на рисунке 6.
Для начала взаимодействия с этим ботом, я, как всегда, прописал команду /start. В ответном сообщении увидел описание этого бота:
«Привет! Теперь я готов помогать тебе с расшифровкой пищевых добавок группы Е.
Когда в магазине, изучая состав продукта, увидишь Е*** (Например, Е101) для того, чтобы понять, насколько она безопасна, просто введите номер е101 или просто 101. Также в одном сообщении можно ввести подряд несколько добавок через пробел».
Память такого чат-бота содержит информацию о нескольких сотнях пищевых добавок, существующих в природе, в частности, красители, консерванты, стабилизаторы, эмульгаторы, усилители вкуса и запаха.

Рисунок 6 – Чат-бот определения вредных веществ в продуктах питания
Например, людям, страдающим болезнями внутренних органов крайне опасно употреблять пищу, содержащую данные вещества.
В распоряжении всего три главные команды:
/start – Стартует бот;
/help – Команда помощи (выдает список данных команд);
/list – Список добавок, разбитый по категориям.
Очень полезный и простой в реализации «AntiEBot» имеет очень большую ценность для тех, кто хоть немного следит за своим здоровьем.
Чат-бот Здоровье
Главными задачами являются:
1. Поиск полной инструкции к препаратам по названию.
2. Определение болезни по симптомам в разных частях тела.
3. Запись к врачам Москвы и Санкт-Петербурга по полису ОМС.

Рисунок 7 – чат-бот Здоровье
Поиск происходит по такой же системе, как Flibusta Book – Книги. Имеет такие прописные команды как /start – выход в главное меню, и /help – получение инструкции по данному боту с полноценным описанием.
Преимущества данного бота:
— огромная база данных;
— полные инструкции по препарату;
— возможность задать вопрос консультанту.
Минусы данного бота:
работа с записью на прием только в двух городах.
Чат-бот YouDrive
Запуск бота YouDrive (платформа Telegram) позволил компании на 2/3 сократить общее количество звонков в компанию. Основное назначение – облегчение передачи сообщения о возникших проблемах в процессе использования услуг компании.

Рисунок 8 – пример диалога с чат ботом YouDrive
Приложение имеет следующие возможности:
— предложение готовых решений для типовых запросов (технические проблемы с автомобилем, нестандартные ситуации и т.п.);
— автоматическое распределение обращений пользователей по нужным отделам.
Выбор средств разработки
В качестве инструментов разработки выбраны:
Среда разработки PyCharm
PyCharm – это самая интеллектуальная Python IDE с полным набором средств для эффективной разработки на языке Python.
На рынке она доступна в двух вариантах – бесплатная версия PyCharm Community Edition и поддерживающая больший набор возможностей PyCharm Professional Edition [4].
PyCharm выполняет инспекцию кода на лету, автодополнение, в том числе основываясь на информации, полученной во время исполнения кода, навигацию по коду, обеспечивает множество рефакторингов (рисунок 9).

Рисунок 9 – Интерфейс программы PyCharm
Стоит отметить, что сегодня существует большое количество сред разработки, поддерживающих Python. Многие при этом имеют более обширный функционал, однако для разработки Telegram-бота он не нужен – достаточно функционала бесплатной программы PyCharm.
Язык программирования Python
Python – популярный высокоуровневый язык программирования общего назначения. Синтаксис ядра Python минималистичен, при этом стандартная библиотека содержит большой объем функций.
Python полноценно поддерживает несколько парадигм программирования, включая объектно-ориентированное, структурное, императивное и функциональное. Основные архитектурные черты – автоматическое управление памятью, динамическая типизация, собственный механизм обработки исключений, удобные высокоуровневые структуры данных и поддержка многопоточных вычислений. Программный код организовывается в классы и функции, которые также можно объединять в модули.
Python активно развивается. Новые версии (с изменением/добавлением языковых свойств) анонсируются примерно каждые два с половиной года.
Интерпретатор Python работает в интерактивном режиме, при котором введенные инструкции сразу выполняются с выводом результата. Это позволяет проверить функционал отдельного участка кода перед добавлением в основную программу или работать в режиме калькулятора с большим набором функций.
Дизайн языка программирования построен вокруг объектно-ориентированной модели. Основная реализация ООП в Python выполнена элегантно и хорошо продумана, но при этом является достаточно специфической, если сравнивать с другими объектно-ориентированными языками.
Основные особенности и возможности.
1. Классы одновременно являются полноценными объектами, имея все соответствующие возможности.
2. Наследование, включая множественное.
3. Полиморфизм (функции виртуальные).
4. Инкапсуляция (есть два уровня – скрытые методы и общедоступные). Важная особенность – скрытые элементы полностью доступны для использования, отличаются только использованием особых имен.
5. Использование специальных методов для управления жизненным циклом объекта: распределители памяти, деструкторы, конструкторы.
6. Перегрузка операторов (кроме is, ‘.’, ‘=’ и символьных логических).
7. Свойства (имитация поля при помощи функций).
8. Управление доступом к полям (частичный доступ, эмуляция полей и методов и т.п.).
9. Методы для работы с наиболее распространенными операциями (итерация по объекту, сериализация, глубокое копирование, len(), истинностное значение и другие).
10. Метапрограммирование (триггеры создания классов, управление создания новых классов и др.).
11. Полная интроспекция.
12. Классовые поля, статические и классовые методы.
13. Классы, вложенные в другие классы или функции.
В версии 2.4 появилась возможность использовать так называемые декораторы, позволяющие преобразовать методы и функции в месте определения (можно использовать несколько декораторов). Для обозначения декоратора используется символ @ в строках, предшествующих определению метода или функции. С версии 2.6 декораторы можно применять к классам.
Python также предоставляет готовые модули как для полноценной работы с базами данных, размещенных на удаленном сервере (psycopg2), так и для взаимодействия с API Telegram (pyTelegramBotAPI).
Все перечисленные особенности делают Python оптимальным языком программирования для реализации поставленной задачи.
Telegram Bot API
Telegram Bot API поддерживает большое количество языков программирования. Взаимодействие с API заключается в отправке специальных запросов. Обращение к Telegram Bot API должно осуществляться через защищенный протокол HTTPS в формате https://api.telegram.org/bot<token>/НАЗВАНИЕ_МЕТОДА.
Поддерживаются POST и GET запросы. Для передачи запроса можно использовать 4 способа:
— application/x-www-form-urlencoded;
— запрос в URL;
— multipart/form-data (для загрузки файлов);
— application/json (не подходит для загрузки файлов).
Модуль pyTelegramBotAPI
Был проведен анализ библиотек-оберток, с целью выбора оптимальной для использования в работе. В результате анализа библиотек для Telegram Bot API была выбрана библиотека pyTelegramBotAPI.
Обусловлен выбор был тем, что, она активнее поддерживается и имеет большое количество пользователей, что позволяет получить ответы на возникающие вопросы.
Ключевые особенности:
— простота и удобство в работе;
— полная поддержка всех возможностей Telegram Bot API;
— оперативное обновление при добавлении новых функций в Telegram Bot API.
Библиотека pyTelegramBotAPI берет на себя все нюансы отправки и получения запросов, позволяя сконцентрироваться непосредственно на логике. Установка библиотеки предельно простая, для этого необходимо через консоль выполнить команду: pip install pytelegrambotapi.
Webhook или Long Polling. Выбор способа обработки
Исходя из официальной документации, Telegram API основан на простых HTTP-запросах. Существует всего два различных способа обрабатывать запросы, которые пользователи будут посылать боту:
1) Проверять «вручную», используя «Long Polling».
2) Доверить всѐ Telegram, поставив «Webhook». В этом случае любой запрос от пользователя Telegram сам будет посылать нам на сервер.
Входящие обновления хранятся на сервере до тех пор, пока бот не получит их в любом случае, но они не будут храниться дольше 24 часов.
Long Polling — «От нас в Telegram» безусловно, самый простой в реализации и самый легкий. Приложение просто передает нужные опции, обработка осуществляется на стороне Telegram.
WebHook – «От Telegram к нам». Схема более эффективна в плане скорости работы, но ее сложнее организовать.
Обычно с Long polling, необходимо запрашивать новые сообщения из API, а с Webhooks устанавливается свой обратный вызов, который будет вызван API Telegram, если появится новое сообщение от пользователя.
В данной работе я предпочел использовать Long Polling, потому что количество обращений будет небольшим.
СУБД PostgreSQL
Популярная объектно-реляционная система управления базами данных PostgreSQL распространяется бесплатно, базируется на языке SQL и имеет следующие сильные стороны:
— легко расширяется;
— наследование;
— надежные и высокопроизводительные инструменты репликации и транзакций;
— система встроенных языков программирования, в которую можно добавлять новые компоненты. Стандартный комплект поддерживает PL/pgSQL, PL/Tcl, PL/Python и PL/Perl, дополнительно можно подключить PL/sh, PL/PHP, PL/Py, PL/Ruby, PL/Scheme, PL/Java, PL/V8 и PL/R. Также имеется поддержка C-совместимых модулей.
PostgreSQL была выбрана, поскольку присутствует необходимость реализовать функционирование бота на удаленном сервере. В силу особенностей работы сервиса Heroku (выбранная для размещения) самая практичная и удобная СУБД SQLite не подходит в силу своей компактности – в данной схеме реализации это является существенным недостатком. PostgreSQL можно разместить на одном сервере с программой бота, что позволяет обеспечить стабильную связь с базой данных. Также отсутствует необходимость поддерживать функционирование базы данных на локальном сервере.
Heroku
Heroku – популярная облачная PaaS-платформа, которая поддерживает ряд языков программирования. Сервис не является хостингом для размещения приложений для их постоянного функционирования, по факту его можно использовать для данных целей. Бесплатный тариф позволяет запустить на удаленном сервере свое приложение (в данном случае Telegram-бота), туда же загрузить базу данных PostgreSQL. После запуска и подключения компонентов доступ к программе будет круглосуточным. Также преимуществом Heroku является наличие подробной документации с описание всех доступных функций, а также детальными инструкциями для работы с ними.
Разработка
Создание бота
Перед началом создания программного кода бота, его необходимо зарегистрировать. Для этого используется официальный бот Telegram, который называется BotFather. При помощи диалога с простыми командами указывается название и имя нового бота, после чего система присылается ссылку для добавления бота в список контактов, уникальный токен бота, а также ссылку на официальную документацию API (рисунок 10).

Рисунок 10 – Создание нового чат-бота
После этого уже можно начинать писать программный код нового бота и тестировать его работу, запуская приложение на ПК с доступом в интернет.
После анализа базы конечных пользователей бота, принято решение оформить взаимодействие через inline-меню. Такие меню основаны на работе с типом InlineKeyboardMarkup, который позволяет создавать меню из набора кнопок, привязанные к сообщению, отправленному ботом.

Рисунок 11 — Пример Inline-кнопок
Доступны кнопки трех видов:
— URL кнопки. Данный тип кнопок для перенаправления пользователя по указанной ссылке, перед открытием ресурса выдается соответствующее уведомление. На кнопке в правом верхнем углу находится соответствующая пиктограмма, чтобы пользователь понимал, что это ссылка;
— Switch-кнопки. Предназначены для перенаправления в определенный чат. При этом автоматически активируется inline-режим переписки с ботом. Данный режим пользователь может активировать и вручную, введя в чате команду «@[название бота]», однако switch-кнопки позволяют сделать это автоматически. Стоит отметить, что данный вид кнопок используется очень редко.
— Callback-кнопки. Представляют собой кнопки с обратной связью, позволяя динамически обновить меню или сообщение, также есть возможность отобразить уведомление в модальном окне или верхней части чата. К примеру, такие кнопки можно использовать для разбивки длинного сообщения (по принципу пагинации страниц на сайте) или сделать календарь. Кнопки такого вида и используют для создания inline-меню, поскольку они позволяют быстро получить информацию о нажатой пользователем кнопке.
Таким образом, интерфейс нового бота будет основан на inline-меню, появляющееся под сообщениями, которые будет присылать бот. Для выбора действия пользователю достаточно нажать на соответствующую кнопку. По факту, приложению без разницы, набрана команда при помощи стандартной клавиатуры или через нажатие кнопки, но для пользователей последний вариант намного проще.
Проектирование формата команд
Для обработки различных команд поступающих от пользователя используются так называемые «хендлеры» — конструкции, в которые прописывается действие бота при получении определенного текста (например, команды или ключевой фразы), файла и т.д.
В процессе создания бота были использованы следующие хендлеры:
— @bot.message_handler(commands=[‘start’]) – описывает действие бота при получении стандартной команды /start;
— @bot.callback_query_handler(func=lambda call: True) – в данном хендлере осуществляется обработка нажатия кнопок меню;
— @bot.message_handler(regexp=r»^(\d+)$») – реагирует только на введенное число (номер заявки);
— @bot.message_handler(func=lambda message:True) – реагирует на произвольный текст (кроме команд, описанных в вышестоящих хендлерах). Используется для описания новой заявки.
Реализация приложения
При начале работы с ботом пользователь имеет возможность использовать только команду «start/», поэтому в программный код первым делом необходимо добавлять обработчик данной команды (или обработчик произвольного текста).

Рисунок 12 – Первый запуск бота
После нажатия кнопки «запустить» пользователю демонстрируется меню из трех пунктов: «Информация о заявке», «Составить заявку», «Контакты и адрес». Хендлер обработки команды /start:
@bot.message_handler(commands=[‘start’])
def start_msg(message):
keyboard = types.InlineKeyboardMarkup()
button = types.InlineKeyboardButton(text=»Информация о заявке», callback_data=»info»)
button1 = types.InlineKeyboardButton(text=»Составить заявку», callback_data=»add»)
button2 = types.InlineKeyboardButton(text=»Контакты и адрес», callback_data=»kont»)
keyboard.add(button)
keyboard.add(button1)
keyboard.add(button2)
bot.send_message(message.chat.id,»Выберите пункт меню», reply_markup=keyboard)

Рисунок 13 – Внешний вид главного меню
При нажатии на кнопку фиксируется параметр callback_data, значение которого в дальнейшем будут использоваться для выбора дальнейшего действия. Для этого используется хендлер @bot.callback_query_handler, в который и передается информация о нажатой кнопке:
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
if call.message:
if call.data == «info»:
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=»Введите номер заявки»)
elif call.data == «add»:
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=»Введите описание новой заявки»)
elif call.data == «cont»:
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=»г. Краснодар ул. Ленина 1″)
Если пользователь выбрал пункт «Информация о заявке», бот присылает сообщение с просьбой ввести номер заявки. Введенное значение обрабатывается в хендлере @bot.message_handler(regexp=r»^(\d+)$»), который реагирует на число. Сообщение пользователя заносится в переменную и используется для формирования запроса к базе данных. Подключение к базе данных инициируется непосредственно перед формированием SQL-запроса.
Происходит выбор значений столбца «Статус», в котором хранится информация обо всех заявках, из таблицы «Заявки» со значением столбца «id» равным номеру, полученному от пользователя. При помощи команды cursor.fetchall() в переменную rezult кладется полученное значение. Если номер заявки в базе не найден, выводится сообщение «Заявка не найдена» Для вывода сообщения используется следующая конструкция:
if rezult:
bot.send_message(message.chat.id, rezult)
else:
bot.send_message(message.chat.id, «Заявка не найдена»)

Рисунок 14 – Пример поиска информации о заявке
При выборе варианта «Составить обращение» бот выводит сообщение «Введите описание новой заявки» и ожидает ответа пользователя. Полученное сообщение заносится в переменную txt_zayavki и используется для формирования соответствующего SQL-запроса к базе данных (рисунок 14).

Рисунок 15 – Добавление новой записи в БД
После добавления новой записи происходит запрос на получения номера созданной заявки (столбец id), для последующего вывода пользователю (рисунок 15).

Рисунок 16 – Диалог создания новой заявки
База данных
Для тестирования бота в SQLiteStudio была создана база данных bot_db, в ней таблица Заявки с тремя столбцами: Статус (информация о статусе заявки), id (номера заявок, автоинкрементное поле) и Описание (описание, полученное от пользователя).

Рисунок 17 – Работа с таблицей в SQLiteStudio
Для работы с базой данных используется встроенный модуль sqlite3. Для подключения использованы следующие команды:
— con = sqlite3.connect(«bot_db.db») – осуществляет соединение с базой данных;
— cur = con.cursor() – инициализация курсора, который позволяет формировать запросы и получать конкретные строки.
Тестирование
При помощи системы управления пакетами pip, которая дает возможность быстро инсталлировать нужный модуль для Python, был установлен пакет pyTelegramBotAPI, что позволило запускать бота на локальном ПК из командной строки.
В процессе тестирования были выявлены незначительные проблемы при выборке данных из базы данных, а также неустойчивое подключение к базе данных. Их удалось быстро устранить, далее приложение работало без ошибок. Дополнительно для тестирования бота были использованы два мобильных устройства, где бот также продемонстрировал стабильную работу.
Запуск на Heroku
Для запуска программы бота на сервисе Heroku необходимо выполнить следующие действия:
1. Инсталлировать расширение командной строки Heroku CLI, которое облегчает работу с сервисом.
2. Подготовить файлы созданного приложения к размещению на сервисе и последующему запуску. В первую очередь необходимо создать дополнительные файлы: Requirements.txt (описание всех используемых модулей Python) и Procfile (файл не имеет расширения и содержит инструкции для сервиса с перечнем средств, необходимых для запуска программы). Далее необходимо создать аккаунт на GitHub и загрузить все подготовленные файлы. На данном этапе для обеспечения стабильной работы и безопасности программы URL базы данных и значение уникального токена удалены из кода программы. Вместо них использованы соответствующие переменные, которые указываются непосредственно при запуске бота на сервере.
3. Следующий этап – при помощи командной строки необходимо подготовить программу к публикации на Heroku. В каталоге, хранящем все необходимые файлы, произведена инициализация Git, в файлы репозитория добавлены последние изменения. Также обновлены файлы для GitHub при помощи последовательности команд:
Git init
Git add .
Git commit –m ‘launch’
Git push –u https://github.com/mob25/TelegramBot
Далее необходимо войти в аккаунт на сервисе Heroku, для чего используется команда:
Heroku login
После ввода пароля и логина необходимо создать программу, которой и будет являться наш Telegram-бот:
Heroku create –region eu pcbot2

Рисунок 18 – создание приложения в Heroku
Далее необходимо подключить дополнение postgres, которое позволяет использовать базу данных PostgreSQL непосредственно на хостинге. После добавления плагина автоматически создается пустая база данных:
heroku addons:create heroku-postgresql:hobby-dev –a bot_db

Рисунок 19 – подключение дополнений
Для перемещения созданной ранее локальной базы на сервис Heroku необходимо создать дамп базы данных (специальный файл, в котором хранятся все данные и описание структуры). Для этого используется команда:
Pg_dump –username=postgres games > bot_db.dump
Созданный файл загружаем в каталог Dropbox для получения ссылки вида:
https://www.dropbox.com/s/y62kim7kaokq5pk/bot_db.dump
Данная ссылка понадобится, чтобы пустая база данных, созданная на Heroku смогла загрузить дамп локальной базы данных и сформировать соответствующие таблицы с данными.
Остается только инсталлировать пакет сборки Python для программы на Heroku и загрузить все необходимые файлы непосредственно в приложении.

Рисунок 20 – Установка пакета сборки Python

Рисунок 21 – Размещение файлов на сервисе Heroku
Осталось указать конфигурационные переменные и запустить бота.

Рисунок 22 – Запуск программы
Чтобы убедиться, что приложение функционирует корректно, можно посмотреть логи сервиса.

Рисунок 23 – Лог работы программы
ЗАКЛЮЧЕНИЕ
В современном мире высокого развития информационных технологий такие средства связи как мессенджеры становятся настоящей необходимостью. Почти каждый человек нуждается в передаче информации путем обмена сообщениями, находясь в разных местах.
Появление чат-ботов, как основного инструмента передачи важной информации в удобном формате, позволяет среднестатистическому пользователю в решении данной задачи. Чат-боты выполняют свою работу на основе уже существующих мессенжеров.
В данной дипломной работе был разработан продукт для компании ООО «Системная интеграция и энергоинжиниринг», который служит помощником при взаимодействии с клиентами.
В процессе создания чат-бота были выполнены все поставленные задачи, в том числе углубленное изучение представления понятия мессенджеры, анализ и сравнение существующих видов чат-ботов, определение достоинств и недостатков программ, разработка бота на платформе Telegram, а также тестирование модели и определение ее работоспособности.
Таким образом, созданный чат-бот Мероприятия, являющийся результатом выпускной квалификационной работы, отвечает всем требованиям пользователей: лаконичный интерфейс, краткость и полнота необходимой для пользователя информации, доступность, высокая скорость работы. Чат-бот для работы с клиентами крайне удобен, позволяет добавлять новые модули и функции, а также может быть быстро адаптирован для использования в других организациях.
Код основного модуля
import telebot import sqlite3 from telebot.types import Message from telebot import types TOKEN = '159800414:AAF3Cpd_YDuQfSHCvg-JmypE6KnLo2cuko' bot = telebot.TeleBot(TOKEN) mu = types.ReplyKeyboardMarkup(resize_keyboard=True) @bot.message_handler(commands=['start']) def start_msg(message): keyboard = types.InlineKeyboardMarkup() button = types.InlineKeyboardButton(text="Информация о заявке", callback_data="info") button1 = types.InlineKeyboardButton(text="Составить заявку", callback_data="add") button2 = types.InlineKeyboardButton(text="Контакты и адрес", callback_data="kont") button3 = types.InlineKeyboardButton(text="Связаться с оператором", callback_data="oper") keyboard.add(button) keyboard.add(button1) keyboard.add(button2) keyboard.add(button3) bot.send_message(message.chat.id,"Выберите пункт меню", reply_markup=keyboard) @bot.callback_query_handler(func=lambda call: True) def callback_inline(call): if call.message: if call.data == "info": bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Введите номер заявки") elif call.data == "add": bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Введите описание новой заявки") elif call.data == "cont": bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="г. Краснодар ул. Ленина 1, тел. 8861-111-22-33") @bot.message_handler(regexp=r"^(\d+)$") def status(message:Message): n_zayavki = message.text con = sqlite3.connect("bot_db.db") cur = con.cursor() cur.execute(f'SELECT Статус FROM заявки WHERE id={n_zayavki}') rezult = cur.fetchall() if rezult: bot.send_message(message.chat.id, rezult) else: bot.send_message(message.chat.id, "Заявка не найдена") cur.close() con.close() @bot.message_handler(func=lambda call: True) def new_z(message: Message): txt_zayavki = message.text con = sqlite3.connect("bot_db.db") cur = con.cursor() cur.execute("INSERT INTO заявки (Статус, Описание) VALUES (?,?)", ('Заявка в работе',txt_zayavki)) cur.execute(f'SELECT MAX(id) FROM заявки') rezult = cur.fetchall() bot.send_message(message.chat.id, "Номер вашей заявки:") bot.send_message(message.chat.id, rezult) con.commit() cur.close() con.close() bot.polling()