Разработка Telegram-бота «Rsueschedulebot»

Шипунов А.В.1, Жилина Е.В.1
1 Ростовский государственный экономический университет (РИНХ), Россия, Ростов-на-Дону

Статья в журнале

Информатизация в цифровой экономике (РИНЦ)
Том 2, Номер 3 (Июль-сентябрь 2021)

Цитировать:
Шипунов А.В., Жилина Е.В. Разработка Telegram-бота «Rsueschedulebot» // Информатизация в цифровой экономике. – 2021. – Том 2. – № 3. – С. 113-124. – doi: 10.18334/ide.2.3.113390.

Эта статья проиндексирована РИНЦ, см. https://elibrary.ru/item.asp?id=49265555

Аннотация:
В статье описан алгоритм разработки telegram бота для учебного расписания вуза (на примере РГЭУ (РИНХ)), позволяющий оперативно получать нужный контент по определенной группе, преподавателю, а также по загруженности учебных аудиторий вуза. В качестве инструментария разработки применялось IDE PyCharm, язык Python, СУБД MongoDB.

Ключевые слова: алгоритм, функция, чат бот, расписание

JEL-классификация: L86, C89



Введение. Особенностью чат-ботов является возможность их работы внутри мессенджеров (Telegram, VK). Такие приложения могут отвечать на тематические вопросы по заранее сформированному пулу из них, а также самостоятельно предлагать решение по соответствующей проблеме (интересу, задачи). Чат-боты используются в разных сферах для решения типовых задач.

Существуют чат-боты для продаж, направленные на консультацию покупателей и позволяющие сделать выбор продукции/услуги, сформировать заказ, информировать об акциях/ скидках.

Актуальными являются также бот-ассистенты, которые, как правило, интегрируются с другими платформами и направлены на помощь пользователю в решении типовых задач: поиск в Google, планировщик задач, формирование новостного контента и т.д. [2–5] (Belokonev, Dudin, Khokonov, 2019; Levina, Dudin, 2020; Shirokovskikh, 2019; Polyakov, 2019).

Много таких разработок и в области бот-информаторов, отвечающих на тематические запросы (перелеты, цены, погода, курс валют и т.д.).

Преимуществом создания Telegram-ботов является популярность мессенджера, который входит в топ-3 в мире по количеству пользователей (>500 млн), а также имеет открытую документацию, что существенно влияет на уровень/время вхождения в программную разработку алгоритмов для Telegram.

Актуальность выбранной темы связана с тем, что в современном обществе важную роль играют социальные сети и разнообразные мессенджеры. Растет число людей, которые могут часами проводить в виртуальном общении, поэтому вместо того, чтобы каждый раз заходить на сайт университета и проверять расписание группы/преподавателя, пользователь может получить его в несколько кликов прямо в мессенджере.

Существует несколько ботов для получения расписания для групп РГЭУ (РИНХ), например: https://vk.com/silentrsue [1] (Pervushin, Samsonov, Krasnov, Zhilina, 2020), однако разработка на данный момент не позволяет осуществлять поиск учебного расписания по преподавателю РГЭУ (РИНХ), в ней нет информации о загруженности учебных аудиторий на текущий день или другого критерия отбора/поиска.

Основная часть

Преимуществами языка программирования Python является понятность и простота, а также динамическая типизация. Python имеет множество библиотек для написания Telegram-ботов с открытой документацией, множество гайдов и мануалов [7]. Анализ видеообзоров [6] и литературы [1] (Pervushin, Samsonov, Krasnov, Zhilina, 2020) позволил сделать выбор для текущей разработки в пользу Python.

В качестве IDE был выбран PyCharm, позволяющий делать разработку максимально продуктивной благодаря функциям автодополнения и анализа кода, подсветке ошибок и возможностями рефакторинга кода.

В качестве базы данных была выбрана MongoDB [8], данные которой основаны на коллекциях различных документов в виде JSON.

В качестве хостинга бота был выбран сервис Heroku [10], поскольку он имеет хорошую документацию, встроенные инструменты, а также не требует много времени для развертывания приложения и бесплатен для некоммерческих проектов.

Далее опишем реализацию основных функций классов проекта. Так, класс для парсинга расписания групп содержит функцию day_get(): через два цикла алгоритм получает список групп, после чего находит группу на сайте РИНХ и запускает функцию parsDay() (рис. 1).

Функция parsDay() получает на вход HTML-код, заданную дату (день), название группы, после чего обрабатывает их и создает список, который отправляется в базу данных.

База данных размещена на бесплатном сервере разработчика https://www.mongodb.com/cloud/atlas и обновляется во время запуска программы парсинга пар.

