Чат-бот — это программа, которая способна вести переписку с пользователями в чате, имитируя при этом поведение человека. Она может работать на любой известной платформе, например, Telegram, Viber и т. д. Согласно документу, опубликованному командой Telegram, посредством их мессенджера 52 млн. человек регулярно используют почти 800 тыс. активных ботов [1]. Основным преимуществом данного вида общения с пользователем является упрощенная коммуникация: чтобы воспользоваться нужным сервисом, достаточно просто открыть чат в мессенджере. Так, например, в России за август 2021 года мессенджером Telegram воспользовалось 37 миллионов человек [2], а за февраль 2022 года — 54 миллиона [3]. Данное преимущество делает чат-ботов очень удобным инструментом для самообразования, например, для изучения английского языка.
После изучения исследований [4] по данной тематике были разработаны следующие функциональные требования — бот должен предоставлять возможности для: 1) изучения грамматики английского языка; 2) прохождение тестов по грамматике английского языка, просмотр результатов; 3)изучение английских слов в игровом формате; 4) повторение уже выученных слов; 5) просмотр прогресса изучения слов.
Был выбран стэк технологий.NET, так как приложение должно иметь достаточно сложную логику и легко расширяться новым функционалом, а данная платформа обладает статически типизированным ООП-языком C#, мощными готовыми библиотеками и фреймворками и большим как англо- так и русскоговорящим сообществом. Все методические материалы по английской грамматике были взяты с сайта native-english.ru.
Реализовано два клиента: консольный и серверный. Консольный удобен для быстрой проверки и отладки реализуемого функционала во время разработки, а серверный — для публикации бота в интернете. Консольный реализован как обычное консольное приложение (Console App) на платформе.NET, а серверный — с использованием фреймворка ASP.NET Core MVC, шаблон проекта — Web-API. Для доступа к данным используется библиотека EF Core. Для работы с Telegram Bot API использована библиотека TelegramBots. Telegram Bot API — это HTTP-интерфейс, созданный для разработчиков, заинтересованных в создании ботов для Telegram. Для публикации бота в интернете использован бесплатный.NET хостинг Somee.com.
Разработка архитектуры чат-бота состоит из следующих этапов:
- Создание контейнера зависимостей. В качестве контейнера зависимостей был выбран Autofac, так как он имеет достаточно хорошую производительность и прост в настройке. Чтобы Autofac можно было использовать в проекте, необходимо его установить через NuGet Package Manager.
- Создание консольного клиента. Консольный клиент представляет из себя обычное консольное.NET Core приложение, которое с определенной периодичностью посылает запросы к серверам Telegram, для получения обновлений, чтобы затем передать их обработчику обновлений.
- Создание веб-клиента. Веб-клиент представляет собой серверное приложение ASP.NET Core, которое получает обновления от Telegram при помощи механизма webhook и затем передаёт их обработчику обновлений.
- Организация хранения данных. Для хранения данных бота был использован Entity framework Core с подходом Code first (подробнее см. главу 3.3). В качестве СУБД использовался SQL Server. Подход Code First подразумевает, что база данных будет генерироваться из классов-моделей.
- Идентификация пользователей. Для идентификации пользователя используется уникальный идентификатор чата.
- Взаимодействие с чатом. Чтобы бот имел возможность взаимодействовать с чатом, а именно отправлять, редактировать и удалять сообщения был добавлен проект типа Библиотека классов Communication и класс ChatManager, в данном классе заключена вся логика по взаимодействию бота с чатом.
- Прием сообщений. Для того чтобы бот мог принимать и обрабатывать сообщения, был спроектирован механизм приемников, он заключается в следующем: каждому пользователю было добавлено поле, отвечающее за его состояние, обработчик обновлений во время идентификации определяет текущее состояние пользователя и на основе этого определяет, какому именно приемнику нужно передать сообщение.
- Работа с кнопками. Telegram Bot API позволяет прикреплять к сообщениям кнопки и записывать в них информацию, которая будет передана боту при нажатии. Для унификации процесса обработки нажатия кнопки в проект Entities был добавлен класс CallbackQuerryItem.
- Обработчик обновлений. Для обработки обновлений приходящих от клиента был добавлен проект типа Библиотека классов UpdateHandlers с классом CommonHandler, который состоит из одного публичного метода HandleUpdate.
- Бизнес-логика. Чтобы соответствовать требуемой функциональности, бот должен иметь логику. Для этого был создан проект типа Библиотека классом с именем LogicLayer. Бизнес-логика реализуемого бота делится на два основных модуля: изучение слов и изучение грамматики. В каждый модуль было добавлено по два типа классов: первые отвечают за логику получения данных, а вторые за логику изменения. Также, чтобы изолировать логику генерации сообщений, для каждого класса логики был добавлен класс, генерирующий сообщения и их разметку.
Таким образом, в ходе данной статьи были рассмотрены основные инструменты и этапы построения архитектуры для построения расширяемых чат-ботов со сложной бизнес-логикой. Данная архитектура может использоваться как для изучения языков, так и для других целей.
Литература:
- Телеграм 2020: аудитория и каналы // Блоги экспертов и ИТ-компаний URL: https://club.cnews.ru/blogs/entry/telegram_2020_auditoriya_i_kanaly (Дата обращения 28.07.2022)
- Messenger audience by app Russia 2021 // Statista URL: https://www.statista.com/statistics/1065027/russia-messenger-audience-by-app/ (Дата обращения 28.07.2022)
- Telegram обошел Whatsapp по объему трафика в России // Ведомости URL: https://www.vedomosti.ru/technology/articles/2022/03/20/914320-telegram-oboshel-whatsapp (Дата обращения 28.07.2022)
- Будникова А. С., Бабенкова О. С. Использование чат-ботов при изучении иностранного языка // Ученые записки. Электронный научный журнал Курского государственного университета URL: https://cyberleninka.ru/article/n/ispolzovanie-chat-botov-pri-izuchenii-inostrannogo-yazyka/viewer (Дата обращения 28.07.2022)