Рисунок 1. Блок-схема функции day_get()

Источник: составлено авторами.

Класс по работе с базой данных содержит несколько функций, в том числе:

– функция createFull(): принимает на вход группу, день, время, пару, преподавателя, аудиторию, тип пары, после чего отправляет это в базу данных на сервер. Структура документа в базе данных представлена на рисунке 2 в виде json;

Рисунок 2. Структура документа (фрагмент)

Источник: составлено авторами.

– функция get(): принимает на вход необходимый параметр (преподаватель/аудитория/группа), а также дату, после чего возвращает словарь с данными;

– функция checkWithDate(): принимает на вход параметр (преподаватель/аудитория/группа), а также дату, после чего подсчитывает документы с данными параметрами; если такой документ найдет, то возвращает единицу (1); функция реализована для проверки на наличие пар в конкретный день;

– функция check(): принимает на вход имя (ФИО) преподавателя, после чего подсчитывает количество документов с данными параметрами; если количество документов > 0, то возвращает единицу; функция реализована для проверки на «существование» преподавателя.

Вначале для создания Telegram-бота разработчику необходимо получить токен (ключ) для подключения бота к коду. Получить его можно у botFather (@BotFather).

В проекте Telegram-бота для РГЭУ (РИНХ) «rsueSchedulebot» реализованы функции для организации его работоспособности:

функция вывода сообщения:

def getScheduleGroup(call, date): # ВЫВОД СООБЩЕНИЯ (ТАК ЖЕ, КАК И В РАСПИСАНИИ) try: k = [] user = db.getUser(int(call.from_user.id)) # ПОЛУЧЕНИЕ ЮЗЕРА ИЗ БАЗЫ ДАННЫХ if db.checkGroupWithDate(user ['message'], str(date)) != 0: # ПРОВЕРКА НА НАЛИЧИЕ ПАР В ДЕНЬ schedule = db.getGroup(str(user ['message']), str(date)) for i in schedule: k.append(i) k = mergeLessons(k) for d in range(len(sortLessons(k))): if k [sortLessons(k) [d]] ['time'] != '12': messagetext = 'Дата: ' + k [sortLessons(k) [d]] ['date'] + '\nДень: ' + k [sortLessons(k) [d]] ['day'] + \'\nВремя: ' + k [sortLessons(k) [d]] ['time'] + '\nГруппа : ' + k [sortLessons(k) [d]] ['group'] \+ '\nПара: ' + k [sortLessons(k) [d]] ['lesson'] + '\nПреподаватель: ' + \k [sortLessons(k) [d]] ['teacher'] + '\nТип: ' + k [sortLessons(k) [d]] [ 'type'] + \ '\nАудитория: ' + k [sortLessons(k) [d]] ['auditory'] try: bot.send_message(chat_id=call.message.chat.id, text=messagetext) except telebot.apihelper.ApiException: pass else: bot.send_message(chat_id=call.message.chat.id, text='У данной группы нет пар в данный день') except telebot.apihelper.ApiException: pass В словарь user сохраняется документ, полученный из базы данных. Документ содержит id пользователя и его сообщение. После чего происходит проверка на наличие пар у данной группы/преподавателя/аудитории. Если пары существуют, то делается запрос в базу данных, которая возвращает курсор (тип данных mongoDB) словарей с парами. Через цикл элементы курсора записываются в список, после чего вызывается функция mergeLesson(), которая объединяет несколько сообщений в одно, если пары проходят в одной аудитории и в одно время. Далее создается цикл от 0 до размерности (количества) пар преподавателя и выводится сообщение в чате;

– функция sortLessons(): принимает список пар в конкретный день, находит время пары, обрезает его до двоеточия, после чего сравнивает и возвращает отсортированные индексы;

– функция countofTeacherInRequest(): на вход получает сообщение пользователя, делает запрос в базу данных и получает список документов с преподавателями. После чего в цикле проверяет, являются ли все преподаватели, полученные из базы данных, одним человеком. Функция реализована для простоты вводом имени (ФИО) преподавателя пользователем;

– функция обработки информации, полученной из HTML-файла:

def parsDay(day, tempgroup, date, dayofWeek): time = list(day.find_all('span', {'class': 'time'})) # <--- поиск времени time = [str(i) for i in time] time = [i [i.index(">") + 1:i.index("<", 10) – 1] for i in time] # <--- удаляем лишнее (бывают пустые time) lesson = list(day.find_all('span', {'class': 'lesson'})) # <---- поиск пары lesson = [i.text for i in lesson] # <---- удаление "мусора" из пары (<span class="time">) prepod = list(day.find_all('span', {'class': 'prepod'})) # <---- поиск препора prepod = [i.text for i in prepod] aud = list(day.find_all('span', {'class': 'aud'})) aud = aud [1::2] # <--- удаление четных элементов из списка (они тоже пустые) aud = [i.text for i in aud] type_l = list(day.find_all('span', {'class': 'type n-type'})) type_l = [i.text for i in type_l] for i in range(len(time)): print(tempgroup, dayofWeek, time [i], lesson [i], prepod [i], aud [i], type_l [i], str(date)) db.createFull(tempgroup, dayofWeek, time [i], lesson [i], prepod [i], aud [i], type_l [i], str(date)) # <--- вызов функции из другой библиотеки (моей)

– функция создания элемента в базе данных:

def createFull(self, group, day, time, lesson, teacher, auditory, type, date): self.my_collection.insert_one({ "date": date, "group": group, "day": day, "time": time, "lesson": lesson, "teacher": teacher, "auditory": auditory, "type": type, })

Далее приведем экраны проекта rsueSchedulebot, демонстрирующие работоспособность разработки (рис. 3–7).

Рисунок 3. Пример выполнения команды «/расписание» в чат-боте

Источник: составлено авторами.


Рисунок 4. Пример выполнения функции countofTeacherInRequest
Источник: составлено авторами.

Рисунок 5. Пример проверки на наличие преподавателей (неуспешный поиск)
Источник: составлено авторами.



Рисунок 6. Пример выполнения команды «/кабинет» в чат-боте
Источник: составлено авторами.

Рисунок 7. Пример выполнения команды «/группа» в чат-боте
Источник: составлено авторами.
Перспективы проекта: добавление расписания студентов заочной формы обучения, студентов магистратуры. Поскольку данный бот стоит на сервере, который является бесплатным, при дальнейшей разработке он может стать полностью автономным и не требующим поддержки со стороны разработчика.

Заключение. Разработан Telegram-бот (@rsueSchedulebot), способный сообщать пользователю расписание преподавателя, группы и аудитории для РГЭУ (РИНХ). Алгоритмически были реализованы программные классы для парсинга расписания с веб-сайта университета, класс для работы с базой данных MongoDB, а также функционал бота, реализованный через меню и взаимодействие с пользователем.


Источники:

1. Первушин М.Р., Самсонов К.Ю., Краснов А.В., Жилина Е.В. «Парсинг» внешних данных в проекте «Чат-бот» для РГЭУ РИНХ // Проблемы проектирования, применения и безопасности информационных систем в условиях цифровой экономики: Материалы XX Международной науч.-практич. конф., посвященной 85-летию экономиста-математика, доктора экономических наук, профессора Виктора Алексеевича Кардаша. Ростов-на-Дону, 2020. – c. 242-249.
2. Белоконев С.Ю., Дудин М.Н., Хоконов А.А. Влияние совместного потребления и сетевых информационных технологий на социальные процессы // Экономика, предпринимательство и право. – 2019. – № 4. – c. 445-462. – doi: 10.18334/epp.9.4.41481.
3. Левина Е.В., Дудин М.Н. Проблема занятости молодежи в контексте глобальной цифровизации и использования сетевых технологий // Экономика труда. – 2020. – № 6. – c. 519-536. – doi: 10.18334/et.7.6.110209.
4. Широковских С.А. Нейросетевые технологии и искусственный интеллект в методологии разработки национальных проектов высокотехнологических компаний Азиатского региона // Экономика Центральной Азии. – 2019. – № 3. – c. 149-158. – doi: 10.18334/asia.3.3.111594.
5. Поляков Р.К. Эволюция транснациональных компаний: перспективы в эпоху «сетевой глобализации» // Вопросы инновационной экономики. – 2019. – № 1. – c. 37-54. – doi: 10.18334/vinec.9.1.39737.
6. Сравнение языков программирования: C, C++, C#, Java, Python, Swift, JavaScript, PHP, Ruby, Kotlin. YouTube. [Электронный ресурс]. URL: https://youtu.be/sqxUx8V_CoU.
7. PyTelegramBotApi. [Электронный ресурс]. URL: https://pypi.org/project/pyTelegramBotAPI/0.3.0.
8. Документация MongoDB. [Электронный ресурс]. URL: https://docs.mongodb.com.
9. Документация библиотеки Request. Requests: HTTP for Humans. [Электронный ресурс]. URL: https://docs.python-requests.org/en/master.
10. Документация Heroku. [Электронный ресурс]. URL: https://devcenter.heroku.com/categories/reference.
11. Всё, о чем должен знать разработчик Телеграм-ботов. Habr. [Электронный ресурс]. URL: https://habr.com/ru/post/543676.

Страница обновлена: 16.08.2022 в 15:23:17