Будь ласка, використовуйте цей ідентифікатор, щоб цитувати або посилатися на цей матеріал:
https://er.chdtu.edu.ua/handle/ChSTU/8847Повний запис метаданих
| Поле DC | Значення | Мова |
|---|---|---|
| dc.contributor.advisor | Немов, Руслан Григорович | - |
| dc.contributor.author | Брус, Владислав Максимович | - |
| dc.date.accessioned | 2026-03-19T13:28:05Z | - |
| dc.date.available | 2026-03-19T13:28:05Z | - |
| dc.date.issued | 2024-06-12 | - |
| dc.identifier.uri | https://er.chdtu.edu.ua/handle/ChSTU/8847 | - |
| dc.description.abstract | АНОТАЦІЯ Виконавець: Брус Владислав Максимович Назва квалифікаційної бакалаврської роботи: Telegram бот для збору і аналізу повідомлень користувачів Спеціальність: 121 «Інженерія програмного забезпечення» Установа: Черкаський державний технологічний університет Місто, рік: Черкаси, 2024 рік. Основні ідеї - Створення telegram-бота для збору, зберігання та аналізу повідомлень користувачів у групах месенджера Telegram, реалізація функцій збору різних типів повідомлень (текст, голос, зображення, відео), використання методів обробки тексту таких як машинне навчання та підрахунок слів, фраз, впровадження алгоритмів розпізнавання емоцій на зображеннях та відео, визначення автора тексту за допомогою машинного навчання. Результати - архітектура та функціональні модулі telegram-бота, збір і зберігання повідомлень у базі даних, аналіз текстів з виявленням ключових слів, фраз, емоційного забарвлення, аналіз зображень та відео для визначення емоцій, алгоритми визначення автора тексту, зручний інтерфейс взаємодії з ботом та візуалізацію результатів аналізу. Висновки - створений програмний комплекс дозволяє власникам груп і каналів у Telegram отримувати актуальну аналітику за повідомленнями, аналітика включає популярні теми обговорень, активність учасників, аналіз різних типів повідомлень, це дає змогу поліпшувати взаємодію з користувачами, формувати цікавий для аудиторії контент, приймати обґрунтовані рішення щодо розвитку спільноти. | uk_UA |
| dc.description.abstract | ABSTRACT Performer: Brus Vladislav Maksymovych Title of the Bachelor's Thesis: Telegram Bot for Collecting and Analyzing Messages Specialty: 121 "Software Engineering" Institution: Cherkasy State Technological University City, Year: Cherkasy, 2024 Main ideas - Creating a Telegram bot for collecting, storing and analyzing user messages in Telegram messenger groups, implementing functions for collecting various types of messages (text, voice, images, video), using text processing methods such as machine learning and counting words, phrases, implementing emotion recognition algorithms in images and videos, determining the author of the text using machine learning. Results - the architecture and functional modules of the Telegram bot, collection and storage of messages in the database, analysis of texts to identify keywords, phrases, emotional coloring, analysis of images and videos to determine emotions, algorithms for determining the author of the text, a user-friendly interface for interacting with the bot, and visualization of the analysis results. Conclusions - the created software complex allows owners of groups and channels in Telegram to receive up-to-date analytics on messages, the analytics includes popular discussion topics, activity of participants, analysis of different types of messages, this allows to improve interaction with users, create content interesting for the audience, and make informed decisions on community development. | uk_UA |
| dc.language.iso | uk | uk_UA |
| dc.subject | TELEGRAM-БОТ | uk_UA |
| dc.subject | АНАЛІЗ ТЕКСТІВ | uk_UA |
| dc.subject | ОБРОБКА ПРИРОДНОЇ МОВИ | uk_UA |
| dc.subject | МАШИННЕ НАВЧАННЯ | uk_UA |
| dc.subject | МЕСЕНДЖЕР | uk_UA |
| dc.subject | АРХІТЕКТУРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ | uk_UA |
| dc.subject | СТАТИСТИКА | uk_UA |
| dc.subject | TELEGRAM BOT | uk_UA |
| dc.subject | TEXT ANALYSIS | uk_UA |
| dc.subject | NATURAL LANGUAGE PROCESSING | uk_UA |
| dc.subject | MACHINE LEARNING | uk_UA |
| dc.subject | MESSENGER | uk_UA |
| dc.subject | SOFTWARE ARCHITECTURE | uk_UA |
| dc.subject | STATISTICS | uk_UA |
| dc.title | Розробка telegram бота для збору і аналізу повідомлень користувачів | uk_UA |
| dc.type | Bachelor Thesis | uk_UA |
| Розташовується у зібраннях: | 121 Інженерія програмного забезпечення (Інженерія програмного забезпечення) | |
Файли цього матеріалу:
| Файл | Опис | Розмір | Формат | |
|---|---|---|---|---|
| Кваліфікаційна робота бакалавра Брус Владислав Максимович.pdf Restricted Access | 4.37 MB | Adobe PDF | Переглянути/Відкрити Запит копії |
Усі матеріали в архіві електронних ресурсів захищено авторським правом, усі права збережено.
Extracted text
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ
Факультет інформаційних технологій і систем
Кафедра програмного забезпечення автоматизованих систем
ПОЯСНЮВАЛЬНА ЗАПИСКА
до кваліфікаційної роботи
бакалавра
На тему: «Розробка telegram бота для збору і аналізу повідомлень
користувачів»
Виконав: студент 4 курсу, групи ПЗС-2244
спеціальності
121 «Інженерія програмного забезпечення»
(шифр і назва напряму підготовки)
Студент Брус В.М.
(прізвище та ініціали)
Керівник Немов Р.Г.
(прізвище та ініціали)
Рецензент
(прізвище та ініціали)
Черкаси 2024
Черкаський державний технологічний університет
повне найменування вищого навчального закладу
Факультет інформаційних технологій і систем
Кафедра програмного забезпечення автоматизованих систем
Освітній рівень бакалавр
Спеціальність 121 «Інженерія програмного забезпечення»
Освітня програма Інженерія програмного забезпечення
ЗАТВЕРДЖУЮ
Зав. кафедри ПЗАС, професор
____________________ С. Голуб
«___» _______________ 2024 року
З А В Д А Н Н Я
НА КВАЛІФІКАЦІЙНУ РОБОТУ СТУДЕНТУ
Брус Владислав Максимович
(прізвище, ім’я, по батькові)
1. Тему проекту (роботи) Розробка telegram бота для збору і аналізу повідомлень користувачів
Керівник проекту (роботи) Немов Руслан Григорович, асистент
(прізвище, ім’я , по батькові, науковий ступінь, вчене звання)
Затверджені наказом Черкаського державного технологічного університету від «26» лютого 2024
року №60/04
2. Строк подання студентом проекту (роботи) 7 червня 2024 року
3. Вхідні дані до проекту (роботи) Технічне завдання на розробку, Довідкова література з
розробки telegram ботів, методичні рекомендації до виконання курсової роботи, автоматизовані
системи, терміни та визначення.
4. Зміст розрахунково-пояснювальної записки (перелік питань, які потрібно розробити)Вступ;
Розділ 1. Існуючі методи та засоби розв`язання поставлених завдань;
Розділ 2. Впровадження результатів досліджень у практику проектування програмного
забезпечення інформаційних систем;
Розділ 3. Розробка та тестування програмного забезпечення;
Висновки;
Список використаних джерел;
Додатки;
5. Перелік графічного матеріалу (з точним зазначенням обов’язкових робіт проекту;Слайд 1;
Слайд 2; Слайд 3; Слайд 4; Слайд 5; Слайд 6; Слайд 7; Слайд 8; Слайд 9; Слайд 10; Слайд 11;
Слайд 12; Слайд 13; Слайд 14; Слайд 15; Слайд 16; Слайд 17; Слайд 18; Слайд 19; Слайд 20;
Слайд 21; Слайд 22; Слайд 23;
6. Консультанти розділів проекту (роботи)
Прізвище, ініціали та посади Підпис, дата
Розділ
консультанта Завдання видав Завдання прийняв
1
2
3
7. Дата видачі завдання 02 грудня 2023 р.
КАЛЕНДАРНИЙ ПЛАН
Строк
виконання
№
Назва етапів випускної роботи етапів Примітки
п/п
випускної
роботи
1 Постановка задачі 05.12.2023 виконано
2 Підготовка завдання 13.12.2023 виконано
3 Погодження завдання 16.12.2023 виконано
4 Затвердження завдання 19.02.2024 виконано
Основна стадія
1 Підбір матеріалів 27.02.2024 виконано
2 Аналіз шляхів вирішення поставленої задачі 04.02.2024 виконано
3 Розрахунок основних параметрів роботи 10.03.2024 виконано
4 Вибір кінцевого варіанту проектного рішення 17.03.2024 виконано
5 Оформлення первісної редакції роботи 25.03.2024 виконано
Заключна стадія
1 Узгодження прийнятих проектних рішень з 31.04.2024 виконано
керівником
2 Оформлення пояснювальної записки роботи в 13.05.2024 виконано
кінцевій редакції
3 Попередній захист роботи 15.05.2024 виконано
4 Затвердження роботи 02.06.2024 виконано
5 Рецензування роботи 20.05.2024 Виконано
6 Захист роботи 03.06.2024
Студент _____________________ Брус В. М.
(підпис) (прізвище та ініціали)
Керівник проекту (роботи) _____________________ Немов Р. Г.
(підпис) (прізвище та ініціали)
АНОТАЦІЯ
Виконавець: Брус Владислав Максимович
Назва квалифікаційної бакалаврської роботи: Telegram бот для збору і аналізу
повідомлень користувачів
Спеціальність: 121 «Інженерія програмного забезпечення»
Установа: Черкаський державний технологічний університет
Місто, рік: Черкаси, 2024 рік.
Основні ідеї - Створення telegram-бота для збору, зберігання та аналізу
повідомлень користувачів у групах месенджера Telegram, реалізація функцій збору
різних типів повідомлень (текст, голос, зображення, відео), використання методів
обробки тексту таких як машинне навчання та підрахунок слів, фраз, впровадження
алгоритмів розпізнавання емоцій на зображеннях та відео, визначення автора
тексту за допомогою машинного навчання.
Результати - архітектура та функціональні модулі telegram-бота, збір і
зберігання повідомлень у базі даних, аналіз текстів з виявленням ключових слів,
фраз, емоційного забарвлення, аналіз зображень та відео для визначення емоцій,
алгоритми визначення автора тексту, зручний інтерфейс взаємодії з ботом та
візуалізацію результатів аналізу.
Висновки - створений програмний комплекс дозволяє власникам груп і
каналів у Telegram отримувати актуальну аналітику за повідомленнями, аналітика
включає популярні теми обговорень, активність учасників, аналіз різних типів
повідомлень, це дає змогу поліпшувати взаємодію з користувачами, формувати
цікавий для аудиторії контент, приймати обґрунтовані рішення щодо розвитку
спільноти.
Ключові слова: TELEGRAM-БОТ, АНАЛІЗ ТЕКСТІВ, ОБРОБКА
ПРИРОДНОЇ МОВИ, МАШИННЕ НАВЧАННЯ, МЕСЕНДЖЕР, АРХІТЕКТУРА
ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ, СТАТИСТИКА.
ABSTRACT
Performer: Brus Vladislav Maksymovych
Title of the Bachelor's Thesis: Telegram Bot for Collecting and Analyzing
Messages
Specialty: 121 "Software Engineering"
Institution: Cherkasy State Technological University
City, Year: Cherkasy, 2024
Main ideas - Creating a Telegram bot for collecting, storing and analyzing user
messages in Telegram messenger groups, implementing functions for collecting various
types of messages (text, voice, images, video), using text processing methods such as
machine learning and counting words, phrases, implementing emotion recognition
algorithms in images and videos, determining the author of the text using machine
learning.
Results - the architecture and functional modules of the Telegram bot, collection
and storage of messages in the database, analysis of texts to identify keywords, phrases,
emotional coloring, analysis of images and videos to determine emotions, algorithms for
determining the author of the text, a user-friendly interface for interacting with the bot,
and visualization of the analysis results.
Conclusions - the created software complex allows owners of groups and channels
in Telegram to receive up-to-date analytics on messages, the analytics includes popular
discussion topics, activity of participants, analysis of different types of messages, this
allows to improve interaction with users, create content interesting for the audience, and
make informed decisions on community development.
Keywords: TELEGRAM BOT, TEXT ANALYSIS, NATURAL LANGUAGE
PROCESSING, MACHINE LEARNING, MESSENGER, SOFTWARE
ARCHITECTURE, STATISTICS.
ЗМІСТ
ВСТУП .......................................................................................................................... 6
РОЗДІЛ 1 Існуючі методи та засоби розв’язання поставлених завдань ................... 9
1.1 Огляд платформ та фреймворків для розробки telegram ботів ......................... 9
1.2 Методи аналізу повідомлень .............................................................................. 9
1.3 Порівняльний аналіз існуючих рішень ............................................................ 10
1.4 Постановка задачі ............................................................................................. 14
ВИСНОВКИ ДО ПЕРШОГО РОЗДІЛУ ................................................................... 15
РОЗДІЛ 2 Впровадження результатів досліджень у практику проектування
програмного забезпечення інформаційних систем .................................................. 16
2.1 Моделювання предметної області ................................................................... 16
2.1.1 Предметна область моделювання. Модель предметної області. Словник
предметної області .............................................................................................. 16
2.1.2 Елементи моделювання предметної області ............................................. 18
2.1.3 Робоча область моделювання..................................................................... 20
2.2 Формування та аналіз вимог ............................................................................ 22
2.2.1 Формування вимог до програмного забезпечення. Первинні і детальні
вимоги. Вимоги замовника і розробника. Функціональні та нефункціональні
вимоги .................................................................................................................. 23
2.2.2 Формування вимог за допомогою діаграми прецедентів ......................... 26
2.3 Проектування логічної структури програмного комплексу ........................... 27
2.3.1 Діаграми класів ........................................................................................... 28
2.3.2 Діаграми пакетів ......................................................................................... 31
2.4 Архітектурне проектування.............................................................................. 31
2.4.1 Діаграма компонентів ................................................................................. 32
ЧДТУ 242240.002ПЗ
Змн. Арк. № докум. Підпис Дата
Розроб. Брус В.М. «Розробка telegram бота для збору і Літ. Лист Листів
Перевір. Немов Р.Г аналізу повідомлень користувачів» 3
Пояснювальна записка.
Н. Контр. Півень О.Б ФІТІС, кафедра ПЗАС, ПЗС-2244
Затверд. Голуб С.В.
2.4.2 Розгортання програмної системи на апаратних засобах. Діаграма
розгортання .......................................................................................................... 32
2.5 Моделювання поведінки системи .................................................................... 33
2.5.1 Діаграма діяльності .................................................................................... 35
2.5.2 Діаграма послідовності............................................................................... 36
2.5.3 Діаграма комунікації..................................................................................... 38
2.5.4 Діаграма скінченного автомату ................................................................. 39
ВИСНОВКИ ДО ДРУГОГО РОЗДІЛУ ..................................................................... 41
РОЗДІЛ 3 Розробка та тестування програмного забезпечення................................ 42
3.1 Розробка програмного комплексу ................................................................... 42
3.1.1 Обґрунтування вибору засобів реалізації .................................................. 42
3.1.2 Опис структурної (функціональної) схеми ............................................... 44
3.1.3 Опис логічної схеми системи ..................................................................... 45
3.1.4 Розробка бази даних ................................................................................... 48
3.1.5 Розробка інтерфейсу користувача ............................................................. 52
3.1.6 Опис розробки програмних компонентів .................................................. 55
3.2 Тестування системи .......................................................................................... 64
3.2.1 Модульне тестування ................................................................................. 65
3.2.2 Інтеграційне тестування ............................................................................. 70
3.2.3 Системне тестування .................................................................................. 76
3.2.4 Приймальне тестування.............................................................................. 80
3.3 Приклади впровадженого програмного комплексу ........................................ 83
ВИСНОВКИ ДО ТРЕТЬОГО РОЗДІЛУ ................................................................... 89
ВИСНОВКИ ............................................................................................................... 90
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ ................................................................... 91
ДОДАТОК А .............................................................................................................. 94
ДОДАТОК Б ............................................................................................................... 96
ДОДАТОК В ............................................................................................................. 124
ЧДТУ 242240.002ПЗ
ДОДАТОК Г ............................................................................................................. 129
ЧДТУ 242240.002ПЗ
ЧДТУ 242240.002ПЗ
ВСТУП
Актуальність теми – визначаються потребою в програмній реалізації
інформаційної технології мережевої комунікації у формі telegram-бота, який
дозволить автоматизувати різноманітні задачі та процеси, полегшуючи роботу
користувачів в мессенджері. Одним з актуальних напрямків застосування telegram-
ботів є збір та аналіз повідомлень в чатах і групах. Це дає змогу відстежувати
активність учасників, визначати поширені теми обговорень, будувати статистику.
На основі отриманих даних можна робити висновки про інтереси аудиторії,
вдосконалювати процеси комунікації та приймати ефективні управлінські рішення.
Попри наявність окремих розробок у цій сфері, питання створення універсального
та функціонального рішення для збору і глибокого аналізу повідомлень в чатах
залишається актуальним.
Мета роботи - метою роботи є створення програмного забезпечення
telegram-бота для збору повідомлень користувачів з подальшою обробкою та
аналізом отриманої інформації. Для досягнення поставленої мети необхідно
виконати наступні завдання до роботи:
1 Розробити архітектуру та модулі telegram-бота.
2 Реалізувати функції збору і зберігання повідомлень користувачів.
3 Розробити методи аналізу тексту повідомлень (визначення емоційного
забарвлення), побудови статистики, визначення автора тексту.
4 Забезпечити зручний інтерфейс для взаємодії користувача з ботом.
5 Розробити методи аналізу зображень та відео для визначення емоційного
забарвлення.
6 Провести тестування програмного забезпечення.
Об'єкт розробки - об'єктом розробки є програмний бот для месенджера
Telegram. Предметом розробки є програмне забезпечення для збору повідомлень з
чатів і груп у telegram, їх аналіз (виявлення частоти слів, фраз, визначення
емоційного забарвлення, розпізнавання авторів), конвертація голосових
6
ЧДТУ 242240.002ПЗ
повідомлень у текст, візуалізації результатів аналізу та надання статистики
повідомлень.
Методи розробки - для досягнення поставленої мети використано наступні
методи:
1 Системний аналіз предметної області для визначення вимог та побудови
концептуальної моделі.
2 Об'єктно-орієнтоване програмування та проєктування для розробки
архітектури та модулів програмного забезпечення.
3 Алгоритмізація задач аналізу текстових даних, зображень та відео.
4 Методи машинного навчання, зокрема нейронні мережі та трансформери,
для обробки природної мови, відео, та фото.
5 Методи візуалізації даних для представлення результатів аналізу у
зручному вигляді.
Опис отриманих результатів - у результаті виконання роботи було
розроблено програмний комплекс у вигляді telegram-бота з наступними
функціональними можливостями:
1 Збір повідомлень користувачів з чатів Telegram в режимі реального часу.
2 Зберігання зібраних повідомлень у базі даних.
3 Аналіз текстових повідомлень з виявленням ключових слів, фраз,
емоційного забарвлення та побудовою статистики.
4 Аналіз зображень та відео для визначення емоцій.
5 Визначення автора тексту за допомогою машинного навчання.
6 Візуалізація результатів аналізу у вигляді графіку.
7 Зручний інтерфейс взаємодії з ботом через месенджер Telegram.
Практичне значення отриманих результатів - Розроблений програмний
комплекс дозволяє власникам груп і каналів у Telegram отримувати актуальну
аналітику за повідомленнями, визначати популярні теми обговорень, активність
учасників, аналізувати різні типи повідомлень (текст, зображення, відео). Це дає
змогу поліпшувати взаємодію з користувачами, формувати цікавий для аудиторії
контент, приймати обґрунтовані рішення щодо розвитку спільноти.
7
ЧДТУ 242240.002ПЗ
Особистий внесок автора - Мною самостійно було проведено аналіз
предметної області, сформульовано вимоги до програмного забезпечення,
розроблено архітектуру та функціональні модулі telegram-бота. Було реалізовано
алгоритми збору та зберігання повідомлень, методи аналізу текстових даних з
використанням технологій обробки природної мови та машинного навчання. Також
були впроваджені підходи до аналізу зображень і відео з визначенням емоційного
забарвлення. Я самостійно провів тестування розробленого програмного
комплексу та підготував відповідну документацію.
8
ЧДТУ 242240.002ПЗ
РОЗДІЛ 1 ІСНУЮЧІ МЕТОДИ ТА ЗАСОБИ РОЗВ’ЯЗАННЯ
ПОСТАВЛЕНИХ ЗАВДАНЬ
1.1 Огляд платформ та фреймворків для розробки telegram ботів
Telegram-боти стали популярним інструментом для автоматизації
різноманітних задач та процесів. Вони дозволяють створювати зручні
користувацькі інтерфейси та інтегрувати різні сервіси в месенджері Telegram. Для
розробки telegram-ботів існує низка платформ та фреймворків, які полегшують цей
процес.
Одним з найпопулярніших фреймворків для створення ботів є Telegraf.js [16]
– JavaScript бібліотека для роботи з Telegram Bot API [1]. Вона має зручний
синтаксис на основі Promise, підтримує TypeScript [17] та надає широкі можливості
для налаштування webhook'ів та middleware. Іншим поширеним рішенням є Python-
telegram-bot [2] – Python фреймворк, що забезпечує простий доступ до всіх методів
Telegram Bot API [1].
Серед платформ для розробки чат-ботів варто відзначити BotFramework [18]
від Microsoft. Ця платформа, реалізована на C#, містить засоби для обробки
природної мови, розпізнавання образів, побудови діалогів тощо. Також існують
спеціалізовані бібліотеки для конкретних мов програмування, наприклад,
TelegramBots [19] – Java бібліотека-обгортка навколо Telegram Bot API [1].
Окремо можна виділити Botpress [29] – високорівневу платформу для
побудови та управління чат-ботами. Вона включає модулі для обробки природної
мови, діалогові менеджери, візуальний редактор, SDK і API.
1.2 Методи аналізу повідомлень
Існує декілька типових підходів до створення програмних додатків та ботів
для аналізу та опрацювання текстових даних, зображень та відео:
1 Використання мови програмування Python. Вона дозволяє швидко
прототипувати програмну логіку обробки текстів, фото, відео за допомогою
бібліотек.
9
ЧДТУ 242240.002ПЗ
2 Застосування фреймворків та бібліотек для форматування даних, або
навіть машинного навчання – tensorflow [6], matplotlib [4], numpy [24], pillow [9],
opencv [7], moviepy [28] тощо.
3 Використання стандартних інструментів та створення власних функцій
для прийому, обробки, та виведення інформації на вибраній мові програмування.
4 Розгортання моделей глибокого навчання для задач класифікації
зображень на базі нейронних мереж та трансформерів.
Для реалізації сховища текстових повідомлень використовують СУБД
(PostgreSQL [5], MySQL), а також хмарні БД (Firebase, Atlas).
Програмний продукт який буде розроблятись повинен мати зручну базу
даних, мова програмування на якій він буде розроблятись повинна мати доступ до
зручної бібліотеки яка підримує Telegram API [1] та зокрема, нейромереж.
Для аналізу повідомлень користувачів telegram-чатів можна використовувати
такі методи:
1 Частотний аналіз - підрахунок частоти слів і словосполучень у текстах для
ключових слів.
2 Аналіз тональності текстів - виявлення емоційного забарвлення
(позитивного, негативного, нейтрального) за допомогою алгоритмів машинного
навчання.
3 Визначення авторства тексту - визначення можливого автора тексту з
використанням методів машинного навчання та інтернету.
4 Визначення емоційного забарвлення на фото – визначення емоцій
зображених на фото за допомогою навченної нейромережі
Для реалізації цих методів будуть використані мова Python.
1.3 Порівняльний аналіз існуючих рішень
Було досліджено декілька існуючих telegram-ботів, що виконують аналіз
повідомлень в чатах, також на рисунках 1, 2 та 3 показані приклади їх повідомлень:
@soniashnyk_statistics_bot [13] – Аналіз повідомлень в месенджері. Має
широкі можливості щодо перегляду аналізованих повідомлень, зокрема звіт про
10
ЧДТУ 242240.002ПЗ
активність за день місяць або рік. Але не використовує нейромережі. Зосереджений
саме на статистиці.
Рисунок 1.1 – Приклад повідомлення від soniashnyk_statistics_bot
Переваги:
1 Широкі можливості щодо перегляду аналізованих повідомлень.
2 Можливість отримати звіт про активність за день, місяць або рік.
Недоліки:
1 Не використовує нейромережі.
2 Зосереджений саме на статистиці, можливо, не цікавий для користувачів,
які шукають більш глибокий аналіз.
@telegram-stats-bot [14] – opensource проект який може запуститись на
любому комп’ютері. Головне і єдине призначення бота це аналіз повідомлень в
группі за вказані проміжки часу в різних графіках. Не має підтримки різних мов,
зокрема, української. Також, не має особливого функціоналу, який би зацікавив
користувачів.
11
ЧДТУ 242240.002ПЗ
Рисунок 1.2 – Приклад повідомлення від telegram-stats-bot
Переваги:
1 Opensource проект, який може запуститись на будь-якому комп’ютері.
2 Аналіз повідомлень в групі за вказані проміжки часу в різних графіках.
Недоліки:
1 Відсутність підтримки різних мов, зокрема, української.
2 Не має особливого функціоналу.
@combot [15] – Має величезний функціонал: аналітика, модерація, тригери,
система рівнів, XP та репутації, звіти та багато чого іншого. Серед недоліків трохи
складний при використанні.
12
ЧДТУ 242240.002ПЗ
Рисунок 1.3 – Приклад повідомлення від Combot
Переваги:
1 Має такий основний функціонал - аналітика, модерація, тригери, звіти.
2 Додатковий функціонал - система рівнів, XP та репутації.
Недоліки:
1 Складний при першому використанні.
Запропонований в данній роботі telegram-бот поєднує зручний і інтуїтивний
інтерфейс, автоматичний збір даних в режимі реального часу, розширені методи
аналізу (класифікація текстів, емоційний аналіз), а також способи візуалізації
отриманих результатів аналітки. Також є аналіз відео, фото, розпізнавання автору
тексту за допомогою машинного навчання.
13
ЧДТУ 242240.002ПЗ
1.4 Постановка задачі
Великі обсяги повідомлень, що генеруються в різноманітних групах та
каналах, містять цінну інформацію, яку можна використати для аналізу та
отримання важливих висновків. Проте обробка такої кількості даних вручну є
складним і трудомістким завданням. Тому актуальним є створення
автоматизованого рішення для збору, зберігання та аналізу повідомлень
користувачів в популярному месенджері Telegram.
Метою даної роботи є розробка telegram-бота, здатного виконувати наступні
функції:
1 Збір повідомлень користувачів з чатів у режимі реального часу,
включаючи текстові повідомлення, голосові повідомлення, стікери, фото та відео.
2 Зберігання зібраних повідомлень у базі даних для подальшої обробки.
3 Аналіз текстових повідомлень з використанням методів обробки
природної мови та машинного навчання, зокрема:
виявлення ключових слів та фраз;
визначення емоційного забарвлення текстів (позитивне, негативне,
нейтральне).
4 Побудова статистики активності користувачів та розподілу типів
повідомлень.
5 Аналіз зображень та відео для визначення емоцій на них.
6 Визначення можливого автора тексту за допомогою методів машинного
навчання та інтернет-ресурсів.
7 Візуалізація результатів аналізу у зручній для користувача формі
(графіки, таблиці тощо).
8 Зручний інтерфейс взаємодії з ботом через месенджер Telegram.
Розроблений програмний комплекс повинен допомогти власникам груп та
каналів у Telegram ефективно аналізувати активність учасників, визначати
популярні теми обговорень, відстежувати емоційний фон спілкування та приймати
обґрунтовані рішення щодо подальшого розвитку спільноти. Також визначати
авторів текстів і емоції на фото, відео.
14
ЧДТУ 242240.002ПЗ
ВИСНОВКИ ДО ПЕРШОГО РОЗДІЛУ
У розділі було проведено огляд існуючих методів та засобів для вирішення
поставлених завдань створення telegram-бота для збору та аналізу повідомлень.
Розглянуто популярні платформи та фреймворки для розробки telegram-ботів, такі
як Telegraf.js [16], python-telegram-bot [2], BotFramework [18] та інші.
Описано основні методи для аналізу текстових повідомлень, зокрема
частотний аналіз, визначення тональності, виявлення ключових слів та фраз, а
також визначення авторства тексту з використанням машинного навчання. Для
аналізу зображень та відео пропонується застосовувати алгоритми розпізнавання
об'єктів, емоцій та фільтрацію.
Проведено порівняльний аналіз існуючих telegram-ботів для збору
статистики та аналізу повідомлень, виділено їх переваги та недоліки.
Сформульовано основні вимоги та функціональні можливості telegram-бота
для збору та аналізу повідомлень, що передбачають автоматичний збір даних,
аналіз тексту, зображень, відео, визначення авторства та емоцій, а також зручний
інтерфейс для взаємодії з користувачами.
15
ЧДТУ 242240.002ПЗ
РОЗДІЛ 2 ВПРОВАДЖЕННЯ РЕЗУЛЬТАТІВ ДОСЛІДЖЕНЬ У
ПРАКТИКУ ПРОЕКТУВАННЯ ПРОГРАМНОГО
ЗАБЕЗПЕЧЕННЯ ІНФОРМАЦІЙНИХ СИСТЕМ
2.1 Моделювання предметної області
Моделювання предметної області є важливим початковим етапом при
проектуванні telegram-бота для збору та аналізу повідомлень з чатів та груп у
месенджері Telegram. Буде визначено основні сутності, їх атрибути та
взаємозв'язки в досліджуваній предметній області.
Предметна область моделювання полягає в розробці telegram-бота, здатного
збирати повідомлення з чатів і груп у Telegram, проводити їх аналіз (виявлення
частоти слів, фраз, визначення емоційного забарвлення, розпізнавання авторів),
конвертувати голосові повідомлення в текст, візуалізувати результати аналізу та
надавати статистику повідомлень.
Для побудови концептуальної моделі предметної області ми виділимо
ключові сутності, такі як користувач, повідомлення, чат, група, аналіз повідомлень,
налаштування групи. Далі визначимо їх атрибути та зв'язки між ними. Буде
сформовано словник предметної області з поясненням основних термінів і понять,
що використовуються в цій сфері.
Результатом моделювання буде робоча область моделювання, що міститиме
опис сутностей, атрибутів, зв'язків та приклади екземплярів для кращого розуміння
предметної області.
Побудована модель предметної області забезпечить системне уявлення про
концептуальні об'єкти та взаємозв'язки в сфері збору й аналізу повідомлень з
Telegram і буде використана на подальших етапах проектування програмного
забезпечення telegram-бота.
2.1.1 Предметна область моделювання. Модель предметної області. Словник
предметної області
Предметна область моделювання: Telegram-бот для збору повідомлень з
чатів і груп у Telegram, їх аналізу (виявлення частоти слів, фраз, визначення
16
ЧДТУ 242240.002ПЗ
емоційного забарвлення, розпізнавання авторів), конвертації голосових
повідомлень у текст, візуалізації результатів аналізу та надання статистики
повідомлень.
Модель предметної області:
1 Сутності:
користувач;
повідомлення;
чат;
група;
аналіз повідомлень;
налаштування групи.
2 Атрибути сутностей:
користувач: ідентифікатор, повне ім'я, нікнейм;
повідомлення: ідентифікатор, текст, дата, час, тип (текст, голосове,
стікер), автор, чат, стікер;
чат: ідентифікатор, назва, список учасників, група;
група: ідентифікатор, назва, адміністратори, налаштування;
аналіз повідомлень: ключові слова, емоційний тон, автор (для
розпізнавання), повідомлення;
налаштування групи: мова, конвертація голосових повідомлень.
3 Зв'язки:
користувач - надіслав - Повідомлення (один до багатьох);
повідомлення - належить - Чат (багато до одного);
чат - належить - Група (багато до одного);
аналіз повідомлень - застосовується до - Повідомлення (один до
одного);
група - має - Налаштування групи (один до одного).
Словник предметної області:
17
ЧДТУ 242240.002ПЗ
1 Користувач - особа, зареєстрована в telegram, яка може надсилати
повідомлення.
2 Повідомлення - текстовий або мультимедійний вміст, надісланий
користувачем у чат.
3 Чат - канал спілкування в Telegram.
4 Група - об'єднання чатів для спільного спілкування.
5 Аналіз повідомлень - процес виявлення ключових слів, емоційного тону,
автора в текстових повідомленнях.
6 Ключові слова - часто вживані слова у текстових повідомленнях.
7 Емоційний тон - загальний емоційний відтінок повідомлення.
8 Налаштування групи - параметри, специфічні для кожної групи, такі як
мова та конвертація голосових повідомлень.
9 Конвертація голосових повідомлень - перетворення аудіо на текст для
аналізу.
2.1.2 Елементи моделювання предметної області
У моделюванні предметної області використовуються наступні основні
елементи
1 Сутність - це окремий об'єкт або концепція з унікальним набором
атрибутів у предметній області. Наприклад, "Користувач", "Повідомлення", "Чат".
2 Атрибут - це властивість або характеристика сутності. Наприклад, для
сутності "Користувач" атрибутами можуть бути "ім'я", "прізвище",
"ідентифікатор".
3 Зв'язок - це семантична асоціація між двома або більше сутностями.
Наприклад, зв'язок "належить" між сутностями "Повідомлення" і "Користувач".
4 Множинність - це числова характеристика зв'язку, яка визначає кількість
екземплярів однієї сутності, пов'язаних з екземпляром іншої сутності. Вона показує
обмеження на кількість об'єктів, які можуть брати участь у відносинах.
5 Атрибут зв'язку - це атрибут, який належить зв'язку між двома або більше
сутностями та характеризує цей зв'язок.
18
ЧДТУ 242240.002ПЗ
Ці елементи використовуються для побудови концептуальної моделі
предметної області, що забезпечує загальне розуміння та опис системи без
занурення в деталі реалізації.
Таблиця 2.1
Графічні елементи UML діаграм
Графічний символ Назва елемента
Дійова особа(актор)
Варіант використання
Коментар
Пакет
Клас
Об`єкт
Компонент
Вузол
Діяльність
Стан
Початковий стан
Кінцевий стан
19
ЧДТУ 242240.002ПЗ
Таблиця 2.2
Єднальні елементи UML діаграм
Графічний символ Назва елемента
Відношення асоціації
Відношення залежності
Відношення успадкування
Агрегація
Композиція
Приймач події
Джерело події
Заміна
Межа
Простий потік управління
Послати
Виклик
Рекурсія
Повернути
UML діаграми - це стандартизовані графічні нотації для візуального
представлення різних аспектів системи програмного забезпечення, таких як
структура, поведінка та архітектура. Вони використовуються для документування,
проектування та комунікації в процесі розробки програмного забезпечення. [22]
2.1.3 Робоча область моделювання
Сутності:
1 Користувач (User)
2 Повідомлення (Message)
20
ЧДТУ 242240.002ПЗ
3 Чат (Chat)
4 Група (Group)
5 Аналіз повідомлень (MessageAnalysis)
6 Налаштування групи (GroupSettings)
Атрибути сутностей:
1 Користувач: ідентифікатор (id), повне ім'я (fullName), нікнейм (username).
2 Повідомлення: ідентифікатор (id), текст (text), дата (date), час (time), тип
(type - текст, голосове, стікер, фото, відео), автор (sender), чат (chat), стікер
(stickerId).
3 Чат: ідентифікатор (id), назва (name), список учасників (participants),
група (group).
4 Група: ідентифікатор (id), назва (name), адміністратори (admins),
налаштування (settings).
5 Аналіз повідомлень: ключові слова (keywords), емоційний тон (emotion),
ідентифікатор повідомлення (messageId), автор (author).
6 Налаштування групи: мова (language), конвертація голосових
повідомлень (speechToText).
Зв'язки:
1 Користувач - надіслав - Повідомлення (один до багатьох)
2 Повідомлення - належить - Чат (багато до одного)
3 Чат - належить - Група (багато до одного)
4 Аналіз повідомлень - застосовується до - Повідомлення (один до одного)
5 Група - має - Налаштування групи (один до одного)
Приклади екземплярів:
1 Користувач: @my_username, ідентифікатор 12345, повне ім'я "Vlad Brus".
2 Повідомлення: "Привіт всім!", 2023-05-03 12:34, текстове повідомлення
від користувача @my_username в чаті "Моя група".
3 Чат: "Моя група", ідентифікатор -6789012, група "Головна група".
4 Група: "Головна група", ідентифікатор 1234, адміністратор @admin_user,
налаштування мови українська.
21
ЧДТУ 242240.002ПЗ
5 Аналіз повідомлень: ключові слова "привіт, всім", позитивний емоційний
тон, ідентифікатор повідомлення 563217, автор @my_username.
6 Налаштування групи: мова українська, конвертація голосових
повідомлень увімкнена.
У цій робочій області моделювання ми визначили основні сутності, їх
атрибути та зв'язки між ними, які відображають предметну область telegram-бота
для збору та аналізу повідомлень з чатів і груп. Також наведено приклади
екземплярів для кращого розуміння.
2.2 Формування та аналіз вимог
Одним з ключових етапів розробки програмного забезпечення є формування
та аналіз вимог до системи, що створюється. Вимоги визначають функціональність,
поведінку, обмеження та атрибути якості майбутньої системи. Правильне
формулювання вимог є критично важливим для успішної реалізації проекту та
задоволення потреб замовника та кінцевих користувачів.
На цьому етапі виконуються наступні кроки:
1 Формулюються первинні (високорівневі) вимоги до telegram-бота на
основі аналізу предметної області та потреб замовника. Первинні вимоги описують
основну функціональність системи.
2 Первинні вимоги деталізуються у вигляді детальних (деталізованих)
вимог, що конкретизують функціональність та визначають нефункціональні
вимоги, такі як продуктивність, безпека, юзабіліті тощо.
3 Вимоги розділяються на дві категорії: вимоги замовника (які
формулюються безпосередньо замовником) та вимоги розробника (які
формулюються розробниками для забезпечення якості та коректної роботи
системи).
4 Вимоги класифікуються на функціональні (визначають функції, які має
виконувати система) та нефункціональні (визначають критерії якості,
продуктивності, безпеки тощо).
22
ЧДТУ 242240.002ПЗ
5 Для візуалізації функціональних вимог будується діаграма прецедентів з
використанням нотації UML.
Результатом цього етапу є повний перелік сформульованих вимог до
telegram-бота у зрозумілій та структурованій формі, який слугуватиме основою для
подальшого проектування архітектури та розробки програмного забезпечення.
2.2.1 Формування вимог до програмного забезпечення. Первинні і детальні
вимоги. Вимоги замовника і розробника. Функціональні та нефункціональні
вимоги
Первинні вимоги:
1 Забезпечити збір текстових повідомлень, голосових повідомлень,
зображень та відео з чатів Telegram в режимі реального часу.
2 Реалізувати аналіз зібраних повідомлень.
3 Надавати користувачам зручний інтерфейс для взаємодії з ботом через
Telegram.
4 Візуалізувати результати аналізу повідомлень у зручному вигляді.
Детальні вимоги:
1 Визначення емоційного забарвлення текстових повідомлень.
2 Виявлення ключових слів та фраз у текстових повідомленнях.
3 Побудова статистики повідомлень (кількість повідомлень за період,
активність користувачів, найпопулярніші слова та фрази).
4 Розпізнавання емоцій на зображеннях та у відео.
5 Визначення автора тексту за наданим уривком.
6 Забезпечити стійку та безперебійну роботу системи цілодобово.
7 Реалізувати розмежування доступу для адміністраторів та звичайних
користувачів.
8 Забезпечити захищене зберігання повідомлень та результатів аналізу.
9 Забезпечити масштабованість системи для опрацювання великих обсягів
даних.
10 Забезпечити модульність системи з можливістю додавання нових методів
аналізу.
23
ЧДТУ 242240.002ПЗ
11 Конвертувати голосові повідомлення в текст для подальшого аналізу.
12 Надавати користувачам можливість переглядати окремі повідомлення та
їх атрибути (автор, дата, час, тип повідомлення).
13 Надавати користувачам можливість задавати період та чат для збору
повідомлень.
14 Надавати користувачам можливість керувати налаштуваннями системи,
такими як мова інтерфейсу та увімкнення/вимкнення функції конвертації
голосових повідомлень у текст.
Вимоги замовника:
1 Забезпечити збір текстових повідомлень, голосових повідомлень,
зображень та відео з чатів Telegram в режимі реального часу.
2 Реалізувати аналіз повідомлень, а саме:
визначення емоційного забарвлення текстових повідомлень;
виявлення найчастіших слів та фраз у текстових повідомленнях;
побудова статистики повідомлень (кількість повідомлень за період,
активність користувачів, найпопулярніші слова та фрази);
розпізнавання емоцій на зображеннях та у відео;
визначення автора тексту за наданим уривком.
3 Надавати користувачам зручний інтерфейс для взаємодії з ботом через
Telegram.
4 Візуалізувати результати аналізу повідомлень у зручному вигляді
(графік).
Вимоги розробника:
1 Забезпечити стійку та безперебійну роботу системи цілодобово.
2 Реалізувати розмежування доступу для адміністраторів та звичайних
користувачів.
3 Забезпечити захищене зберігання повідомлень та результатів аналізу.
4 Забезпечити масштабованість системи для опрацювання великих обсягів
даних.
24
ЧДТУ 242240.002ПЗ
5 Забезпечити модульність системи з можливістю додавання нових методів
аналізу.
6 Конвертувати голосові повідомлення в текст для подальшого аналізу.
7 Надавати користувачам можливість переглядати окремі повідомлення та
їх атрибути (автор, дата, час, тип повідомлення).
8 Надавати користувачам можливість задавати період та чат для збору
повідомлень.
9 Надавати користувачам можливість керувати налаштуваннями системи,
такими як мова інтерфейсу та увімкнення/вимкнення функції конвертації
голосових повідомлень у текст.
Функціональні вимоги:
1 Збір повідомлень з чатів Telegram.
2 Аналіз текстових повідомлень.
3 Визначення емоційного забарвлення.
4 Виявлення ключових слів та фраз.
5 Побудова статистики.
6 Аналіз зображень та відео.
7 Розпізнавання емоцій.
8 Визначення автора тексту.
9 Конвертація голосових повідомлень у текст.
10 Перегляд результатів аналізу.
11 Керування налаштуваннями системи.
Нефункціональні вимоги:
1 Продуктивність: система повинна швидко обробляти великі потоки
вхідних повідомлень та виконувати аналіз у розумні терміни.
2 Надійність: система повинна бути стійкою до збоїв та відмов апаратури,
з можливістю відновлення після аварійних ситуацій.
3 Безпека: захист конфіденційних даних користувачів та результатів
аналізу від несанкціонованого доступу.
4 Юзабіліті: зрозумілий та інтуїтивний інтерфейс взаємодії з ботом.
25
ЧДТУ 242240.002ПЗ
5 Переносимість: можливість розгортання на різних апаратних та
програмних платформах.
2.2.2 Формування вимог за допомогою діаграми прецедентів
Діаграма 2.1 - Діаграма прецендетів telegram бота
Діаграма прецедентів (usecase diagram) візуалізує основні функціональні
вимоги до системи з точки зору користувачів (акторів). На діаграмі ми бачимо
актора - користувача (User). Функціональні можливості системи представлені
прецедентами (usecase):
1 Collect Messages (Збір повідомлень).
2 Analyze Messages (Аналіз повідомлень).
3 Store Data (Зберігання даних).
4 Recognize Author (Розпізнавання автора).
5 Convert Voice to Text (Конвертація голосових повідомлень в текст).
26
ЧДТУ 242240.002ПЗ
6 View User Message Analysis (Перегляд аналізу повідомлень користувача).
7 View Group Message Analysis (Перегляд аналізу повідомлень групи).
8 View Analysis Results (Перегляд результатів аналізу).
9 Manage Settings (Управління налаштуваннями).
10 Set Language (Встановлення мови).
11 Enable/Disable Voice to Text (Ввімкнення/Вимкнення конвертації
голосових повідомлень в текст)
Зв'язки між прецедентами відображають відношення включення
(<<includes>>), які показують, що один прецедент використовує функціональність
іншого для своєї реалізації, та розширення (<<extends>>), яке показує, що один
прецедент розширює функціональність іншого.
2.3 Проектування логічної структури програмного комплексу
Після етапу формування вимог до telegram-бота для збору та аналізу
повідомлень необхідно спроектувати його логічну структуру. Це передбачає
визначення основних класів (сутностей), їх атрибутів, методів та взаємозв'язків між
ними.
Проектування логічної структури програмного комплексу включає наступні
кроки:
1 Побудова діаграми класів за допомогою нотації UML. Діаграма класів
візуалізує основні класи системи, їх атрибути, методи, а також відношення між
класами.
2 Створення діаграми пакетів, яка демонструє організацію програмного
забезпечення на рівні пакетів (модулів, бібліотек) та їх взаємозв'язки. Пакети
групують класи за їхньою функціональністю або предметною областю.
Результатом цього етапу є діаграми, що відображають логічну структуру
програмного комплексу telegram-бота. Ці діаграми забезпечують загальне
розуміння основних компонентів системи, їх відповідальності та взаємодії між
ними.
27
ЧДТУ 242240.002ПЗ
2.3.1 Діаграми класів
Діаграма 2.2 - Діаграма класів telegram бота без атрибутів
Опис діаграми класів без атрибутів:
1 User - клас, що представляє користувача месенджера.
2 Message - клас, що представляє повідомлення в месенджері.
3 MessageType - перелічувальний тип, що визначає можливі типи
повідомлень (текст, голосове, стікер, фото, відео).
4 Chat - клас, що представляє чат у месенджері.
5 ChatSettings - клас, що містить налаштування чату.
6 MessageAnalysis - клас, що представляє результати аналізу повідомлення.
7 ImageAnalysis - клас, що представляє результати аналізу зображення.
8 VideoAnalysis - клас, що представляє результати аналізу відео.
9 AuthorRecognition - клас, що представляє результати розпізнавання
автора тексту.
10 EmotionType - перелічувальний тип, що визначає можливі типи емоцій.
11 CommandHandler - клас, що обробляє команди користувача.
12 UpdateHandler - клас, що обробляє оновлення від месенджера.
На діаграмі також показані відносини між класами, такі як асоціації,
композиції та агрегації, які відображають логічні зв'язки між сутностями
предметної області.
28
ЧДТУ 242240.002ПЗ
Діаграма 2.3 - Діаграма класів telegram бота з атрибутами
29
ЧДТУ 242240.002ПЗ
Опис діаграми класів:
1 User - представляє користувача месенджера, містить його ідентифікатор,
повне ім'я та нікнейм.
2 Message - об'єкт повідомлення з ідентифікатором, текстом, датою,
ідентифікатором відправника, ідентифікатором чату, ідентифікатором стікера
(якщо є) та посиланням на відповідне повідомлення (якщо є).
3 MessageType - перелічення типів повідомлень (текст, голос, стікер, фото,
відео).
4 Chat - представляє чат месенджера з ідентифікатором.
5 ChatSettings - налаштування чату, такі як мова та увімкнення/вимкнення
перетворення голосових повідомлень на текст.
6 MessageAnalysis - результат аналізу певного повідомлення з ключовими
словами, емоціями та ідентифікатором повідомлення.
7 ImageAnalysis - клас для аналізу зображень, містить байтовий масив
зображення та результат аналізу.
8 VideoAnalysis - клас для аналізу відео, містить байтовий масив відео та
результат аналізу.
9 AuthorRecognition - клас для розпізнавання автора тексту, містить текст
та імена можливих авторів.
10 EmotionType - перелічення типів емоцій (позитивні, негативні,
нейтральні).
11 CommandHandler - клас для обробки команд користувача.
12 UpdateHandler - клас для обробки оновлень від месенджера, взаємодіє з
CommandHandler та MessageHandler."
Діаграма також містить enum-класи MessageType для типів повідомлень та
EmotionType для категорій емоцій.
Відносини між класами, такі як композиція та агрегація, відображають
логічні зв'язки між сутностями предметної області.
Також відображає типи данних в змінних, функції які до них відносятся.
30
ЧДТУ 242240.002ПЗ
2.3.2 Діаграми пакетів
Діаграма 2.4 – Діаграма пакетів telegram бота
Клас Bot взаємодіє з класами MessageHandler та CommandHandler.
MessageHandler взаємодіє з класами ImageAnalysis, VoiceAnalysis, VideoAnalysis та
пакетом Database. CommandHandler взаємодіє з класами TextAnalysis,
AuthorRecognition та пакетом Database.
Клас TextAnalysis взаємодіє з пакетом Database, класом Visualization та
пакетом Models. Клас AuthorRecognition взаємодіє з пакетом Models. Класи
ImageAnalysis та VideoAnalysis також взаємодіють з пакетом Models.
Пакет Analysis взаємодіє з пакетом Utils. Пакет Database взаємодіє з базою
даних PostgreSQL.
31
ЧДТУ 242240.002ПЗ
2.4 Архітектурне проектування
Архітектурне проектування є важливим етапом у розробці програмного
забезпечення, на якому визначається загальна структура та організація системи.
Цей етап передбачає визначення основних компонентів, їх взаємозв'язків та
розміщення на апаратних ресурсах.
На цьому етапі виконуються наступні кроки:
1 Побудова діаграми компонентів за допомогою нотації UML. Ця діаграма
візуалізує основні компоненти системи, їх інтерфейси та залежності між ними.
2 Створення діаграми розгортання, яка демонструє розміщення
компонентів на фізичних вузлах (серверах, базах даних тощо) та їх взаємозв'язки.
Результатом архітектурного проектування є діаграми, що відображають
високорівневу архітектуру програмного комплексу telegram-бота. Ці діаграми
забезпечують загальне розуміння структури системи, взаємодії між компонентами
та їх розміщення на апаратних засобах. Вони слугують основою для подальшої
деталізації та реалізації програмного забезпечення.
2.4.1 Діаграма компонентів
Діаграма 2.5 – Діаграма компонентів telegram бота
Опис діаграми:
1 Компонент Bot містить класи MessageHandler, CommandHandler, які
відповідають за обробку вхідних повідомлень, команд від Telegram відповідно.
32
ЧДТУ 242240.002ПЗ
2 Компонент Analysis містить класи TextAnalysis, ImageAnalysis,
VideoAnalysis та VoiceAnalysis, які відповідають за аналіз текстових повідомлень,
зображень, відео та голосових повідомлень відповідно.
3 Компонент Database містить класи DatabaseConnection та
DatabaseManager для роботи з базою даних.
4 Компонент Visualization містить клас GraphGeneration для генерації
графіків та візуалізації даних.
5 Компонент Utils містить клас Helper для допоміжних функцій. База даних
PostgreSQL представлена окремим вузлом.
2.4.2 Розгортання програмної системи на апаратних засобах. Діаграма
розгортання
Діаграма 2.6 – Діаграма розгортання telegram бота
Опис діаграми:
1 Вузол "Користувач" містить компонент "Telegram App", який представляє
додаток Telegram на пристрої користувача.
33
ЧДТУ 242240.002ПЗ
2 Вузол "Сервер" містить компонент "Telegram Bot API", який взаємодіє з
ботом, а також пакет "Telegram Bot" з усіма його компонентами та зв'язками між
ними.
3 Компоненти "Core", "Analysis", "Database", "Utils", "Visualization" та
"Models" відповідають однойменним пакетам на діаграмі пакетів.
4 Зв'язки між компонентами відображають їхні взаємодії та залежності, як
описано в документації.
5 База даних PostgreSQL зображена як окремий вузол.
Ця діаграма розгортання відображає архітектуру програми, її компоненти та
їхні зв'язки, а також розгортання на апаратних засобах (пристрій користувача та
сервер).
2.5 Моделювання поведінки системи
Моделювання поведінки системи є важливим кроком у процесі проектування
програмного забезпечення, оскільки дозволяє візуалізувати та документувати
взаємодію між компонентами системи та перебіг процесів у часі.
Для моделювання поведінки telegram-бота для збору та аналізу повідомлень
буде використано кілька діаграм, побудованих з використанням нотації UML.
На цьому етапі виконуються наступні кроки:
1 Побудова діаграми діяльності, яка візуалізує потік керування та
послідовність дій, що виконуються системою для досягнення певної цілі. Діаграма
діяльності дозволяє продемонструвати логіку роботи telegram-бота при обробці
вхідних повідомлень.
2 Створення діаграми послідовності, яка відображає взаємодію між
об'єктами системи в часовій послідовності. Ця діаграма допомагає зрозуміти
порядок обміну повідомленнями між різними компонентами при обробці вхідних
повідомлень і формуванні відповіді.
3 Побудова діаграми комунікації, яка також демонструє взаємодію між
об'єктами системи, але акцентує увагу на зв'язках між ними, а не на часовій
послідовності.
34
ЧДТУ 242240.002ПЗ
4 Створення діаграми скінченного автомату, яка відображає можливі стани
системи та переходи між ними залежно від вхідних подій або умов. Ця діаграма
дозволяє візуалізувати поведінку telegram-бота при обробці різних типів
повідомлень.
Результатом моделювання поведінки системи є набір діаграм, які надають
детальне уявлення про порядок виконання операцій, взаємодію між компонентами
та можливі стани системи під час роботи telegram-бота.
Ці діаграми слугують основою для подальшої реалізації програмного
забезпечення та забезпечують кращу комунікацію між членами команди
розробників.
2.5.1 Діаграма діяльності
Діаграма 2.7 – Діаграма діяльності telegram бота
35
ЧДТУ 242240.002ПЗ
Діаграма діяльності описує послідовність дій, які виконує Telegram-бот при
обробці вхідних повідомлень. Процес починається з отримання вхідного
повідомлення від користувача. Далі перевіряється, чи це голосове повідомлення.
Якщо так, то виконується конвертація аудіо в текст, після чого формується
відповідь, яка надсилається користувачеві.
Якщо це не голосове повідомлення, перевіряється, чи це команда. Якщо так,
команда обробляється, формується відповідь і вона надсилається користувачеві.
Якщо це не команда, перевіряється, чи це текстове повідомлення. Якщо так,
повідомлення зберігається в базі даних. Далі приймається рішення, чи потрібно
відповідати на це повідомлення. Якщо потрібно, формується відповідь і вона
надсилається користувачеві.
2.5.2 Діаграма послідовності
Діаграма 2.8 – Діаграма послідовності telegram бота
36
ЧДТУ 242240.002ПЗ
Діаграма послідовності ілюструє взаємодію між об'єктами системи при
обробці вхідного повідомлення від користувача і формуванні відповіді в часовій
послідовності.
1 Користувач (User) надсилає повідомлення в Telegram-бота (TelegramBot).
2 Telegram-бот викликає метод handleMessage() в об'єкті Handler і передає
йому отримане повідомлення.
3 Залежно від типу повідомлення, Handler викликає відповідний метод для
аналізу:
Якщо повідомлення є голосовим, Handler викликає метод
convertVoiceToText() в об'єкті VoiceAnalysis для конвертації аудіо в
текст, і VoiceAnalysis повертає текст до Handler.
Якщо повідомлення містить зображення, Handler викликає метод
predictImage() в об'єкті ImageAnalysis для аналізу зображення, і
ImageAnalysis повертає результати аналізу до Handler.
Якщо повідомлення містить відео, Handler викликає метод
predictVideo() в об'єкті VideoAnalysis для аналізу відео, і VideoAnalysis
повертає результати аналізу до Handler.
Якщо повідомлення є текстовим, Handler викликає метод
analyzeText() в об'єкті TextAnalysis для аналізу тексту, і TextAnalysis
повертає результати аналізу до Handler.
4 Handler зберігає метадані повідомлення в базі даних (Database) за
допомогою методу saveMessageMetadata(), і база даних підтверджує успішне
збереження.
5 Handler формує відповідь на основі результатів аналізу і передає її до
Telegram-бота за допомогою методу sendResponse().
6 Telegram-бот надсилає відповідь користувачеві.
Ця діаграма послідовності показує часову послідовність взаємодії між
об'єктами системи, включаючи обробку різних типів повідомлень, допомагаючи
зрозуміти порядок виконання операцій і обмін повідомленнями між різними
компонентами під час обробки вхідного повідомлення та формування відповіді.
37
ЧДТУ 242240.002ПЗ
2.5.3 Діаграма комунікації
Діаграма 2.9 – Діаграма комунікації telegram бота
Діаграма комунікації ілюструє взаємодію між різними учасниками системи
при обробці повідомлень, надісланих користувачем. Ключовими учасниками є:
1 Користувач (User) - відправляє повідомлення в Telegram-бот.
2 Telegram-бот (TelegramBot) - отримує повідомлення від користувача та
взаємодіє з іншими компонентами для обробки та формування відповіді.
3 MessageHandler - обробляє вхідні повідомлення від користувачів,
визначає їх тип (команда, текст, голос, зображення чи відео) та передає на
відповідні компоненти для аналізу.
4 CommandHandler - обробляє команди, надіслані користувачами.
5 TextAnalysis - аналізує текстові повідомлення.
6 VoiceAnalysis - конвертує голосові повідомлення в текст.
7 ImageAnalysis - аналізує зображення.
8 VideoAnalysis - аналізує відео.
9 Database - зберігає метадані повідомлень.
38
ЧДТУ 242240.002ПЗ
Процес обробки повідомлення відбувається наступним чином:
1 Користувач надсилає повідомлення в Telegram-бот.
2 Telegram-бот передає повідомлення до MessageHandler.
3 MessageHandler визначає тип повідомлення (команда, текст, голос,
зображення чи відео) і передає його на відповідний компонент для аналізу.
4 Компонент аналізу (TextAnalysis, VoiceAnalysis, ImageAnalysis або
VideoAnalysis) обробляє повідомлення та повертає результат до MessageHandler.
5 MessageHandler зберігає метадані повідомлення в базі даних (Database).
6 MessageHandler формує відповідь на основі результатів аналізу та передає
її до Telegram-боту.
7 Telegram-бот надсилає відповідь користувачеві.
2.5.4 Діаграма скінченного автомату
Діаграма 2.10 – Діаграма скінченого автомату telegram бота
Опис діаграми:
1 Автомат починає зі стану Waiting (Очікування), який є початковим
станом.
39
ЧДТУ 242240.002ПЗ
2 Коли надходить нове повідомлення (Receive message), автомат
переходить у стан Received_Message (Отримане повідомлення).
3 У стані Check_Type (Перевірка типу) перевіряється тип повідомлення:
якщо знайдено команду або тригер (Command or trigger found), автомат
переходить у стан Process_Command (Обробка команди);
якщо це голосове повідомлення (Voice message), автомат переходить у
стан Convert_Voice (Конвертувати голос);
якщо це звичайне текстове повідомлення (Regular message), автомат
переходить у стан Save_Message (Зберегти повідомлення).
4 У стані Process_Command команда або тригер обробляються у стані
Execute_Command (Виконати команду), після чого автомат повертається до
початкового стану Waiting.
5 Якщо повідомлення є голосовим, у стані Convert_Voice воно
конвертується в текст у стані Voice_To_Text (Голос у текст). Після цього автомат
повертається до стану Check_Type для подальшої обробки.
6 Якщо повідомлення не є командою або голосовим, воно зберігається у
стані Save_Message.
7 Після збереження повідомлення, автомат переходить у стан
Analyze_Message (Аналіз повідомлення), де виконується аналіз тексту.
8 Після аналізу тексту перевіряється необхідність генерувати відповідь:
якщо відповідь потрібна (Response needed), автомат переходить у стан
Generate_Response (Генерувати відповідь), де формується відповідь на
основі результатів аналізу;
якщо відповідь не потрібна (No response needed), автомат повертається
до початкового стану Waiting.
9 У стані Send_Response (Відправити відповідь) згенерована відповідь
відправляється користувачеві.
10 Після відправки відповіді автомат повертається до початкового стану
Waiting.
40
ЧДТУ 242240.002ПЗ
ВИСНОВКИ ДО ДРУГОГО РОЗДІЛУ
Було проведено моделювання предметної області telegram-бота для збору та
аналізу повідомлень. Було побудовано модель предметної області, визначено
основні сутності, атрибути та зв'язки між ними. Також було сформовано первинні
та детальні вимоги до програмного забезпечення, описано функціональні та
нефункціональні вимоги.
Для візуалізації логічної структури програмного комплексу було розроблено
діаграму класів, що відображає основні класи системи, їх атрибути, методи та
відносини між ними. Крім того, була створена діаграма пакетів, яка демонструє
організацію програмного забезпечення на рівні пакетів та взаємозв'язки між ними.
Архітектурне проектування включало розробку діаграми компонентів, що
показує основні компоненти системи та їх взаємодію, а також діаграми
розгортання, яка відображає розміщення компонентів на апаратних засобах.
Для моделювання поведінки системи було створено діаграму діяльності, що
описує послідовність дій telegram-бота при обробці вхідних повідомлень, діаграму
послідовності та діаграму комунікації, які ілюструють взаємодію між об'єктами
системи під час обробки повідомлень, а також діаграму скінченного автомату, що
відображає потік обробки різних типів повідомлень.
Результати, отримані в цьому розділі, забезпечують системне уявлення про
структуру та поведінку програмного комплексу telegram-бота для збору та аналізу
повідомлень, що є основою для подальшої реалізації програмного забезпечення.
41
ЧДТУ 242240.002ПЗ
РОЗДІЛ 3 РОЗРОБКА ТА ТЕСТУВАННЯ ПРОГРАМНОГО
ЗАБЕЗПЕЧЕННЯ
3.1 Розробка програмного комплексу
Розробка програмного комплексу telegram-бота "Selen" включає такі основні
компоненти:
1. розробку і інтеграцію моделей обробки природних мов: для аналізу
текстових повідомлень, визначення їх тональності, виявлення ключових слів і фраз
були розроблені та інтегровані моделі обробки природної мови на основі
трансформерних архітектур і методів машинного навчання.
2. розробку користувацьких інтерфейсних компонентів: були створені
адаптивні інтерфейси, що враховували різні мовні. Інтерфейси включали
параметри типографічних традицій, вибір в залежності від типу повідомлень для
забезпечення відповідності очікуванням користувачів.
3. впровадження передових підходів до перекладу й локалізації контенту:
для забезпечення кросмовної та крос-культурної адаптації, були розроблені
стратегії перекладу з урахуванням різних лінгвістичних і культурних контекстів.
4. інтеграцію засобів взаємодії людини з комп'ютерними системами: аналіз
комунікативних інтерфейсів для визначення найбільш релевантних способів
представлення інформації користувачам з різними мовними, культурними та
знаннєвими рівнями.
Загалом програмний комплекс був спроектований для забезпечення
інтерактивної та персоналізованої взаємодії з користувачами.
3.1.1 Обґрунтування вибору засобів реалізації
Для написання програмного комплексу було обрано середовище розробки
Visual Studio Code [12]. Цей вибір було зроблено через низку переваг, які він
пропонує:
1 Є крос-платформеним та відкритим середовищем розробки, що підтримує
численні мови програмування, включаючи Python.
42
ЧДТУ 242240.002ПЗ
2 Легка інтеграція з системами контролю версій, такими як Git, забезпечує
зручне керування кодом та співпрацю в команді.
3 Наявність великої кількості розширень та плагінів, розроблених
спільнотою, дозволяє розширити функціональність відповідно до потреб проекту.
4 Зручний інтерфейс, автоматичне доповнення коду, виділення синтаксису
та інструменти для налагодження сприяють підвищенню продуктивності
розробників.
Для розробки telegram-бота "Selen" було обрано мову програмування Python
та фреймворк python-telegram-bot [2].
1 Python є мовою високого рівня з чистим синтаксисом, що робить код
більш читабельним та легким для підтримки. Крім того, Python має багату
екосистему бібліотек та пакунків для різних задач, включаючи машинне навчання,
обробку природньої мови та обробку зображень.
2 Фреймворк python-telegram-bot [2] забезпечує прямий інтерфейс для
взаємодії з Telegram Bot API, спрощуючи створення та керування ботами.
3 Для аналізу тексту використовувалися бібліотеки Hugging Face
Transformers та модель BERT [21], що надають можливості для виконання завдань
аналізу тональності.
4 Для аналізу зображень та відео застосовувалися бібліотеки OpenCV,
Keras та TensorFlow, що дозволяють працювати з моделями машинного навчання
для розпізнавання об'єктів та емоцій.
5 Для зберігання та управління даними було обрано систему керування
базами даних PostgreSQL, яка є потужною, надійною та масштабованою об'єктно-
реляційною СКБД з відкритим вихідним кодом.
6 Візуалізація результатів аналізу здійснювалися за допомогою бібліотеки
Matplotlib, що надає зручні інструменти для різноманітних типів візуалізацій. Має
діаграми графіки, тощо.
7 Для забезпечення можливості переводу голосових повідомлень в такст та
представлення результатів аналізу використовувалася бібліотека
speech_recognition.
43
ЧДТУ 242240.002ПЗ
8 Для завдання розпізнавання автора тексту було обрано підхід, що поєднує
пошук в Інтернеті та використання генеративної моделі мови великих розмірів
(LLM), а саме go-bruins-v2.1.1 [11] яка має відкриму ліцензію, та була самостійно
квантизована для зменшення розміру. Пошук в Інтернеті забезпечує отримання
додаткової інформації та контексту, які можуть допомогти в розпізнаванні автора.
Цей підхід є гнучким та може застосовуватися до різних текстів і авторів.
Вибір цих засобів розробки дозволив оптимізувати процес створення
telegram-бота "Selen", забезпечуючи швидкість розробки, функціональність,
масштабованість, продуктивність та гнучкість для вирішення різноманітних задач
обробки природньої мови, комп'ютерного зору та машинного навчання.
3.1.2 Опис структурної (функціональної) схеми
Діаграма 3.1 - Діаграма структурної схеми telegram бота
Опис діаграми структурної схеми: Ця діаграма відображає основні
структурні компоненти системи та їх взаємозв'язки.
1 Telegram Client: Представляє інтерфейс, через який користувачі
взаємодіють з ботом, надсилаючи повідомлення чи команди.
2 Telegram Bot Server: Цей компонент обробляє вхідні повідомлення та
команди від користувачів. Він містить два основні підкомпоненти:
3 MessageHandler: Відповідає за обробку звичайних текстових
повідомлень.
44
ЧДТУ 242240.002ПЗ
4 CommandHandler: Відповідає за обробку команд, що вводяться
користувачами.
5 DatabaseManager: Цей компонент відповідає за взаємодію з базою
даних, зберігання та отримання даних.
Діаграма 3.2 - Діаграма функціональної схеми telegram бота
Ця діаграма ілюструє основні функціональні компоненти системи та їх
взаємодію.
1 Telegram Client: Представляє інтерфейс, через який користувачі
взаємодіють з ботом, надсилаючи повідомлення чи команди.
2 Telegram Bot Server: Цей компонент обробляє вхідні повідомлення та
команди від користувачів. Він містить два основні підкомпоненти:
45
ЧДТУ 242240.002ПЗ
MessageHandler: Відповідає за обробку текстових повідомлень,
голосових;
CommandHandler: Відповідає за обробку команд, що вводяться
користувачами.
3 Модулі аналізу:
ImageAnalysis: Включає компонент EmotionRecognition для
розпізнавання емоцій на зображеннях;
VideoAnalysis: Містить компонент EmotionDetection для детектування
емоцій у відео;
AudioAnalysis: Має компонент SpeechToText для перетворення аудіо
в текст;
TextAnalysis: Включає компоненти SentimentAnalysis для аналізу
настрою, KeywordExtraction для виділення ключових слів,
PhraseExtraction для виділення фраз, та AuthorRecognition для
розпізнавання авторів текстів.
4 DatabaseManager: Цей компонент відповідає за взаємодію з базою даних,
зберігання та отримання даних.
5 Visualizer: Компонент для створення візуалізацій даних.
6 ModelLoader: Компонент для завантаження моделей машинного
навчання, які використовуються для різних видів аналізу.
Потік даних та взаємодія між компонентами відбувається наступним чином:
1 Користувач взаємодіє з Telegram Client, надсилаючи повідомлення або
команди.
2 Повідомлення/команди передаються до Telegram Bot Server, де
MessageHandler та CommandHandler відповідають за їх обробку.
3 MessageHandler та CommandHandler пересилають повідомлення до
відповідних модулів аналізу (ImageAnalysis, VideoAnalysis, AudioAnalysis або
TextAnalysis) в залежності від типу повідомлення.
4 Модулі аналізу обробляють повідомлення та іноді використовують базу
даних за допомогою DatabaseManager.
46
ЧДТУ 242240.002ПЗ
5 Компонент Visualizer будує візуалізації результатів аналізу.
6 Згенеровані відповіді та візуалізації відправляються назад до Telegram
Bot Server.
7 Telegram Bot Server надсилає відповіді користувачеві через Telegram
Client.
3.1.3 Опис логічної схеми системи
Діаграма 3.3 - Діаграма логічної схеми telegram бота
47
ЧДТУ 242240.002ПЗ
Логічна схема — це графічне представлення процесу або системи, яке
показує взаємозв'язки між різними елементами та етапами. Логічні схеми
використовуються для пояснення, документування або оптимізації процесів,
допомагаючи краще розуміти, як працює система або процес, ідентифікувати
можливі поліпшення чи виявляти проблеми.
Ця логічна схема зображує основні компоненти системи та їхню взаємодію:
1 Користувач надсилає повідомлення або команди через Telegram Client.
2 Telegram Bot Server отримує повідомлення та визначає його тип (команда,
голосове повідомлення, текст, зображення або відео).
3 Залежно від типу повідомлення, Bot Server викликає відповідний модуль
аналізу (ImageAnalysis, VideoAnalysis, AudioAnalysis або TextAnalysis) для обробки
повідомлення.
4 Модулі аналізу можуть взаємодіяти з DatabaseManager для отримання або
зберігання даних та з ModelLoader для завантаження необхідних моделей
машинного навчання.
5 Після обробки модулями аналізу, результати можуть бути передані
Visualizer для створення візуалізацій.
6 Сформована відповідь надсилається через Telegram Bot Server назад до
Telegram Client для відображення користувачеві.
3.1.4 Розробка бази даних
Інфологічне проектування передбачає:
1 Визначення сутностей (об'єктів), які потрібно зберігати в базі даних. У
даному випадку це:
користувач (ідентифікатор, ім'я, нікнейм тощо);
група (ідентифікатор, назва);
повідомлення (ідентифікатор, текст, дата, час, ідентифікатор
користувача, ідентифікатор групи).
2 Визначення зв'язків між сутностями:
користувач належить до групи (зв'язок один-до-багатьох);
48
ЧДТУ 242240.002ПЗ
повідомлення належить користувачу і групі (зв'язки багато-до-
одного);
результати аналізу пов'язані з конкретним набором повідомлень
(зв'язок один-до-багатьох).
3 Встановлення атрибутів (полів) для кожної сутності (користувач, група,
повідомленн).
4 Вибір первинних ключів для однозначної ідентифікації кожного
екземпляра сутності.
5 Побудова ER-діаграми (сутність-зв'язок) для графічного подання
структури бази даних.
Таке інфологічне проектування дозволяє визначити необхідні об'єкти та їх
взаємозв'язки перед реалізацією фізичної бази даних.
Сутності – прямокутники (рисунок 4). Наприклад сутність «user_info» має
атрибути user_id, full_name, username.
Рисунок 3.1 - Інфологічна модель бази даних
49
ЧДТУ 242240.002ПЗ
Датологічне проектування:
Таблиця saved_messages (збережені повідомлення):
1 поле id – айді користувача який відправив повідомлення, вноситься
програмою з update; тип даних – bigint;
2 поле id_group – айді групи з якої надійшло повідомлення, вноситься
програмою з update; тип даних – bigint;
3 поле message – текст повідомлення; тип даних – text;
4 поле date – точний час відправки повідомлення; тип даних – timestamp
with time zone;
5 поле sticker_id – якщо повідомлення це стікер, в полі додається його айді,
якщо ні, поле пусте; тип даних – text;
Таблиця users_info (Інформація про користувачів):
1 поле user_id – унікальне число, яке прив`язане до кожного користувача
індивідуально; тип даних – bigint;
2 поле full_name – повне ім`я користувача, тобто його ім`я та прізвище, яке
вказане в месенджері; тип даних – character varying;
3 поле username – логін користувача; тип даних – character varying;
Таблиця groups_settings (Налаштування груп):
1 поле group_id – це айді групи яке є унікальним; тип даних – bigint;
2 поле language – визначається по замовчуванню як UA але може бути
вибрана користувачами групи, поле визначає якою мовою бот буде відправляти
повідомлення; тип даних – text;
3 поле speech_to_text – визначає чи буде бот автоматично перетворювати
голосові повідомлення в текст, за замовчуванням вказується false; тип даних –
boolean;
Така структура дозволяє зручно зберігати, записувати, витягувати данні про
повідомлення, користувачів, та групи.
Схема і об’єкти бази даних:
Перетворюємо інфологічну модель у схему. Схема бази даних показана на
рисунку 5.
50
ЧДТУ 242240.002ПЗ
Рисунок 3.2 – Структура бази даних
Таблиці
Нижче наведені рисунки таблиць з наповненими даними.
SAVED_MESSAGES
Рисунок 3.3 – Таблиця збережених повідомлень
51
ЧДТУ 242240.002ПЗ
GROUPS_SETTINGS
Рисунок 3.4 – Таблиця налаштувань груп
USERS_INFO
Рисунок 3.5 – Таблиця інформації про користувачів
3.1.5 Розробка інтерфейсу користувача
Інтерфейс користувача для даного telegram-бота реалізований безпосередньо
в месенджері Telegram. Користувачі можуть взаємодіяти з ботом через звичайний
чат, надсилаючи текстові повідомлення, голосові повідомлення, зображення, відео
та інші типи даних, підтримувані Telegram.
Основні елементи інтерфейсу користувача:
1 Команди - бот підтримує наступні команди, які користувачі можуть
вводити в чаті:
/start - Запустити бота та отримати вітальне повідомлення;
/help - Отримати інформацію про доступні команди та функції бота;
52
ЧДТУ 242240.002ПЗ
/analyze - Проаналізувати повідомлення користувача або групи;
/recognize_author - Спробувати визначити автора тексту за допомогою
моделі машинного навчання;
/daily_stats - Отримати статистику повідомлень у групі за поточний
день;
/my_stats - Отримати статистику повідомлень користувача в групі;
/group_stats - Отримати загальну статистику повідомлень у групі;
/language - Змінити мову інтерфейсу бота;
/voice_to_text - Увімкнути або вимкнути автоматичне перетворення
голосових повідомлень у текст;
Рисунок 3.6 - Приклад використання команди /start
2 Кнопки - бот також використовує кнопки для взаємодії з користувачами.
Наприклад, після введення команди /language користувачам буде запропоновано
вибрати потрібну мову, натиснувши відповідну кнопку з емодзі.
Рисунок 3.7 - Приклад використання кнопок для вибору мови
53
ЧДТУ 242240.002ПЗ
3 Відповіді бота - бот відповідає на повідомлення користувачів,
надсилаючи текстові повідомлення, зображення, графіки або анімації. Відповіді
генеруються на основі результатів аналізу повідомлень та налаштувань
користувача. Для відповіді з відео використовується завантажений шрифт Roboto
[10].
Рисунок 3.8 - Приклад відповіді бота з текстовим повідомленням
(розпізнаним автором)
Рисунок 3.9 - Приклад відповіді бота з графіком
Рисунок 3.10 - Приклад відповіді бота з анімацією
54
ЧДТУ 242240.002ПЗ
Загалом, інтерфейс користувача telegram-бота є інтуїтивним та зрозумілим,
оскільки він ґрунтується на стандартному інтерфейсі Telegram. Користувачі
можуть легко взаємодіяти з ботом, використовуючи звичні для них команди,
кнопки та типи повідомлень.
3.1.6 Опис розробки програмних компонентів
Розроблений програмний комплекс telegram-бота складається з таких
основних компонентів:
Модуль взаємодії з Telegram Bot API, реалізований за допомогою бібліотеки
python-telegram-bot [2]:
Призначення: Забезпечує взаємодію з Telegram Bot API та обробку вхідних
повідомлень і команд від користувачів.
Зв'язки з іншими компонентами: Взаємодіє з модулями обробки повідомлень,
аналізу тексту, зображень та відео, а також з модулями бази даних, візуалізації для
передачі та отримання даних.
Реалізація:
1 Використовується бібліотека python-telegram-bot [2] для інтеграції з
Telegram Bot API.
2 Виконується ініціалізація об'єкту бота та під'єднання до Telegram Bot API.
3 Реєструються обробники команд та повідомлень від користувачів за
допомогою класів CommandHandler та MessageHandler.
4 Встановлюються налаштування обробки вхідних оновлень від Telegram
API.
5 Забезпечується відправка відповідей та повідомлень користувачам через
методи send_message, send_photo, send_video, send_animation тощо.
Фрагмент коду:
from telegram.ext import Application, CommandHandler, MessageHandler, filters,
CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
# Ініціалізація об'єкту бота
application =
Application.builder().concurrent_updates(True).read_timeout(50).write_timeout(50).
connect_timeout(50).token("BOT_TOKEN").build()
55
ЧДТУ 242240.002ПЗ
# Реєстрація обробників команд
application.add_handler(CommandHandler("start", command_start))
application.add_handler(CommandHandler("help", command_help))
application.add_handler(CommandHandler("analyze", command_analyze))
# ... інші команди
# Реєстрація обробника повідомлень
application.add_handler(MessageHandler(filters.ALL, message_format))
# Реєстрація обробника вибору мови
application.add_handler(CallbackQueryHandler(button_handler))
# Запуск бота
application.run_polling(timeout=50)
Модуль обробки повідомлень:
Призначення: Забезпечує обробку вхідних повідомлень від користувачів,
включаючи текстові повідомлення, голосові повідомлення, зображення та відео.
Зв'язки з іншими компонентами: Взаємодіє з модулями аналізу тексту,
зображень, відео та аудіо, а також з модулем бази даних для зберігання метаданих
повідомлень.
Реалізація:
1 Отримуються вхідні повідомлення від Telegram Bot API.
2 Перетворення голосових повідомлень у текст за допомогою бібліотеки
speech_recognition [26] та функції google_speech_to_text.
3 Якщо в повідомленні було написано "rate", проходить обробка для
ідентифікації зображення чи відео, на яке посилається користувач.
4 Якщо знайдено зображення, викликається модуль аналізу зображень
через функцію predict_image.
5 Якщо знайдено відео, викликається модуль аналізу відео через функцію
predict_video.
6 Зберігаються метадані повідомлень (текст, дата, час, ідентифікатори
користувача та чату) у базі даних.
Фрагмент коду:
async def message_format(update, context):
if update.message:
# Зберігання метаданих повідомлення в базі даних
conn = await database_get_connection()
cursor = conn.cursor()
# ... збереження даних
conn.commit()
conn.close()
56
ЧДТУ 242240.002ПЗ
text = update.message.text.lower() if update.message.text else
update.message.caption.lower()
if "rate" in text:
Is_Rate = True
# ... обробка повідомлення
if Is_Image:
await predict_image(update, context, image_buffer.getvalue())
else:
await predict_video(update, context, curr_file_path)
async def voice_message_to_text(update, context):
# Перетворення голосового повідомлення в текст
file = await context.bot.getFile(update.message.voice.file_id)
file_content = await file.download_as_bytearray()
# ... обробка аудіо файлу
text = google_speech_to_text(file_path, recognized_language)
if text:
await context.bot.send_message(chat_id=update.message.chat_id, text=text)
Модуль аналізу тексту:
Призначення: Виконує різні види аналізу текстових повідомлень, такі як
аналіз тональності, виділення ключових слів і фраз, а також розпізнавання авторів
текстів. Зв'язки з іншими компонентами: Взаємодіє з модулем бази даних для
отримання текстових повідомлень та великої мовної моделі (LLM) [23] для
розпізнавання авторів.
Реалізація:
1 Вилучаються тексти повідомлень з бази даних.
2 Виконується аналіз тональності (позитивний, негативний, нейтральний)
повідомлень з використанням BERT-моделі rubert-base-cased-sentiment-rusentiment
[30] з бібліотеки Hugging Face Transformers.
3 Визначаються ключові слова та фрази у повідомленнях.
4 Для розпізнавання авторів текстів використовується підхід, що поєднує
пошук в Інтернеті та застосування генеративної моделі мови великих розмірів
(LLM) go-bruins-v2.1.1 [11].
Фрагмент коду:
from transformers import AutoModelForSequenceClassification, BertTokenizerFast,
softmax
tokenizer = BertTokenizerFast.from_pretrained('blanchefort/rubert-base-cased-
sentiment-rusentiment')
model = AutoModelForSequenceClassification.from_pretrained('blanchefort/rubert-
base-cased-sentiment-rusentiment', return_dict=True)
def analyze_sentiment(messages):
batch_size = 200
57
ЧДТУ 242240.002ПЗ
total_sum = [0] * model.config.num_labels
for start_index in range(0, len(messages), batch_size):
batch_messages = messages[start_index:start_index+batch_size]
inputs = tokenizer(batch_messages, max_length=244, padding=True,
truncation=True, return_tensors='pt')
outputs = model(**inputs)
predicted = softmax(outputs.logits, dim=1)
predicted_sum = predicted.sum(dim=0).tolist()
total_sum = [x + y for x, y in zip(total_sum, predicted_sum)]
predicted_avg = [x / len(messages) for x in total_sum]
labels = ['negative', 'neutral', 'positive']
sentiment_scores = {label: score for label, score in zip(labels,
predicted_avg)}
return sentiment_scores
Модуль аналізу зображень:
Призначення: Виконує розпізнавання емоцій на зображеннях за допомогою
моделей машинного навчання.
Зв'язки з іншими компонентами: Взаємодіє з модулем обробки повідомлень
для отримання зображень, а також з модулем завантаження моделей для
завантаження необхідних моделей машинного навчання.
Реалізація:
1 Отримується зображення від модуля обробки повідомлень.
2 Зображення передобробляється (ресайз, нормалізація тощо) для подачі на
вхід моделі за допомогою бібліотек numpy [24], transformers [27], тощо.
3 Завантажується модель машинного навчання для розпізнавання емоцій на
зображеннях, навчена власноруч.
4 Виконується передбачення емоцій на зображенні за допомогою
завантаженої моделі.
5 Результати розпізнавання емоцій повертаються до модуля обробки
повідомлень для формування відповіді користувачеві.
Фрагмент коду:
async def predict_image(update, context, file):
output = ""
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
image = imdecode(np.frombuffer(file, np.uint8), IMREAD_COLOR)
size = (224, 224)
image = resize(image, dsize=size, interpolation=INTER_LANCZOS4)
image_array = np.asarray(image)
normalized_image_array = preprocess_input(image_array)
data[0] = normalized_image_array
# Завантаження моделі
model = load_model("models/model_EfficientNetV2B3-freeze210.h5",
compile=False)
58
ЧДТУ 242240.002ПЗ
prediction = model.predict(data, verbose=0)
index = np.argmax(prediction)
class_name = class_names[index]
output = translations['function_predict_image'][language]['MainOutput']
# Формування відповіді з результатами розпізнавання емоцій
class_predictions = [(class_names[i][2:].strip(), prediction[0][i]) for i in
range(len(prediction[0]))]
class_predictions.sort(key=lambda x: x[1], reverse=True)
for class_name, pred_value in class_predictions:
if pred_value > 0.1:
output += f"{class_name}: [{round(pred_value*100, 2)}%]\n"
await context.bot.send_message(chat_id=update.message.chat_id, text=output)
Модуль аналізу відео:
Призначення: Виконує розпізнавання емоцій на відео за допомогою моделей
машинного навчання та створює анімовані відео з візуалізацією результатів.
Зв'язки з іншими компонентами: Взаємодіє з модулем обробки повідомлень
для отримання відео, а також з модулем завантаження моделей для завантаження
необхідних моделей машинного навчання.
Реалізація:
1 Отримується відео від модуля обробки повідомлень.
2 Завантажується модель машинного навчання для розпізнавання емоцій на
фото.
3 Відео розбивається на окремі кадри, для кожного кадру виконується
передбачення емоцій за допомогою завантаженої моделі.
4 На кожен кадр додається візуалізація результатів розпізнавання емоцій
(назва емоції, смужка впевненості в ній).
5 Кадри з візуалізацією об'єднуються в GIF якщо відео не мало звуку або
MP4 якщо був, за допомогою витягування інформації бібліотекою pymediainfo [25]
з відео.
6 Анімоване відео з візуалізацією результатів розпізнавання емоцій
повертається до модуля обробки повідомлень для відправки користувачеві.
Фрагмент коду:
async def predict_video(update, context, path):
await context.bot.send_chat_action(chat_id=update.message.chat_id,
action='upload_video')
has_audio = any([track.track_type == 'Audio' for track in
MediaInfo.parse(path).tracks])
59
ЧДТУ 242240.002ПЗ
clip = VideoCapture(path)
fps = int(clip.get(CAP_PROP_FPS))
# Завантаження моделі
model = load_model("models/model_EfficientNetV2B3-freeze210.h5",
compile=False)
# Розбиття відео на кадри та розпізнавання емоцій
emotion_frames = []
while True:
ret, frame = clip.read()
if not ret:
break
image = cvtColor(frame, COLOR_BGR2RGB)
image = resize(image, dsize=(224, 224), interpolation=INTER_LANCZOS4)
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
data[0] = preprocess_input(np.asarray(image))
prediction = model.predict(data, verbose=0)
index = np.argmax(prediction)
class_name = class_names[index]
# Додавання візуалізації результатів на кадр
pil_image = Image.fromarray(image)
draw = ImageDraw.Draw(pil_image)
text = class_name[2:].strip()
draw.text((10, 10), text, font=font, fill=(255, 145, 0))
image = np.asarray(pil_image)
# Створення анімованого відео
with suppress_stdout():
clip = ImageSequenceClip(emotion_frames, fps=fps)
if has_audio:
audio = AudioFileClip(path)
clip = clip.set_audio(audio)
clip.write_videofile('W:\\output.mp4', codec='libx264', verbose=False,
temp_audiofile='W:\\temp-audio.mp3')
# Відправка анімованого відео користувачеві
with open('W:\\output.mp4', 'rb') as video_file:
if has_audio:
await context.bot.send_video(chat_id=update.message.chat_id,
video=video_file, filename='output.mp4')
else:
await context.bot.send_animation(chat_id=update.message.chat_id,
animation=video_file, filename='output.mp4')
Модуль візуалізації:
Призначення: Створення візуальних представлень даних, таких як графіки та
діаграми, на основі статистичних даних, отриманих з бази даних.
Зв'язки з іншими компонентами: Взаємодіє з модулем бази даних для
отримання необхідних даних та з модулем обробки повідомлень для відправки
згенерованих візуалізацій.
Реалізація: Використовується бібліотека matplotlib для побудови графіка.
Дані отримуються з бази даних за допомогою SQL-запитів. Згенеровані зображення
передаються до модуля обробки повідомлень для відправки користувачам.
60
ЧДТУ 242240.002ПЗ
Фрагмент коду:
async def command_get_user_stats(update, context):
chat_id = update.effective_chat.id
user_id = update.effective_user.id
full_name =
f"{update.effective_user.first_name}{update.effective_user.last_name or ''}"
decoded_full_name = await custom_unidecode(full_name)
conn = await database_get_connection()
cursor = conn.cursor()
query = f"SELECT date, message FROM public.saved_messages WHERE id_group =
{chat_id} AND id = {user_id}"
cursor.execute(query)
data = cursor.fetchall()
conn.close()
message_count = defaultdict(int)
for row in data:
date = row[0].date()
message_count[date] += 1
dates = list(message_count.keys())
time_range = max(dates) - min(dates)
if time_range.days <= 31:
x_data = [date.strftime('%m-%d') for date in dates]
y_data = [message_count[date] for date in dates]
else:
grouped_data = defaultdict(int)
for date, count in message_count.items():
month = date.replace(day=1)
grouped_data[month.strftime('%Y-%m')] += count
x_data = [date for date in grouped_data.keys()]
y_data = [grouped_data[month] for month in x_data]
plt.clf()
plt.bar(x_data, y_data)
plt.title(f"Статистика повідомлень користувача {decoded_full_name}")
plt.xlabel("Дата")
plt.ylabel("Кількість повідомлень")
buffer = BytesIO()
plt.savefig(buffer, format="png")
buffer.seek(0)
await context.bot.send_photo(chat_id=update.effective_chat.id, photo=buffer)
Модуль бази даних:
Призначення: Забезпечення зберігання та управління даними про
користувачів, групи, повідомлення та результати аналізу в базі даних.
Зв'язки з іншими компонентами: Взаємодіє з модулем обробки повідомлень
для збереження метаданих повідомлень, а також з модулями візуалізації та
управління налаштуваннями для отримання необхідних даних.
61
ЧДТУ 242240.002ПЗ
Реалізація:
1 Використовується система управління базами даних PostgreSQL, та
бібліотека psycopg2 [8].
2 Модуль містить функції для встановлення з'єднання з базою даних,
виконання SQL-запитів (вставки, оновлення, вибірки) та отримання результатів.
3 Структура бази даних включає таблиці для збереження інформації про
користувачів, групи, повідомлення, налаштування груп та результати аналізу.
Фрагмент коду:
async def database_get_connection():
conn = connect(conn_data)
return conn
async def database_execute_query(conn, query, params=None):
with conn.cursor() as cur:
cur.execute(query, params)
return cur.fetchall()
Модуль управління командами та налаштуваннями:
Призначення: Обробка команд, що надсилаються користувачами через
Telegram, таких як /start, /help, /analyze, /recognize_author тощо, а також управління
налаштуваннями бота.
Зв'язки з іншими компонентами: Взаємодіє з модулем взаємодії з Telegram
Bot API для отримання команд від користувачів та з модулем бази даних для
збереження та отримання налаштувань груп.
Реалізація:
1 Використовуються обробники команд (CommandHandler) з бібліотеки
python-telegram-bot.
2 Для кожної команди реалізована відповідна функція обробки, яка виконує
необхідні дії (наприклад, відправка вітального повідомлення, зміна налаштувань,
запуск аналізу тощо).
3 Налаштування груп зберігаються в базі даних та оновлюються при зміні
користувачами.
Фрагмент коду:
async def set_language(update):
conn = await database_get_connection()
cursor = conn.cursor()
query = f"SELECT language FROM groups_settings WHERE group_id =
{update.message.chat_id}"
62
ЧДТУ 242240.002ПЗ
cursor.execute(query)
result = cursor.fetchone()
global class_names
global language
if result is not None:
language = result[0]
else:
language = ''
insert_query = f"INSERT INTO groups_settings (group_id, language) VALUES
({update.message.chat_id}, '{language}')"
cursor.execute(insert_query)
conn.commit()
def main() -> None:
application =
Application.builder().concurrent_updates(True).read_timeout(50).write_timeout(50).
connect_timeout(50).token("6767138786:AAEAkjT3A8vGXZsUxPE6t_dn8ViIgGlfIr0").build(
)
application.add_handler(CommandHandler("start", command_start))
application.add_handler(CommandHandler("help", command_help))
application.add_handler(CommandHandler("analyze", command_analyze))
application.add_handler(CommandHandler("recognize_author",
command_recognize_author))
application.add_handler(CommandHandler('daily_stats', command_daily_stats))
application.add_handler(CommandHandler("my_stats", command_get_user_stats))
application.add_handler(CommandHandler("group_stats",
command_get_group_stats))
application.add_handler(CommandHandler("language", command_language))
application.add_handler(CommandHandler("voice_to_text",
command_set_voice_to_text))
application.add_handler(MessageHandler(filters.VOICE, voice_message_to_text))
application.add_handler(MessageHandler(filters.ALL, message_format))
application.add_handler(CallbackQueryHandler(button_handler))
application.run_polling(timeout=50)
if __name__ == "__main__":
main()
Взаємодія між модулями:
1 Модуль взаємодії з Telegram Bot API отримує повідомлення та команди
від користувачів через Telegram.
2 Модуль обробки повідомлень виконує необхідну передобробку
(наприклад, перетворення голосових повідомлень у текст) та зберігає метадані
повідомлень (текст, дата, час, ідентифікатори користувача та чату) у базі даних за
допомогою модуля бази даних.
3 Для текстових повідомлень модуль обробки повідомлень викликає
модуль аналізу тексту для виконання різних видів аналізу природної мови.
Результати аналізу зберігаються в базі даних через модуль бази даних.
63
ЧДТУ 242240.002ПЗ
4 Для зображень, відео та аудіо модуль обробки повідомлень викликає
відповідні модулі аналізу (зображень, відео, аудіо), які використовують моделі
машинного навчання, завантажені модулем завантаження моделей. Результати
аналізу також зберігаються в базі даних.
5 Модуль візуалізації отримує необхідні дані з бази даних через модуль
бази даних та будує візуальні представлення (графіки, діаграми) на їх основі.
6 Модуль управління командами та налаштуваннями обробляє команди
користувачів, такі як зміна мови інтерфейсу або параметрів аналізу. Налаштування
груп зберігаються та оновлюються в базі даних через модуль бази даних.
7 Модуль перекладу використовується для перекладу текстових
повідомлень або результатів аналізу на вибрану мову, якщо це необхідно. Він
взаємодіє з модулем бази даних для отримання поточних налаштувань мови для
групи.
8 Згенеровані відповіді, візуалізації та переклади передаються до модуля
взаємодії з Telegram Bot API для відправки користувачам через інтерфейс Telegram.
Таким чином, модуль бази даних є центральним компонентом, який
забезпечує зберігання та обмін даними між різними модулями програмного
комплексу, сприяючи їх ефективній взаємодії та функціонуванню.
3.2 Тестування системи
Тестування є критично важливим етапом у розробці програмного
забезпечення, оскільки воно забезпечує перевірку коректної роботи системи,
відповідність встановленим вимогам та специфікаціям, а також виявлення та
усунення можливих дефектів і помилок.
У розробці telegram-бота "Selen" було проведено ретельне тестування на
різних рівнях, включаючи модульне тестування, інтеграційне тестування, системне
тестування та приймальне тестування. Ці види тестування охоплювали перевірку
окремих модулів, їх інтеграції, а також функціонування всієї системи в цілому.
Метою тестування було забезпечити високу якість і надійність програмного
комплексу, перевірити коректність обробки різних типів повідомлень (текстових,
64
ЧДТУ 242240.002ПЗ
голосових, зображень, відео), правильність аналізу тексту та мультимедійних
даних, а також взаємодію з базами даних, сторонніми сервісами та моделями
машинного навчання.
Для проведення тестування були розроблені спеціальні тестові сценарії, що
імітували різні ситуації використання бота та перевіряли його поведінку в різних
умовах. Тестування проводилося з використанням автоматизованих інструментів
та фреймворків для забезпечення ефективності та повторюваності процесу.
Результати тестування дозволили виявити та усунути недоліки на ранніх
стадіях розробки, підвищити якість програмного забезпечення та підтвердити його
готовність до впровадження та експлуатації кінцевими користувачами.
3.2.1 Модульне тестування
Модульне тестування - це процес перевірки окремих програмних модулів,
процедур і підпрограм, що входять до складу програмного комплексу. Метою
модульного тестування є перевірка внутрішніх структур і потоків даних у кожному
окремому модулі.
Для модульного тестування бота "Selen" було розроблено автоматизований
тест з використанням модуля unittest [20] в Python. Тест імітує взаємодію з Telegram
Bot API та перевіряє коректність роботи окремих функцій і обробників команд
бота.
Тестовий сценарій модульного тестування включає:
1 Тестування модуля взаємодії з Telegram Bot API:
Перевірка коректної обробки команд /start, /help
Тестування функцій відправки повідомлень, зображень та відео
2 Тестування модуля обробки повідомлень:
Перевірка функції message_format для обробки вхідних повідомлень
Тестування функції voice_message_to_text для перетворення
голосових повідомлень у текст
3 Тестування модуля аналізу тексту:
65
ЧДТУ 242240.002ПЗ
Перевірка функції command_analyze для аналізу текстових
повідомлень
Тестування функції command_recognize_author для розпізнавання
авторів текстів
4 Тестування модуля аналізу зображень:
Перевірка функції predict_image для розпізнавання емоцій на
зображеннях
5 Тестування модуля аналізу відео:
Перевірка функції predict_video для розпізнавання емоцій на відео
6 Тестування модуля візуалізації:
Перевірка функцій command_daily_stats, command_get_user_stats та
command_get_group_stats для генерації статистики
7 Тестування модуля роботи з базою даних:
Перевірка функцій database_get_connection та database_execute_query
для взаємодії з базою даних
8 Тестування модуля управління налаштуваннями:
Перевірка функцій command_language та button_handler для зміни
мови інтерфейсу
Модульне тестування проводилося розробником безпосередньо під час етапу
розробки, що дозволило виявити та усунути помилки на ранніх стадіях для
забезпечення коректної роботи окремих модулів бота.
Приклад коду модульного тесту наведений в додатку д, а результати його
виконання показані на рисунку 3.11. Також тест-кейси цього тестування
знаходяться на таблиці 3.1
Рисунок 3.11 – Вивід тестувальної програми після завершення роботи
66
ЧДТУ 242240.002ПЗ
Таблиця 3.1
Тест-кейси модульного тестування
№ Опис Передумови Кроки для Очікуваний Результ
Тест відтворен результат ат
- ня
кейс
а
1 Перевірка Функція Викликати Функція повинна Пройшо
коректної command_start функцію відправити в
обробки завантажена command_ вітальне
команди /start start повідомлення та
інструкції
2 Перевірка Функція Викликати Функція повинна Пройшо
коректної command_help функцію відправити в
обробки завантажена command_ допоміжне
команди /help help повідомлення з
описом основних
команд
3 Перевірка Функція 1. Надати Функція повинна Пройшо
функції command_anal тестовий проаналізувати в
command_anal yze текст 2. текст та
yze завантажена Викликати відправити
функцію статистику
command_ використаних
analyze слів та
емоційний
контекст
67
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.1
4 Перевірка Функція Надати Функція Пройшо
функції predict_image тестове повинна в
predict_image завантажена зображенн розпізнати
я та зображення та
викликати відправити
функцію результати
predict_ima аналізу
ge
5 Перевірка Функція Надати Функція Пройшо
функції predict_video тестове повинна в
predict_video завантажена відео та розпізнати
викликати відео та
функцію відправити
predict_vid результати
eo аналізу
6 Перевірка Функція Викликати Функція
функції command_get_u функцію повинна
command_get_ ser_stats command_ згенерувати та
user_stats завантажена, є get_user_st відправити
збережені ats графік зі
повідомлення в статистикою
базі даних повідомлень
користувачакор
истувача
68
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.1
7 Перевірка Функція Викликати Функція
функції command_get функцію повинна
command_get_ _group_stats command_get_ згенерувати та
group_stats завантажена, group_stats відправити
є збережені графік зі
повідомленн статистикою
я в базі даних повідомлень
групи
8 Перевірка Функція Викликати Функція Пройш
функції command_dai функцію повинна ов
command_dail ly_stats command_dail проаналізувати
y_stats завантажена, y_stats щоденні
є збережені повідомлення
повідомленн та відправити
я в базі даних результати
9 Перевірка Функція Надати Функція Пройш
функції command_rec тестовий текст повинна ов
command_reco ognize_author та викликати визначити
gnize_author завантажена функцію ймовірного
command_reco автора тексту та
gnize_author відправити
його ім'я
10 Перевірка Функція Надати Функція Пройш
обробки voice_messag голосове повинна ов
голосових e_to_text повідомлення розпізнати
повідомлень завантажена та викликати голосове
функцію повідомлення
voice_message та відправити
_to_text текстову версію
69
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.1
11 Перевірка Функції 1. Надіслати Функції Пройшо
функцій database_get_c тестові повинні в
бази даних onnection та повідомлення 2. встановити
database_execu Викликати функції з'єднання з
te_query database_get_conne базою
завантажені, ction та даних та
налаштована database_execute_q зберегти
база даних uery надіслані
повідомлен
ня
12 Перевірка Функція Викликати Функція Пройшо
функції button_handler функцію повинна в
button_han завантажена button_handler з змінити
dler тестовими даними мову
відповідно
до вибору
3.2.2 Інтеграційне тестування
Метою інтеграційного тестування є перевірка коректної взаємодії та
інтеграції різних функціональних модулів бота "Selen" і забезпечення їхньої
сумісної роботи як єдиного програмного комплексу.
На цьому етапі тестувалася інтеграція ключових компонентів, зокрема
модуля взаємодії з Telegram Bot API, модуля обробки повідомлень, модулів аналізу
тексту, зображень та відео, модуля візуалізації, модуля роботи з базами даних та
модуля управління налаштуваннями.
Для інтеграційного тестування telegram-бота "Selen" було розроблено
спеціальний тест, що перевіряє правильну інтеграцію та взаємодію різних функцій
70
ЧДТУ 242240.002ПЗ
бота за допомогою мокування залежностей. Для кожної основної команди бота
створено окремий тест-кейс.
Тестовий сценарій інтеграційного тестування включає:
1 Коректна обробка основних команд бота, таких як /start, /help, /analyze,
/recognize_author та інших.
2 Правильна інтеграція модулів аналізу тексту, зображень та відео з
модулем обробки повідомлень та модулем взаємодії з Telegram Bot API.
3 Взаємодія модуля візуалізації з модулем бази даних для отримання
необхідних статистичних даних.
4 Інтеграція модуля управління налаштуваннями з модулем бази даних для
зберігання та зміни налаштувань груп та користувачів.
5 Коректне функціонування модуля перетворення голосових повідомлень у
текст та його інтеграція з модулем обробки повідомлень.
Інтеграційне тестування проводилось після завершення модульного
тестування окремих компонентів. Код інтеграційного тесту наведені в додатку д,
результати його виконання наведені на рисунку 3.12. Тест кейси тестування
наведені на таблиці 3.2.
Рисунок 3.12 – Вивід терміналу про результати інтеграційного тестування
Таблиця 3.2
Тест-кейси інтеграційного тестування
№ Опис Передумов Кроки для Очікуваний Результат
Тест и відтворення результат
-
кейс
а
71
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.2
1 Перевірка інтеграції Запуск Надіслати Бот повинен Пройшов
модуля обробки тестового команду відправити
повідомлень, модуля середовища /start вітальне
взаємодії з Telegram повідомлення
Bot API та модуля та інструкції
управління
налаштуваннями при
обробці команди
/start
2 Перевірка інтеграції Запуск Надіслати Бот повинен Пройшов
модуля обробки тестового команду відправити
повідомлень, модуля середовища /help допоміжне
взаємодії з Telegram повідомлення
Bot API та модуля з описом
управління основних
налаштуваннями при команд
обробці команди
/help
3 Перевірка інтеграції Запуск Надіслати Бот повинен Пройшов
модуля обробки тестового команду виконати
повідомлень, модуля середовища /analyze аналіз
аналізу тексту, повідомлень
модуля взаємодії з користувача
Telegram Bot API та та надати
модуля управління статистику
налаштуваннями при
обробці команди
/analyze
72
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.2
4 Перевірка Запуск Надіслати Бот повинен Пройшов
інтеграції тестового команду спробувати
модуля обробки середовища /recognize_author визначити
повідомлень, з текстовим автора
модуля аналізу фрагментом наданого
тексту, модуля текстового
взаємодії з фрагменту
Telegram Bot
API та модуля
управління
налаштуваннями
при обробці
команди
/recognize_author
5 Перевірка Запуск Надіслати Бот повинен Пройшов
інтеграції тестового команду надати
модуля середовища /daily_stats статистику
візуалізації, повідомлень
модуля бази за поточний
даних, модуля день у групі
взаємодії з
Telegram Bot
API та модуля
управління
налаштуваннями
при обробці
команди
/daily_stats
73
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.2
6 Перевірка інтеграції Запуск Надіслати Бот повинен Пройшов
модуля візуалізації, тестового команду надати
модуля бази даних, середовища /my_stats статистику
модуля взаємодії з повідомлень
Telegram Bot API та користувача
модуля управління у групі
налаштуваннями
при обробці
команди /my_stats
7 Перевірка інтеграції Запуск Надіслати Бот повинен Пройшов
модуля візуалізації, тестового команду надати
модуля бази даних, середовища /group_stats загальну
модуля взаємодії з статистику
Telegram Bot API та повідомлень
модуля управління у групі
налаштуваннями
при обробці
команди
/group_stats
8 Перевірка інтеграції Запуск Надіслати Бот повинен Пройшов
модуля управління тестового команду надіслати
налаштуваннями, середовища /language повідомлення
модуля бази даних для вибору
та модуля взаємодії мови
з Telegram Bot API інтерфейсу
при обробці
команди /language
74
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.2
9 Перевірка Запуск Надіслати Бот повинен Пройшов
інтеграції модуля тестового команду змінити
управління середовища /voice_to_text налаштування
налаштуваннями, перетворення
модуля бази голосових
даних та модуля повідомлень у
взаємодії з текст
Telegram Bot API
при обробці
команди
/voice_to_text
10 Перевірка Запуск Надіслати Бот повинен Пройшов
інтеграції модуля тестового голосове перетворити
обробки середовища, повідомлення голосове
повідомлень, налаштування повідомлення
модуля перетворення у текст та
перетворення голосових надіслати
голосових повідомлень його
повідомлень у увімкнено
текст та модуля
взаємодії з
Telegram Bot API
при обробці
голосових
повідомлень
75
ЧДТУ 242240.002ПЗ
3.2.3 Системне тестування
Системне тестування призначене для перевірки коректності функціонування
програмного комплексу telegram-бота "Selen" у цілому на відповідність
специфікаціям вимог.
Для системного тестування було розроблено спеціальний тест, який імітує
реальні сценарії використання бота та перевіряє інтеграцію різних компонентів
системи, таких як взаємодія з базою даних, обробка команд, голосових
повідомлень, кнопок, аналіз тексту та відео, а також інтеграцію із зовнішніми
сервісами. Перевірялася здатність системи коректно обробляти ці ситуації,
відновлювати роботу та зберігати цілісність даних. Перевірялась корректна
обробка різних видів взаємодії системи з користувачем.
Тестовий сценарій системного тестування включає:
1 Налаштування тестового середовища та підготовка мок-об'єктів для
імітації взаємодії з Telegram Bot API, базою даних та іншими залежностями.
2 Перевірка коректної обробки основних команд бота, таких як /start, /help,
/analyze, /stats, /settings тощо.
3 Тестування функціональності аналізу тексту, визначення тональності
повідомлень та розпізнавання авторів.
4 Валідація функцій розпізнавання емоцій на зображеннях та відео з
використанням моделей машинного навчання.
5 Перевірка функцій роботи з базою даних, включаючи збереження,
вибірку та обробку даних.
6 Тестування інтеграції з зовнішніми сервісами, такими як моделі обробки
природної мови та перетворення голосу в текст.
7 Перевірка функцій налаштування мови інтерфейсу, перемикання між
режимами та інших параметрів бота.
Системне тестування проводилось після успішного завершення
інтеграційного тестування.
Код системного тесту та результати його виконання наведені в додатку д.
Тест кейси тестування наведені в таблиці 3.3.
76
ЧДТУ 242240.002ПЗ
Таблиця 3.3
Тест-кейси системного тестування
№ Опис Передумов Кроки для Очікуваний Результа
Тест и відтворення результат т
-
кейс
а
1 Перевірка Запуск Надіслати Бот повинен Пройшо
коректної тестового команду відправити вітальне в
обробки середовищ /start повідомлення та
команди /start а інструкції
2 Перевірка Запуск Надіслати Бот повинен Пройшо
коректної тестового команду відправити в
обробки середовищ /help допоміжне
команди /help а повідомлення з
описом основних
команд
3 Перевірка Запуск Надіслати Повинен Пройшо
коректної тестового команду проаналізувати в
обробки середовищ /analyze збережені
команди а, наявні повідомлення
/analyze збережені користувача,
повідомле відправити
ння результати.
4 Перевірка Запуск Надіслати Бот повинен Пройшо
коректної тестового команду визначити в
обробки середовищ /recognize_a ймовірного автора
команди а uthor разом наданого тексту та
/recognize_au з текстовим відправити його ім'я
thor уривком
77
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.3
5 Перевірка Запуск Надіслати Бот повинен Пройшов
коректної тестового команду згенерувати
обробки середовища, /daily_stats та
команди наявні відправити
/daily_stats збережені статистику
повідомлення повідомлень
за поточний за поточний
день день
6 Перевірка Запуск Надіслати Бот повинен Пройшов
коректної тестового команду згенерувати
обробки середовища, /my_stats та
команди наявні відправити
/my_stats збережені статистику
повідомлення повідомлень
користувача користувача
7 Перевірка Запуск Надіслати Бот повинен Пройшов
коректної тестового команду згенерувати
обробки середовища, /group_stats та
команди наявні відправити
/group_stats збережені статистику
повідомлення повідомлень
в групі групи
8 Перевірка Запуск Надіслати Бот повинен Пройшов
коректної тестового команду відправити
обробки середовища /language кнопки для
команди вибору мови
/language
78
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.3
9 Перевірка Запуск Надіслати голосове Бот повинен Пройшов
коректної тестового повідомлення розпізнати та
обробки середовища, відправити
голосових функція текст
повідомлень голосового голосового
розпізнавання повідомлення
увімкнена
10 Перевірка Запуск Надіслати Бот повинен Пройшов
коректної тестового зображення розпізнати та
обробки середовища описати зміст
зображень зображення
11 Перевірка Запуск Надіслати відео Бот повинен Пройшов
коректної тестового розпізнати
обробки середовища емоції на
відео відео та
відправити
його з
накладеними
емоціями
12 Перевірка Запуск Виконати різні Бот повинен Пройшов
коректної тестового операції з базою коректно
взаємодії з середовища, даних (вставка, зберігати,
базою даних база даних вибірка, отримувати
доступна оновлення) та
оновлювати
дані в базі
даних
79
ЧДТУ 242240.002ПЗ
3.2.4 Приймальне тестування
Приймальне тестування проводилося за безпосередньої участі замовника та
майбутніх користувачів системи. Метою такого тестування було переконатися, що
розроблений програмний комплекс повністю відповідає вимогам замовника та
готовий до експлуатації в реальних умовах.
Для приймального тестування було створено спеціальний тест, який моделює
поведінку кінцевого користувача та перевіряє, чи програмне забезпечення
відповідає необхідним вимогам функціональності.
Тест охоплює перевірку основних функцій бота, таких як обробка команд,
аналіз тексту, взаємодія з базою даних, обробка мультимедійних файлів та
інтеграція із зовнішніми сервісами.
Тестовий сценарій приймального тестування включає:
1 Налаштування тестового середовища для імітації реальних умов
використання бота.
2 Перевірку основних команд: /start, /help, /analyze, /recognize_author, /stats
тощо.
3 Тестування функцій аналізу тексту, визначення тональності та
розпізнавання автора.
4 Валідацію функцій обробки зображень, відео та голосових повідомлень.
5 Перевірку інтеграції з базою даних та зовнішніми сервісами обробки
природної мови.
6 Тестування функцій налаштування мови інтерфейсу та інших параметрів
бота.
Під час приймального тестування велася підготовка користувацької
документації, інструкцій та навчальних матеріалів для майбутніх користувачів
системи.
Приймальне тестування проводилось для підтвердження готовності системи
до впровадження та експлуатації.
Код приймального автоматизованого тесту наведений в додатку д. Тест кейси
тестування наведені в таблиці 3.4.
80
ЧДТУ 242240.002ПЗ
Таблиця 3.4
Тест-кейси приймального тестування
№ Опис Передумови Кроки для Очікуваний Результат
Тест- відтворення результат
кейса
1 Перевірка Запуск Надіслати Бот надсилає Пройшов
команди /start telegram команду /start у привітальне
бота тестовому чаті повідомленн
я та
інструкції
для
користувачів
2 Перевірка Запуск Надіслати Бот надсилає Пройшов
команди /help telegram команду /help у повідомленн
бота тестовому чаті я з описом
доступних
команд та
функцій
3 Перевірка Запуск Надіслати Бот виконує Пройшов
команди telegram команду аналіз
/analyze бота, /analyze у збережених
наявність тестовому чаті повідомлень
збережених та надсилає
повідомлень системно
у базі даних прораховані
результати
81
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.4
4 Перевірка Запуск Надіслати Бот виконує Пройшов
команди telegram бота команду пошук та
/recognize_author /recognize_author аналіз тексту,
із текстом для визначає
аналізу ймовірного
автора
5 Перевірка Запуск 1. Надіслати Бот розпізнає Пройшов
обробки telegram бота зображення у зображення
зображень тестовому чаті 2. та надсилає
Надіслати результати
команду "rate" аналізу
6 Перевірка Запуск 1. Надіслати Бот розпізнає Пройшов
обробки відео telegram бота відео у відео та
тестовому чаті 2. надсилає
Надіслати результати
команду "rate" аналізу
7 Перевірка Запуск Надіслати Бот розпізнає Пройшов
обробки telegram бота, голосове голосове
голосових увімкнена повідомлення у повідомлення
повідомлень функція тестовому чаті та надсилає
перетворення текстовий
голосу в еквівалент
текст
8 Перевірка Запуск Надіслати Бот генерує Пройшов
команди telegram бота, команду та надсилає
/daily_stats наявність /daily_stats у статистику
збережених тестовому чаті повідомлень
повідомлень за поточний
у базі даних день
82
ЧДТУ 242240.002ПЗ
Продовж, таблиці 3.4
9 Перевірка Запуск telegram Надіслати Бот генерує та Пройшов
команди бота, наявність команду надсилає
/my_stats збережених /my_stats у статистику
повідомлень у тестовому повідомлень для
базі даних чаті поточного
користувача
3.3 Приклади впровадженого програмного комплексу
Розроблений telegram-бот "Selen" був успішно впроваджений і
використовується у кількох Telegram-групах для аналізу повідомлень та
спілкування з користувачами. Нижче наведено кілька прикладів роботи бота у
реальних умовах.
1 Команда /start. Після додавання бота в групу або після запуску бота в
особистому чаті користувач отримує вітальне повідомлення з кнопкою для
додавання бота в інші групи.
Рисунок 3.13 – Відповідь бота при введені користувачем команди /start
83
ЧДТУ 242240.002ПЗ
2 Команда /analyze. Користувач може відповісти на будь-яке повідомлення
в групі командою /analyze, і бот проаналізує повідомлення цього користувача. Бот
видасть інформацію про найчастіші слова та фрази, що використовуються
користувачем, а також оцінку емоційного забарвлення повідомлень.
Рисунок 3.14 – Відповідь бота при введені користувачем команди
/analyze
3 Команда /recognize_author. Якщо користувач введе команду
/recognize_author та додасть текстовий фрагмент, бот спробує визначити автора
цього тексту, використовуючи моделі машинного навчання та інформацію з
Інтернету.
Рисунок 3.15 – Відповідь бота при введені користувачем команди
/recognize_author разом з текстом
84
ЧДТУ 242240.002ПЗ
4 Команда /daily_stats. Після введення команди /daily_stats бот надасть
статистику повідомлень у групі за поточний день, включаючи кількість
повідомлень від кожного користувача, загальну кількість повідомлень та розподіл
за типами (текст, стікери, інше).
Рисунок 3.16 – Відповідь бота при введені користувачем команди
/daily_stats
5 Команда /my_stats. Команда /my_stats дозволяє користувачеві отримати
статистику власних повідомлень у групі у вигляді графіка.
Рисунок 3.17 – Відповідь бота при введені користувачем команди
/my_stats
85
ЧДТУ 242240.002ПЗ
6 Команда /group_stats. Схожим чином, команда /group_stats надає загальну
статистику повідомлень у групі у вигляді графіка.
Рисунок 3.18 – Відповідь бота при введені користувачем команди
/group_stats
7 Команда /language. За допомогою команди /language користувачі можуть
змінити мову інтерфейсу бота, вибравши потрібний варіант зі списку.
Рисунок 3.19 – Відповідь бота при введені користувачем команди
/language
8 Команда /voice_to_text. Команда дозволяє увімкнути або вимкнути
автоматичне перетворення голосових повідомлень у текст. Якщо ця функція
увімкнена, бот буде відправляти текстове повідомлення з транскрипцією
голосового повідомлення.
86
ЧДТУ 242240.002ПЗ
Рисунок 3.20 – Відповідь бота при введені користувачем команди
/voice_to_text
9 Аналіз зображень та відео. Якщо користувач надішле зображення або
відео і відповість на них текстом "rate", бот спробує розпізнати та класифікувати
вміст зображення або відео, а також додасти відповідну анімацію з оцінкою емоцій,
якщо це відео, а якщо фото, відповість текстом з оцінкою емоцій.
Рисунок 3.21 – Відповідь бота при відповіді на повідомлення з
зображенням і одночасним написанням rate
87
ЧДТУ 242240.002ПЗ
Рисунок 3.22 – Відповідь бота при відповіді на повідомлення з відео і
одночасним написанням rate
Таким чином, впроваджений програмний комплекс telegram-бота "Selen"
успішно виконує різноманітні функції з аналізу повідомлень, розпізнавання тексту
та мультимедійного вмісту, надає статистику та візуалізації, а також забезпечує
зручний інтерфейс для взаємодії з користувачами в групових чатах Telegram.
88
ЧДТУ 242240.002ПЗ
ВИСНОВКИ ДО ТРЕТЬОГО РОЗДІЛУ
Було розглянуто процес розробки та тестування програмного комплексу
telegram-бота "Selen". Детально описано обґрунтування вибору засобів реалізації,
таких як мова програмування Python, фреймворк python-telegram-bot [2], бібліотеки
для аналізу тексту, зображень, відео та інші допоміжні бібліотеки.
Наведено структурну та логічну схеми системи, які демонструють взаємодію
між основними компонентами та потоки даних. Описано процес розробки бази
даних, включаючи інфологічне та датологічне проектування, а також створення
таблиць та їх наповнення.
Розглянуто розробку інтерфейсу користувача, який реалізований
безпосередньо в месенджері Telegram і включає команди, кнопки та відповіді бота
у вигляді текстових повідомлень, зображень, графіків та анімацій.
Описано процес розробки програмних компонентів, таких як модуль
взаємодії з Telegram Bot API [1], модуль обробки повідомлень, модулі аналізу
тексту, зображень, відео, модуль візуалізації, модуль бази даних та модуль
управління командами та налаштуваннями.
У розділі наведено інформацію про тестування системи, включаючи
модульне, інтеграційне, системне та приймальне тестування.
Наприкінці розділу продемонстровано приклади впровадженого
програмного комплексу telegram-бота "Selen" з описом його роботи у реальних
умовах та показано зразки відповідей бота на різні команди та запити користувачів.
89
ЧДТУ 242240.002ПЗ
ВИСНОВКИ
У даній роботі було розроблено функціональний telegram-бот "Selen" для
аналізу повідомлень та їх збору - актуальну та затребувану технологію для обробки
даних. Розроблений функціонал дозволяє в автоматизованому режимі в реальному
часі аналізувати вміст повідомлень в чатах Telegram за різними критеріями, а також
розпізнавати та аналізувати зображення і відео, а також зберігати їх. Це надає
широкі можливості для моніторингу активності учасників, виявлення трендів і
тематик, що цікавлять аудиторію, оцінки тональності обговорень, розпізнавання
емоцій та об'єктів на мультимедійному контенті.
Зокрема реалізовано наступні функції:
1 Прийом та збереження повідомлень з заданих чатів.
2 Передобробка та нормалізація текстів.
3 Визначення тональності повідомлень.
4 Побудова графіків за результатами аналізу.
5 Розпізнавання автора тексту з використанням моделей машинного
навчання.
6 Аналіз зображень з розпізнаванням емоцій, з використанням машинного
навчання.
7 Аналіз відео з розпізнаванням емоцій та додаванням анімацій, з
використанням машинного навчання.
8 Автоматичне перетворення голосових повідомлень у текст.
9 Перегляд статистики повідомлень окремих користувачів та групи в
цілому.
10 Зручний інтерфейс взаємодії в межах Telegram.
11 Розроблено базу даних на PostgreSQL для зберігання даних.
Використано мову Python [3] та бібліотеки OpenCV [7], TensorFlow [6], Pillow
[9], Numpy [24], тощо для аналізу текстів, зображень та відео. Бот успішно
протестований на реальних даних в telegram-чатах. Може бути використаний для
комплексного аналізу активності учасників, виявлення трендів, розпізнавання
об'єктів та емоцій на мультимедійному контенті.
90
ЧДТУ 242240.002ПЗ
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1 Telegram Bot API Documentation [Електронний ресурс] – Режим доступу:
https://core.telegram.org/bots/api
2 Python-telegram-bot Documentation [Електронний ресурс] – Режим
доступу: https://docs.python-telegram-bot.org/en/v20.7
3 Python 3 Documentation [Електронний ресурс] – Режим доступу:
https://docs.python.org/3/
4 Matplotlib Documentation [Електронний ресурс] – Режим доступу:
https://matplotlib.org/stable/users/index
5 PostgreSQL Documentation [Електронний ресурс] – Режим доступу:
https://www.postgresql.org/docs/
6 TensorFlow Documentation [Електронний ресурс] – Режим доступу:
https://www.tensorflow.org/api_docs/python/tf
7 OpenCV Documentation [Електронний ресурс] – Режим доступу:
https://docs.opencv.org/4.x/
8 PsyCopg2 Documentation [Електронний ресурс] – Режим доступу:
https://www.psycopg.org/docs/
9 Pillow Documentation [Електронний ресурс] – Режим доступу:
https://pillow.readthedocs.io/en/stable/
10 Google Font [Електронний ресурс] – Режим доступу
https://fonts.google.com/specimen/Roboto
11 Large language model [Електронний ресурс] – Режим доступу:
https://huggingface.co/rwitz2/go-bruins-v2.1.1
12 Visual Code Documentation [Електронний ресурс] – Режим доступу:
https://code.visualstudio.com/docs
13 Sonyashnyk statistics bot [Електронний ресурс] – Режим доступу:
https://t.me/soniashnyk_statistics_bot
14 Telegram stats bot [Електронний ресурс] – Режим доступу:
https://github.com/mkdryden/telegram-stats-bot
15 Combot [Електронний ресурс] – Режим доступу: https://t.me/combot
91
ЧДТУ 242240.002ПЗ
16 Telegraf.js [Електронний ресурс] – Режим доступу: https://telegraf.js.org/
17 Typescript [Електронний ресурс] – Режим доступу:
https://www.typescriptlang.org/
18 Bot framework [Електронний ресурс] – Режим доступу:
https://dev.botframework.com/
19 TelegramBots [Електронний ресурс] – Режим доступу:
https://github.com/rubenlagus/TelegramBots
20 Unittest [Електронний ресурс] – Режим доступу:
https://docs.python.org/3/library/unittest.html
21 Стаття про методику BERT [Електронний ресурс] – Режим доступу:
https://uk.wikipedia.org/wiki/BERT_(%D0%BC%D0%BE%D0%B4%D0%B
5%D0%BB%D1%8C_%D0%BC%D0%BE%D0%B2%D0%B8)
22 Стаття про мову UML [Електронний ресурс] – Режим доступу:
https://uk.wikipedia.org/wiki/Unified_Modeling_Language
23 Стаття про мову великі мовні моделі [Електронний ресурс] – Режим
доступу:
https://uk.wikipedia.org/wiki/%D0%92%D0%B5%D0%BB%D0%B8%D0%
BA%D0%B0_%D0%BC%D0%BE%D0%B2%D0%BD%D0%B0_%D0%B
C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C
24 Numpy library Documentation [Електронний ресурс] – Режим доступу:
https://numpy.org/doc/stable/
25 Pymediainfo library Documentation [Електронний ресурс] – Режим
доступу: https://pymediainfo.readthedocs.io/en/stable/
26 Speech recognition library [Електронний ресурс] – Режим доступу:
https://github.com/Uberi/speech_recognition#readme
27 Transformers library [Електронний ресурс] – Режим доступу:
https://github.com/huggingface/transformers
28 MoviePy library [Електронний ресурс] – Режим доступу:
https://moviepy.readthedocs.io/en/latest/ref/ref.html
29 BotPress [Електронний ресурс] – Режим доступу: https://botpress.com
92
ЧДТУ 242240.002ПЗ
30 Rubert-base-cased-sentiment-rusentiment [Електронний ресурс] – Режим
доступу: https://huggingface.co/blanchefort/rubert-base-cased-sentiment-
rusentiment
93
ДОДАТОК А
ЗАТВЕРДЖЕНО:
Зав. кафедрою ПЗАС, професор
_________________ Голуб С.В.
„____” ______________ 2024 р.
Розробка telegram бота для збору і аналізу повідомлень користувачів
Специфікація
482. ЧДТУ 242240.002
Листів 2
Розробник ________________ Брус В.М.
Керівник ________________ Немов Р.Г.
2024
Позначення Найменування Примітки
Документація
482.ЧДТУ. 242240 12 01 Текст програми
482.ЧДТУ. 242240 34 01 Інструкція користувачеві
482.ЧДТУ. 242240 90 01 Графічні матеріали
95
ДОДАТОК Б
Розробка telegram бота для збору і аналізу повідомлень користувачів
Текст програми
482.ЧДТУ. 242240 12 01
Листів 14
Розробник ________________ Брус В.М.
2024
482.ЧДТУ. 242240 12 01
Лістинг файла Selen.py
import logging
import re
import sys
import os
from bs4 import BeautifulSoup
from llama_cpp import Llama
import numpy as np
import requests
from torch import softmax
from collections import Counter, defaultdict
from contextlib import contextmanager
from datetime import datetime
from io import BytesIO
from json import load as json_load
from re import sub
from time import time, perf_counter as time_perf_counter
from cv2 import CAP_PROP_FPS,COLOR_BGR2RGB, IMREAD_COLOR, INTER_LANCZOS4,
VideoCapture, cvtColor, imdecode, resize
from keras.models import load_model
from keras.applications.efficientnet_v2 import preprocess_input
from moviepy.editor import AudioFileClip, ImageSequenceClip
from PIL import Image, ImageDraw, ImageFont
from psycopg2 import connect
from pymediainfo import MediaInfo
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.error import BadRequest as telegram_error_BadRequest
from telegram.ext import Application, CallbackQueryHandler,MessageHandler,
CommandHandler, filters
from transformers import AutoModelForSequenceClassification,BertTokenizerFast
import speech_recognition
import librosa
import soundfile as sf
import matplotlib.pyplot as plt
from unidecode import unidecode_expect_nonascii
from asyncio import get_event_loop as asyncio_get_event_loop, Lock as asyncio_Lock
import whisper
from urllib.parse import parse_qs, urlparse, urlunparse
os.environ['PATH'] += os.pathsep +
os.path.join(os.path.dirname(os.path.realpath(__file__)), 'ffmpeg-master-latest-
win64-gpl-shared/bin')
llm = Llama(model_path="models/llm/go-bruins-v2.1.1-Q4_K_S.gguf", n_threads = 6,
n_ctx=4096, n_batch=512, use_mmap=True, verbose=False)
# Enable logging
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
level=logging.WARNING
)
logger = logging.getLogger(__name__)
logging.getLogger("matplotlib").setLevel(logging.WARNING)
# Load the models
whisper_model = whisper.load_model("small")
model = load_model("models/model_EfficientNetV2B3-freeze210.h5", compile=False)
whisper_model_lock = asyncio_Lock()
#language
97
482.ЧДТУ. 242240 12 01
language = None
# Load the labels
class_names = None
emoji_numbers = {
0: '0️⃣',
1: '1️'⃣ ,
2: '2️'⃣ ,
3: '3️⃣',
4: '4️'⃣ ,
5: '5️⃣',
6: '6️'⃣ ,
7: '7️⃣',
8: '8️'⃣ ,
9: '9️'⃣ ,
10: ''
}
language_to_gtranslate = {
'': 'uk',
'': 'en',
'': 'uk',
'': 'uk',
}
with open('translations.json', 'r', encoding='utf-8') as f:
translations = json_load(f)
@contextmanager
def suppress_stdout():
with open(os.devnull, "w") as devnull:
old_stdout = sys.stdout
sys.stdout = devnull
try:
yield
finally:
sys.stdout = old_stdout
async def command_get_user_stats(update, context):
chat_id = update.effective_chat.id
user_id = update.effective_user.id
full_name =
f"{update.effective_user.first_name}{update.effective_user.last_name or ''}"
decoded_full_name = await custom_unidecode(full_name)
conn = await database_get_connection()
cursor = conn.cursor()
query = f"SELECT date, message FROM public.saved_messages WHERE id_group =
{chat_id} AND id = {user_id}"
cursor.execute(query)
data = cursor.fetchall()
conn.close()
message_count = defaultdict(int)
for row in data:
98
482.ЧДТУ. 242240 12 01
date = row[0].date()
message_count[date] += 1
dates = list(message_count.keys())
time_range = max(dates) - min(dates)
if time_range.days <= 31:
x_data = [date.strftime('%m-%d') for date in dates]
y_data = [message_count[date] for date in dates]
else:
grouped_data = defaultdict(int)
for date, count in message_count.items():
month = date.replace(day=1)
grouped_data[month.strftime('%Y-%m')] += count
x_data = [date for date in grouped_data.keys()]
y_data = [grouped_data[month] for month in x_data]
plt.clf()
plt.bar(x_data, y_data)
plt.title(f"Статистика повідомлень користувача {decoded_full_name}")
plt.xlabel("Дата")
plt.ylabel("Кількість повідомлень")
buffer = BytesIO()
plt.savefig(buffer, format="png")
buffer.seek(0)
await context.bot.send_photo(chat_id=update.effective_chat.id, photo=buffer)
async def command_get_group_stats(update, context):
chat_id = update.effective_chat.id
conn = await database_get_connection()
cursor = conn.cursor()
query = f"SELECT date, message FROM public.saved_messages WHERE id_group =
{chat_id}"
cursor.execute(query)
data = cursor.fetchall()
user_query = f"SELECT DISTINCT id FROM public.saved_messages WHERE id_group =
{chat_id}"
cursor.execute(user_query)
user_data = cursor.fetchall()
user_count = len(user_data)
conn.close()
message_count = defaultdict(int)
for row in data:
date = row[0].date()
message_count[date] += 1
dates = list(message_count.keys())
time_range = max(dates) - min(dates)
if time_range.days <= 31:
x_data = [date.strftime('%m-%d') for date in dates]
y_data = [message_count[date] for date in dates]
else:
99
482.ЧДТУ. 242240 12 01
grouped_data = defaultdict(int)
for date, count in message_count.items():
month = date.replace(day=1)
grouped_data[month.strftime('%Y-%m')] += count
x_data = [date for date in grouped_data.keys()]
y_data = [grouped_data[month] for month in x_data]
plt.clf()
plt.bar(x_data, y_data)
plt.title("Статистика повідомлень")
plt.xlabel("Дата")
plt.ylabel("Кількість повідомлень")
buffer = BytesIO()
plt.savefig(buffer, format="png")
buffer.seek(0)
caption = f'Відправників повідомлень - {user_count}'
await context.bot.send_photo(chat_id=update.effective_chat.id, photo=buffer,
caption=caption)
async def command_daily_stats(update,context):
await set_language(update)
chat_id = update.message.chat_id
today = datetime.now().strftime('%Y-%m-%d')
output = ""
conn = await database_get_connection()
# Execute the query to get the number of messages from each user for the
current day
results = await database_execute_query(conn,"""
SELECT users_info.full_name,
COUNT(*) AS total_messages,
COUNT(CASE WHEN message IS NOT NULL THEN 1 END) AS text_messages,
COUNT(CASE WHEN sticker_id IS NOT NULL THEN 1 END) AS
sticker_messages,
COUNT(CASE WHEN message IS NULL AND sticker_id IS NULL THEN 1 END) AS
no_text_or_sticker_messages
FROM saved_messages
JOIN users_info ON saved_messages.id = users_info.user_id
WHERE date(saved_messages.date) = %s AND saved_messages.id_group = %s
GROUP BY users_info.full_name
ORDER BY COUNT(*) DESC
""", (today, chat_id))
messages = await database_execute_query(conn, "SELECT message, sticker_id FROM
saved_messages WHERE id_group = %s AND date(saved_messages.date) = %s",
(chat_id,today))
num_messages = len(messages)
num_text_messages = 0
num_sticker_messages = 0
num_other_messages = 0
for message in messages:
if message[0] is not None:
num_text_messages += 1
elif message[1] is not None:
num_sticker_messages += 1
else:
num_other_messages += 1
if num_text_messages == 0:
print("Data Error: Not Enough Messages for daily_stats")
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
100
482.ЧДТУ. 242240 12 01
ate.message.chat_id,text=translations['function_analyze_group_messages'][language]
['NotEnoughData'])
return
conn.close()
output+= f"
{translations['function_analyze_group_messages'][language]['MessagesPerDay']}:\n"
for counter, (user_id, total_messages, text_messages, sticker_messages,
no_text_or_sticker_messages) in enumerate(results, start=1):
output += f"{counter}. {user_id} — {total_messages}\n"
output +=
f"{translations['function_analyze_group_messages'][language]['Summ']} —
{num_messages} (Текст: {num_text_messages}|Стікери: {num_sticker_messages}|Інше:
{num_other_messages})\n\n"
min_word_length = 3
top_n = 5
top_n_phrases = 5
phrase_length = 2
max_phrase_length = 2
num_message_sentiment = 200
conn.close()
words = []
phrases = []
for message in messages:
if message[0] is not None and not message[0].startswith(('/', '@')):
message_words = list(set(message[0].split()))
words.extend(message_words)
message_phrases = set()
for length in range(phrase_length, max_phrase_length+1):
for i in range(len(message_words)-length+1):
phrase_words = message_words[i:i+length]
if all(len(word) >= min_word_length for word in phrase_words):
message_phrases.add(' '.join(phrase_words))
phrases.extend(list(message_phrases))
filtered_words = [word for word in words if len(word) >= min_word_length]
top_words = Counter(filtered_words).most_common(top_n)
top_phrases = Counter(phrases).most_common(top_n_phrases)
output+=f" {top_n}
{translations['function_analyze_group_messages'][language]['MostFrequentWords']}:\
n"
for i, (word, count) in enumerate(top_words):
output+=f"{emoji_numbers[i+1]} - {word} [x{count}]\n"
output+="\n"
output+=f" {top_n_phrases}
{translations['function_analyze_group_messages'][language]['MostFrequentPhrases']}
:\n"
for i, (phrase, count) in enumerate(top_phrases):
output+=f"{emoji_numbers[i+1]} - {phrase} [x{count}]\n"
output+="\n"
tokenizer = BertTokenizerFast.from_pretrained('blanchefort/rubert-base-cased-
sentiment-rusentiment')
model =
AutoModelForSequenceClassification.from_pretrained('blanchefort/rubert-base-cased-
sentiment-rusentiment', return_dict=True)
total_sum = [0] * model.config.num_labels
batch_size = 200
101
482.ЧДТУ. 242240 12 01
count = 0
messages_data = [item[0] for item in messages if item[0] and not
item[0].startswith(('/', '@'))]
for start_index in range(0, len(messages_data), batch_size):
batch_messages = messages_data[start_index:start_index+batch_size]
inputs = tokenizer(batch_messages, max_length=244, padding=True,
truncation=True, return_tensors='pt')
outputs = model(**inputs)
predicted = softmax(outputs.logits, dim=1)
predicted_sum = predicted.sum(dim=0).tolist()
total_sum = [x + y for x, y in zip(total_sum, predicted_sum)]
count += len(batch_messages)
if(count >= num_message_sentiment):
break
predicted_avg = [x / count for x in total_sum] if count else [100,0,0]
output+=f"
{translations['function_analyze_group_messages'][language]['AnalyzeEmotions']}:\n"
labels =
translations['function_analyze_user_messages'][language]['rusentiment-labels']
result = "\n".join([f"{label} - {prob:.2%}" for label, prob in zip(labels,
predicted_avg)])
output+=f"{result}"
await context.bot.send_message(chat_id=chat_id,text=output)
async def command_analyze(update, context):
await set_language(update)
output = ""
message = update.message
chat_id = message.chat_id
user_id = None
username = None
if message.reply_to_message is not None:
user_id = message.reply_to_message.from_user.id
username = message.reply_to_message.from_user.username
is_bot = message.reply_to_message.from_user.is_bot
else:
user_id = message.from_user.id
username = message.from_user.username
is_bot = message.from_user.is_bot
if is_bot:
print("User error: user cannot be bot in command_analyze")
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=translations['function_analyze_user_messages'][language][
'IsBot'])
return
min_word_length = 5
top_n = 5
top_n_phrases = 5
phrase_length = 2
max_phrase_length = 25
num_message_sentiment = 200
conn = await database_get_connection()
messages = await database_execute_query(conn, "SELECT message FROM
saved_messages WHERE id = %s AND id_group = %s", (user_id, chat_id))
have_at_least_one_text_message = False
for message in messages:
if message[0] is not None:
have_at_least_one_text_message = True
102
482.ЧДТУ. 242240 12 01
break
if not have_at_least_one_text_message:
print("Data Error: Not Enough Messages for command_analyze")
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=translations['function_analyze_user_messages'][language][
'NotEnoughData'])
return
words = []
phrases = []
for message in messages:
if message[0] is not None and not message[0].startswith(('/', '@')):
message_words = list(set(message[0].split()))
words.extend(message_words)
message_phrases = set()
for length in range(phrase_length, max_phrase_length+1):
for i in range(len(message_words)-length+1):
phrase_words = message_words[i:i+length]
if all(len(word) >= min_word_length for word in phrase_words):
message_phrases.add(' '.join(phrase_words))
phrases.extend(list(message_phrases))
filtered_words = [word for word in words if len(word) >= min_word_length]
top_words = Counter(filtered_words).most_common(top_n)
top_phrases = Counter(phrases).most_common(top_n_phrases)
output+=f" {top_n}
{translations['function_analyze_user_messages'][language]['MostFrequentWords']}
{username}:\n"
for i, (word, count) in enumerate(top_words):
output+=f"{emoji_numbers[i+1]} - {word} [x{count}]\n"
output+="\n"
output+=f" {top_n_phrases}
{translations['function_analyze_user_messages'][language]['MostFrequentPhrases']}
{username}:\n"
for i, (phrase, count) in enumerate(top_phrases):
output+=f"{emoji_numbers[i+1]} - {phrase} [x{count}]\n"
output+="\n"
tokenizer = BertTokenizerFast.from_pretrained('blanchefort/rubert-base-cased-
sentiment-rusentiment')
model =
AutoModelForSequenceClassification.from_pretrained('blanchefort/rubert-base-cased-
sentiment-rusentiment', return_dict=True)
total_sum = [0] * model.config.num_labels
batch_size = 200
count = 0
messages_data = [item[0] for item in messages if item[0] and not
item[0].startswith(('/', '@'))]
for start_index in range(0, len(messages_data), batch_size):
batch_messages = messages_data[start_index:start_index+batch_size]
inputs = tokenizer(batch_messages, max_length=244, padding=True,
truncation=True, return_tensors='pt')
outputs = model(**inputs)
predicted = softmax(outputs.logits, dim=1)
predicted_sum = predicted.sum(dim=0).tolist()
total_sum = [x + y for x, y in zip(total_sum, predicted_sum)]
count += len(batch_messages)
if(count >= num_message_sentiment):
break
103
482.ЧДТУ. 242240 12 01
predicted_avg = [x / count for x in total_sum] if count else [100,0,0]
output+=f" {count}
{translations['function_analyze_user_messages'][language]['AnalyzeEmotions']}
{username}:\n"
labels =
translations['function_analyze_user_messages'][language]['rusentiment-labels']
result = "\n".join([f"{label} - {prob:.2%}" for label, prob in zip(labels,
predicted_avg)])
output+=f"{result}"
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=f"{output}")
async def change_language(update, context):
conn = await database_get_connection()
cursor = conn.cursor()
query = f"SELECT language FROM groups_settings WHERE group_id =
{update.callback_query.message.chat_id}"
cursor.execute(query)
result = cursor.fetchone()
if result is None:
insert_query = f"INSERT INTO groups_settings (group_id, language) VALUES
({update.callback_query.message.chat_id}, '{language}')"
cursor.execute(insert_query)
conn.commit()
else:
update_query = f"UPDATE groups_settings SET language = '{language}' WHERE
group_id = {update.callback_query.message.chat_id}"
cursor.execute(update_query)
conn.commit()
conn.close()
await
context.bot.edit_message_text(chat_id=update.callback_query.message.chat_id,messag
e_id = update.callback_query.message.message_id,text=f"{language} - ")
await update.callback_query.answer()
async def command_language(update,context):
buttons = [[InlineKeyboardButton('', callback_data=''),
InlineKeyboardButton('', callback_data=''),]]
reply_markup = InlineKeyboardMarkup(buttons)
await context.bot.send_message(chat_id=update.message.chat_id,
text='', reply_markup=reply_markup)
async def predict_video(update, context,path):
await context.bot.send_chat_action(chat_id=update.message.chat_id,
action='upload_video')
has_audio = any([track.track_type == 'Audio' for track in
MediaInfo.parse(path).tracks])
clip = VideoCapture(path)
fps = int(clip.get(CAP_PROP_FPS))
font_size = None
if language == "":
font_size = 26
else:
font_size = 18
104
482.ЧДТУ. 242240 12 01
font = ImageFont.truetype('fonts/Roboto-Black-COLR.ttf', font_size)
#Getting prediction interval time
batch_size = 6
predict_each_batches = max(int(((fps*0.03) * batch_size)),1)
delta = 0
# Predict the emotion for each frame
size = (224, 224)
image_width, image_height = size
data = np.ndarray(shape=(batch_size, 224, 224, 3), dtype=np.float32)
emotion_frames = []
bar_color_start = (255, 200, 100)
bar_color_end = (255, 145, 0)
outline_color = (0, 0, 0)
outline_width = 2
bar_width = 224
bar_height = 7
most_common_class = None
avg_conf_score = 0.5
prev_avg_conf_score = 0.5
current_batch = 0
while True:
# Prepare a batch of images
images = []
for j in range(batch_size):
ret, frame = clip.read()
if not ret:
break
image = cvtColor(frame, COLOR_BGR2RGB)
image = resize(image, dsize=size, interpolation=INTER_LANCZOS4)
images.append(image)
if len(images) == 0:
break
if current_batch % predict_each_batches == 0:
# Resize and normalize the batch of images
data = np.ndarray(shape=(len(images), 224, 224, 3),
dtype=np.float32)
for j in range(len(images)):
image_array = np.asarray(images[j])
normalized_image_array = preprocess_input(image_array)
data[j] = normalized_image_array
# Predict the emotions for the batch of images
predictions_batch = model.predict(data, verbose=0)
class_mean_confidence = {}
for i, prediction in enumerate(predictions_batch):
max_confidence = np.max(prediction)
max_class_index = np.argmax(prediction)
if max_class_index not in class_mean_confidence:
class_mean_confidence[max_class_index] = [max_confidence]
else:
class_mean_confidence[max_class_index].append(max_confiden
ce)
for class_index, confidences in class_mean_confidence.items():
mean_confidence = np.mean(confidences)
class_mean_confidence[class_index] = mean_confidence
result = max(class_mean_confidence, key=class_mean_confidence.get)
most_common_class = class_names[result]
prev_avg_conf_score = avg_conf_score
avg_conf_score = class_mean_confidence[result]
105
482.ЧДТУ. 242240 12 01
delta = (avg_conf_score - prev_avg_conf_score) /
(predict_each_batches*batch_size)
for image in images:
# Count the occurrences of each prediction
prev_avg_conf_score = max(min(prev_avg_conf_score + delta, 1), 0)
sigmoid_prev_score = 1 / (1 + np.exp(-2*(2*prev_avg_conf_score -
1)))
sigmoid_confidence_score = 1 / (1 + np.exp(-2*(2*avg_conf_score -
1)))
sigmoid_prev_score += (sigmoid_confidence_score -
sigmoid_prev_score) * 0.2
pil_image = Image.fromarray(image)
# Add the emotion bar to the frame
emotion_bar = Image.new('RGBA', (bar_width, bar_height), (255,
255, 255, 0))
bar_fill_width = int(np.clip(sigmoid_prev_score *
bar_width,22,bar_width))
bar_color = tuple(int(start * (1 - sigmoid_prev_score) + end *
sigmoid_prev_score) for start, end in zip(bar_color_start, bar_color_end))
ImageDraw.Draw(emotion_bar).rectangle((0, 0, bar_fill_width,
bar_height), fill=bar_color,outline=None)
pil_image.paste(emotion_bar, (0, 0))
outline_image = Image.new('RGBA', (bar_width, bar_height), (255,
255, 255, 0))
draw = ImageDraw.Draw(outline_image)
draw.rectangle((0, 0, bar_width, bar_height),
outline=outline_color, width=outline_width)
pil_image.paste(outline_image, (0, 0), outline_image)
# Add the predicted emotion to the frame
draw = ImageDraw.Draw(pil_image)
text = sub(r'\d+', '', most_common_class)
# Get the width and height of the text
text_size = font.getbbox(text)
text_width = text_size[0] + text_size[2]
x = (image_width - text_width) / 2
y = (bar_height + (font_size / 6))
draw.text((x, y), text, font=font, fill=(255, 145,
0),stroke_width=outline_width, stroke_fill=outline_color)
image = np.asarray(pil_image)
emotion_frames.append(image)
current_batch+=1
with suppress_stdout():
clip = ImageSequenceClip(emotion_frames, fps=fps)
# If the original video has audio, copy it to the new video clip
if has_audio:
audio = AudioFileClip(path)
clip = clip.set_audio(audio)
# Write the output video to a file
clip.write_videofile('W:\output.mp4', codec='libx264', verbose=False,
temp_audiofile='W:\\temp-audio.mp3')
# Send the output gif to the user
with open('W:\output.mp4', 'rb') as video_file:
if has_audio:
await
context.bot.send_video(reply_to_message_id=update.message.message_id,chat_id=updat
e.message.chat_id,video=video_file,filename='output.mp4')
else:
await
context.bot.send_animation(reply_to_message_id=update.message.message_id,chat_id=u
pdate.message.chat_id, animation=video_file, filename='output.mp4')
106
482.ЧДТУ. 242240 12 01
async def predict_image(update, context,file):
output = ""
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
image = imdecode(np.frombuffer(file, np.uint8), IMREAD_COLOR)
size = (224, 224)
image = resize(image, dsize=size, interpolation=INTER_LANCZOS4)
image_array = np.asarray(image)
normalized_image_array = preprocess_input(image_array)
data[0] = normalized_image_array
prediction = model.predict(data,verbose = 0)
index = np.argmax(prediction)
class_name = class_names[index]
output = translations['function_predict_image'][language]['MainOutput']
class_predictions = [(class_names[i][2:].strip(), prediction[0][i]) for i
in range(len(prediction[0]))]
class_predictions.sort(key=lambda x: x[1], reverse=True)
for class_name, pred_value in class_predictions:
if pred_value > 0.1:
output += f"{class_name}: [{round(pred_value*100, 2)}%]\n"
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=f"{output}")
async def command_help(update,context):
await set_language(update)
await context.bot.send_message(chat_id=update.message.chat_id,
text=translations['command_help'][language]['MainOutput'])
async def command_start(update,context):
await set_language(update)
message = update.message
full_name = (message.from_user.first_name or '') +
(message.from_user.last_name or '')
button =
InlineKeyboardButton(text=translations['command_start'][language]['ButtonAddToGrou
pText'],url="t.me/inheritos_bot?startgroup=botstart")
keyboard = InlineKeyboardMarkup([[button]])
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=f"{translations['command_start'][language]['MainOutputLef
t']}, {full_name},
{translations['command_start'][language]['MainOutputRight']}",reply_markup =
keyboard)
async def voice_message_to_text(update, context):
start_time = time_perf_counter()
print("voice_message_to_text")
group_id = update.message.chat_id
conn = await database_get_connection()
query = "SELECT speech_to_text FROM groups_settings WHERE group_id = %s"
speech_to_text = await database_execute_query(conn, query, (group_id,))
if speech_to_text:
file = await context.bot.getFile(update.message.voice.file_id)
file_content = await file.download_as_bytearray()
ogg_file = BytesIO(file_content)
y, sample_rate = librosa.load(ogg_file, sr=16000)
file_path = 'output.wav'
sf.write(file_path, y, sample_rate, format='WAV', subtype='PCM_16')
audio = whisper.load_audio(file_path)
107
482.ЧДТУ. 242240 12 01
audio = whisper.pad_or_trim(audio)
mel = whisper.log_mel_spectrogram(audio)
async with whisper_model_lock:
_, probs = whisper_model.detect_language(mel)
recognized_language = max(probs, key=probs.get)
text = await asyncio_get_event_loop().run_in_executor(None,
google_speech_to_text, file_path, recognized_language)
if text:
print(f"Text from voice: {text} | Recognized language:
{recognized_language}")
await
context.bot.send_message(reply_to_message_id=update.message.message_id,
chat_id=update.message.chat_id, text=text)
else:
print("No text was received")
end_time = time_perf_counter()
print(f"Время выполнения функции: {end_time - start_time} секунд")
def google_speech_to_text(file_path, language):
r = speech_recognition.Recognizer()
with speech_recognition.AudioFile(file_path) as source:
audio_file = r.record(source)
try:
text = r.recognize_google(audio_file, language=language)
except speech_recognition.UnknownValueError:
print("Speech recognition failed")
return None
return text
async def command_set_voice_to_text(update, context):
await set_language(update)
if update.message.chat.type in ["private"]:
await
context.bot.send_message(reply_to_message_id=update.message.message_id,
chat_id=update.message.chat_id,
text=translations['error_This_is_not_Group'][language]['MainOutput'])
return
group_id = update.message.chat_id
conn = await database_get_connection()
cursor = conn.cursor()
cursor.execute("SELECT speech_to_text FROM groups_settings WHERE group_id =
%s", (group_id,))
result = cursor.fetchone()
current_value = result[0] if result else None
if current_value:
current_value = False
else:
current_value = True
cursor.execute("UPDATE groups_settings SET speech_to_text = %s WHERE group_id
= %s;",(current_value, group_id))
conn.commit()
conn.close()
if current_value:
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=f"Голосове повідомлення в текст: Ввімкнуто")
else:
108
482.ЧДТУ. 242240 12 01
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=f"Голосове повідомлення в текст: Вимкнуто")
llm_lock = asyncio_Lock()
def llm_wrapper(args, kwargs):
return llm(*args, **kwargs)
async def async_llm(*args, **kwargs):
async with llm_lock:
loop = asyncio_get_event_loop()
result = await loop.run_in_executor(None, llm_wrapper, args, kwargs)
return result
async def clear_url_params(url):
parsed_url = urlparse(url)
if 'youtube.com/watch' in url:
video_id = parse_qs(parsed_url.query).get('v')
return urlunparse(parsed_url._replace(query=f"v={video_id}", fragment=""))
else:
return urlunparse(parsed_url._replace(query="", fragment=""))
async def get_full_url(link):
return "https://www.google.com" + link
async def extract_target_url(google_url):
parsed_url = urlparse(google_url)
query_params = parse_qs(parsed_url.query)
if 'q' in query_params:
return query_params['q'][0]
return google_url
async def search(query):
url = f"https://www.google.com/search?q={query}"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
search_results = soup.find_all('div', class_='kCrYT')
links = [result.find('a')['href'] for result in search_results if
result.find('a')]
max_text_page_tokens = 1024
max_text_tokens = 2048
visited_links = set()
remove_texts = [
"Ваш веб-переглядач більше не підтримується. Оновіть його.",
"Сервіс YouTube Music не оптимізовано для цього веб-переглядача. Перевірте
наявність оновлень або встановіть Google Chrome.",
"Завантажити Chrome",
"Google LLC",
"JavaScript is disabled",
"You need to enable JavaScript to use SoundCloud",
"Please download one of our supported browsers",
"Jump to content Main menu Main menu move to sidebar hide Navigation Main
pageContentsCurrent eventsRandom articleAbout WikipediaContact usDonate Contribute
HelpLearn to editCommunity portalRecent changesUpload file Languages Language
links are at the top of the page across from the title. Search Search Create
account Log in Personal tools Create account Log in Pages for logged out editors
learn more ContributionsTalk Contents move to sidebar hide (Top)",
"Edit links ArticleTalk English ReadEditView history Tools Tools move to
sidebar hide Actions ReadEditView history General What links hereRelated
109
482.ЧДТУ. 242240 12 01
changesUpload fileSpecial pagesPermanent linkPage informationCite this pageGet
shortened URLWikidata item Print/export Download as PDFPrintable version From
Wikipedia, the free encyclopedia",
"Про розділДля пресиАвторські праваЗв'язатися з намиДля авторівДля
рекламодавцівДля розробниківУмовиКонфіденційністьПравила й безпекаЯк працює
YouTubeСпробувати нові функції© 2️0️2️3️",
"Увага! Сайт зберігає кукі вашого браузера.",
"5️ клас 6️ клас 7️ клас 8️ клас 9️ клас 1️0️ клас 1️1️ клас",
"При використанні матеріалів сайту, посилання на УкрЛіб обов'язкове.
УкрЛіб — читати повністю книги українською мовою"
]
text_tokens = []
for link in links:
if len(text_tokens) >= max_text_tokens:
break
full_link = await get_full_url(link)
target_link = await extract_target_url(full_link)
cleared_link = await clear_url_params(target_link)
if cleared_link in visited_links:
continue
visited_links.add(cleared_link)
print(cleared_link)
try:
result_url = "https://www.google.com" + link
result_response = requests.get(result_url, timeout=3)
result_soup = BeautifulSoup(result_response.text, 'html.parser')
title = result_soup.title.string if result_soup.title else ""
for tag in result_soup(['script', 'style']):
tag.decompose()
formatted_text = f"\nTitle:{title}\n{result_soup.get_text()}"
for remove_text in remove_texts:
formatted_text = formatted_text.replace(remove_text, '')
formatted_text = re.sub('\s+', ' ', formatted_text)
print(f"Formatted text:\n{formatted_text}")
utf8_text = formatted_text.encode('utf-8')
tokens = llm.tokenize(utf8_text)
num_tokens = len(tokens)
if num_tokens > max_text_page_tokens:
tokens = tokens[:max_text_page_tokens]
text_tokens.extend(tokens)
except Exception as e:
print(f"Error occurred: {e}")
if len(text_tokens) > max_text_tokens:
text_tokens = text_tokens[:max_text_tokens]
text = llm.detokenize(text_tokens).decode('utf-8','ignore')
return text
async def command_recognize_author(update, context):
args = context.args
if not args:
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=f"Введіть текст для розпізнавання автора, наприклад
'/recognize_author Як вмру то поховайте мене на могилі серед степу широкого на
вкраїні милій'")
return
await set_language(update)
message = update.message
formatted_message = re.sub(r'/recognize_author ', '', message.text,
flags=re.IGNORECASE).strip()
text = await search(formatted_message)
print(text)
110
482.ЧДТУ. 242240 12 01
output = await async_llm(f"<|im_start|>system\nYour task is to determine the
author of the text passage, you can enter only his name. Here is some additional
information from internet that may help you -
{text}.<|im_end|>\n<|im_start|>user\n{formatted_message}<|im_end|>\n<|im_start|>as
sistant\n", stop=["### Assistant:", "### System:", "<|im_end|>",
"<|im_start|>","\n\n###"] , echo=True,max_tokens=50)#repeat_penalty=1.1,
top_k=40,top_p=0.95
print(output)
text = output['choices'][0]['text']
answer = text.rsplit("assistant\n", 1)[-1].strip()
output = (f"{answer}")
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=f"{output}")
async def message_format(update, context):
if update.message:
full_name = f"{update.message.from_user.first_name or ''}
{update.message.from_user.last_name or ''}"
username = update.message.from_user.username
user_id = update.message.from_user.id
conn = await database_get_connection()
cursor = conn.cursor()
cursor.execute("""INSERT INTO users_info (user_id, full_name, username)
VALUES (%s, %s, %s)
ON CONFLICT (user_id) DO UPDATE SET full_name = %s,
username = %s""",
(user_id, full_name, username, full_name, username))
cursor.execute("""INSERT INTO saved_messages (id, id_group, message, date,
sticker_id)
VALUES (%s, %s, %s, %s,%s)""",
(user_id, update.message.chat_id, update.message.text,
update.message.date, update.message.sticker.file_id if update.message.sticker else
None))
conn.commit()
conn.close()
else:
return
if update.message.text is None and update.message.caption is None:
return
text = update.message.text.lower() if update.message.text else
update.message.caption.lower()
if "rate" not in text:
return
log = datetime.now().strftime("%Y-%m-%d %H:%M")
start_time = time()
await set_language(update)
Is_Rate = False
Is_Image = False
message = update.message.reply_to_message if update.message.reply_to_message
else update.message
curr_file_path = None
image_buffer = BytesIO()
if "rate" in text:
Is_Rate = True
111
482.ЧДТУ. 242240 12 01
try:
if message.sticker is not None:
sticker = message.sticker
file = await context.bot.get_file(sticker.file_id)
file_url = file.file_path
extension = file_url.split(".")[-1]
curr_file_path = f"W:/video.{extension}"
if extension == "webm":
await file.download_to_drive(curr_file_path)
elif extension == "tgs":
await
context.bot.send_message(reply_to_message_id=update.message.message_id,chat_id=upd
ate.message.chat_id,text=f"File with .tgs extension is not supported")
return
elif extension == "webp":
await file.download_to_memory(out=image_buffer)
image_buffer.seek(0)
Is_Image = True
elif message.video is not None:
video_file = await message.video.get_file()
curr_file_path = f"W:/video.mp4"
await video_file.download_to_drive(curr_file_path)
elif message.document is not None:
gif_file = await message.document.get_file()
curr_file_path = "W:/input.gif"
await gif_file.download_to_drive(curr_file_path)
elif message.photo:
image_file = await message.photo[-1].get_file()
await image_file.download_to_memory(out=image_buffer)
image_buffer.seek(0)
Is_Image = True
elif message.from_user.id:
user_id = message.from_user.id
result = await context.bot.get_user_profile_photos(user_id)
photos = result['photos']
if not photos:
await message.reply_text('No Photos or Profile is Closed')
return
photo_sizes = photos[0]
photo = photo_sizes[0]
file_id = photo['file_id']
file = await context.bot.get_file(file_id)
await file.download_to_memory(out=image_buffer)
Is_Image = True
except telegram_error_BadRequest as e:
if str(e) == "File is too big":
print("Error: File is too big")
await context.bot.send_message(chat_id=update.effective_chat.id,
text=translations['error_File_is_too_big'][language]['MainOutput'])
else:
print(e)
return
if (Is_Image):
log+=" | Image | "
if(Is_Rate):
await predict_image(update,context,image_buffer.getvalue())
else:
log+=" | Video | "
if(Is_Rate):
await predict_video(update, context,curr_file_path)
112
482.ЧДТУ. 242240 12 01
log+=f"Run in: {(time()-start_time):.2f} seconds"
print(log)
return
async def database_get_connection():
conn = connect(database="inheritosbot", user="postgres", password="22102002N",
host="localhost", port="5433")
return conn
async def database_execute_query(conn, query, params=None):
with conn.cursor() as cur:
cur.execute(query, params)
return cur.fetchall()
async def set_language(update):
conn = await database_get_connection()
cursor = conn.cursor()
query = f"SELECT language FROM groups_settings WHERE group_id =
{update.message.chat_id}"
cursor.execute(query)
result = cursor.fetchone()
global class_names
global language
if result is not None:
language = result[0]
else:
language = ''
insert_query = f"INSERT INTO groups_settings (group_id, language) VALUES
({update.message.chat_id}, '{language}')"
cursor.execute(insert_query)
conn.commit()
class_names = translations['get_labels'][language]['MainOutput']
conn.close()
async def custom_unidecode(string):
result = []
for char in string:
if char == '':
continue
transliterated_char = unidecode_expect_nonascii(char)
if transliterated_char == '' or char in
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯІЇҐЄабвгдеёжзийклмнопрстуфхцчшщъыьэюяіїґє':
result.append(char)
else:
result.append(transliterated_char)
return ''.join(result)
async def button_handler(update, context):
query = update.callback_query
global language
language = query.data
await change_language(update,context)
def main() -> None:
application =
Application.builder().concurrent_updates(True).read_timeout(50).write_timeout(50).
connect_timeout(50).token("6767138786:AAEAkjT3A8vGXZsUxPE6t_dn8ViIgGlfIr0").build(
)
113
482.ЧДТУ. 242240 12 01
application.add_handler(CommandHandler("start", command_start))
application.add_handler(CommandHandler("help", command_help))
application.add_handler(CommandHandler("analyze", command_analyze))
application.add_handler(CommandHandler("recognize_author",
command_recognize_author))
application.add_handler(CommandHandler('daily_stats', command_daily_stats))
application.add_handler(MessageHandler(filters.TEXT &
filters.Regex(re.compile(r'^статистика$', re.IGNORECASE)), command_daily_stats))
application.add_handler(CommandHandler("my_stats", command_get_user_stats))
application.add_handler(CommandHandler("group_stats",
command_get_group_stats))
application.add_handler(CommandHandler("language", command_language))
application.add_handler(CommandHandler("voice_to_text",
command_set_voice_to_text))
application.add_handler(MessageHandler(filters.VOICE, voice_message_to_text))
application.add_handler(MessageHandler(filters.ALL, message_format))
application.add_handler(CallbackQueryHandler(button_handler))
application.run_polling(timeout=50)
if __name__ == "__main__":
main()
Скрипт модульного тестування main.py
client = TelegramClient('session_name', api_id, api_hash)
bot_responses = {}
async def wait_for_bot_response(id, timeout):
# Очікуйте, доки відповідь бота не з'явиться у словнику
start_time = time.time()
try:
await asyncio.wait_for(_check_bot_response(id), timeout)
except asyncio.TimeoutError:
print("Тайм-аут!")
return None
end_time = time.time()
print(f"Час отримання відповіді: {end_time - start_time} секунд")
for message_id in bot_responses.keys():
if message_id > id:
return message_id
async def _check_bot_response(id):
while not any(message_id > id for message_id in bot_responses.keys()):
await asyncio.sleep(0.01)
@client.on(events.NewMessage(from_users=bot_username))
async def bot_response_handler(event):
# Збереження відповіді бота в словнику
bot_responses[event.id] = event.message.text
# Функціональне тестування
async def test_commands(event):
message = await event.respond('/start')
bot_message_id = await wait_for_bot_response(message.id, 10)
assert "Привіт" in bot_responses[bot_message_id]
message = await event.respond('/help')
bot_message_id = await wait_for_bot_response(message.id, 10)
assert "для виведення ємоціонального контексту зробіть відповідь на" in
bot_responses[bot_message_id]
message = await event.respond('/group_stats')
bot_message_id = await wait_for_bot_response(message.id, 10)
assert "Відправників повідомлень" in bot_responses[bot_message_id]
114
482.ЧДТУ. 242240 12 01
message = await event.respond('/recognize_author Я мріяла тихо про казку
чудову, Я ждала, що сонце мені засія. Даремно! Не сонце заблисло, а сльози,
Укрилася хмарами юність моя...')
bot_message_id = await wait_for_bot_response(message.id, 60)
assert " " in bot_responses[bot_message_id]
print('Test commands passed')
# Навантажувальне тестування
async def test_load(event, num_messages=50):
start_time = time.time()
for _ in range(num_messages):
await event.respond('Тестовеповідомлення')
end_time = time.time()
print(f"Час відправки {num_messages} повідомлень: {end_time - start_time}
секунд")
message = await event.respond('/help')
bot_message_id = await wait_for_bot_response(message.id, 10)
assert "для" in bot_responses[bot_message_id]
print('Load test passed')
# Тестування аналізу тональності
async def test_sentiment(event):
positive_msgs = ['Ура']*2️0️
for text in positive_msgs:
await event.respond(text)
message = await event.respond('статистика')
bot_message_id = await wait_for_bot_response(message.id, 10)
bot_message = bot_responses[bot_message_id]
match = re.search(r'Позитив - (\d+\.\d+)%', bot_message)
needed_percent = 80
positive_percent = float(match.group(1))
if positive_percent < needed_percent:
raise Exception(f'Позитивних повідомлень менше {needed_percent}%')
else:
print('Позитивних повідомлень більше 8️0️%')
print('Sentiment analysis test passed')
# Виявлення топ-слів
async def test_top_words(event):
words_1 = ['dog'] * 10
words_2 = ['cat'] * 20
words_3 = ['bird'] * 30
for word in words_1:
await event.respond(word)
for word in words_2:
await event.respond(word)
for word in words_3:
await event.respond(word)
message = await event.respond('статистика')
bot_message_id = await wait_for_bot_response(message.id, 10)
bot_message = bot_responses[bot_message_id]
if bot_message.find("dog [x10]") != -1 and bot_message.find("cat [x20]") != -1
and bot_message.find("bird [x30]") != -1:
print("Слова пораховані правильно")
print('Top words test passed')
else:
print("Слова пораховано неправильно")
client.start()
client.run_until_disconnected()
115
482.ЧДТУ. 242240 12 01
Скрипт інтеграційного тестування integration_test.py
import sys
import os
import unittest
from unittest.mock import AsyncMock, patch, Mock
from telegram import Update, Message
cwd = os.getcwd()
sys.path.append(cwd)
from selen import (
command_start, command_help, command_analyze, command_recognize_author,
command_daily_stats,
command_get_user_stats, command_get_group_stats, command_language,
command_set_voice_to_text,
voice_message_to_text, message_format,
)
class TestIntegration(unittest.TestCase):
def setUp(self):
self.update = Update(update_id=1234, message=Mock(spec=Message))
self.context = Mock()
@patch('selen.set_language')
@patch('selen.command_start')
async def test_command_start(self, mock_command_start, mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_start(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_start.assert_awaited_once_with(self.update, self.context)
@patch('selen.set_language')
@patch('selen.command_help')
async def test_command_help(self, mock_command_help, mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_help(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_help.assert_awaited_once_with(self.update, self.context)
@patch('selen.set_language')
@patch('selen.command_analyze')
async def test_command_analyze(self, mock_command_analyze, mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_analyze(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_analyze.assert_awaited_once_with(self.update, self.context)
@patch('selen.set_language')
@patch('selen.command_recognize_author')
async def test_command_recognize_author(self, mock_command_recognize_author,
mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_recognize_author(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_recognize_author.assert_awaited_once_with(self.update,
self.context)
@patch('selen.set_language')
116
482.ЧДТУ. 242240 12 01
@patch('selen.command_daily_stats')
async def test_command_daily_stats(self, mock_command_daily_stats,
mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_daily_stats(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_daily_stats.assert_awaited_once_with(self.update,
self.context)
@patch('selen.set_language')
@patch('selen.command_get_user_stats')
async def test_command_get_user_stats(self, mock_command_get_user_stats,
mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_get_user_stats(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_get_user_stats.assert_awaited_once_with(self.update,
self.context)
@patch('selen.set_language')
@patch('selen.command_get_group_stats')
async def test_command_get_group_stats(self, mock_command_get_group_stats,
mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_get_group_stats(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_get_group_stats.assert_awaited_once_with(self.update,
self.context)
@patch('selen.set_language')
@patch('selen.command_language')
async def test_command_language(self, mock_command_language,
mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_language(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_language.assert_awaited_once_with(self.update, self.context)
@patch('selen.set_language')
@patch('selen.command_set_voice_to_text')
async def test_command_set_voice_to_text(self, mock_command_set_voice_to_text,
mock_set_language):
mock_set_language.return_value = AsyncMock()
await mock_set_language.return_value
await command_set_voice_to_text(self.update, self.context)
mock_set_language.assert_called_once_with(self.update)
mock_command_set_voice_to_text.assert_awaited_once_with(self.update,
self.context)
@patch('selen.voice_message_to_text')
async def test_voice_message_to_text(self, mock_voice_message_to_text):
await voice_message_to_text(self.update, self.context)
mock_voice_message_to_text.assert_awaited_once_with(self.update,
self.context)
@patch('selen.message_format')
async def test_message_format(self, mock_message_format):
await message_format(self.update, self.context)
117
482.ЧДТУ. 242240 12 01
mock_message_format.assert_awaited_once_with(self.update, self.context)
if __name__ == '__main__':
unittest.main()
Скрипт системного тестування system_test.py
import unittest
from unittest.mock import patch, AsyncMock
import sys
from unittest.mock import MagicMock
import os
import tempfile
from telegram import Update
sys.path.append('.')
from selen import (
command_start,
command_help,
command_analyze,
command_recognize_author,
command_daily_stats,
command_get_user_stats,
command_get_group_stats,
command_language,
command_set_voice_to_text,
voice_message_to_text,
message_format,
button_handler,
database_get_connection,
database_execute_query,
set_language,
custom_unidecode,
predict_video,
)
class BotSystemTestCase(unittest.TestCase):
def setUp(self):
self.update = MagicMock(Update)
self.context = MagicMock()
# Створення тимчасової директорії для тестових файлів
self.temp_dir = tempfile.TemporaryDirectory()
self.test_file_path = os.path.join(self.temp_dir.name, 'test_file.txt')
# Підготовка мок-об'єктів для бази даних
self.conn_mock = AsyncMock()
self.cursor_mock = AsyncMock()
self.conn_mock.cursor.return_value = self.cursor_mock
def tearDown(self):
self.temp_dir.cleanup()
async def test_system_integration(self):
# Мокання функцій та створення підмокованих об'єктів
with patch('selen.database_get_connection', return_value=self.conn_mock),
\
patch('selen.set_language', return_value=None):
# Тестування командного шаблону
await command_start(self.update, self.context)
await command_help(self.update, self.context)
118
482.ЧДТУ. 242240 12 01
await command_language(self.update, self.context)
# Тестування аналізу тексту
self.context.args = ['Some text']
await command_analyze(self.update, self.context)
await command_recognize_author(self.update, self.context)
# Тестування голосових повідомлень
self.update.message.voice = MagicMock()
await voice_message_to_text(self.update, self.context)
await command_set_voice_to_text(self.update, self.context)
# Тестування обробки повідомлень
self.update.message.text = 'Test message'
await message_format(self.update, self.context)
# Тестування обробки кнопок
self.update.callback_query.data = ''
await button_handler(self.update, self.context)
# Тестування статистики
self.cursor_mock.fetchall.return_value = [('User1', 10, 5, 3, 2)]
await command_daily_stats(self.update, self.context)
self.cursor_mock.fetchall.return_value = []
await command_get_user_stats(self.update, self.context)
await command_get_group_stats(self.update, self.context)
# Перевірка викликів функцій та методів
self.assertTrue(self.context.bot.send_message.called)
self.assertTrue(self.context.bot.send_photo.called)
self.assertTrue(self.cursor_mock.execute.called)
async def test_database_integration(self):
with patch('selen.connect', return_value=self.conn_mock):
conn = await database_get_connection()
self.assertEqual(conn, self.conn_mock)
await database_execute_query(conn, 'SELECT * FROM test_table')
self.assertTrue(self.cursor_mock.execute.called)
async def test_set_language(self):
self.cursor_mock.fetchone.return_value = ('',)
self.update.message.chat_id = 12345
await set_language(self.update)
self.cursor_mock.execute.assert_called_with("SELECT language FROM
groups_settings WHERE group_id = 12345")
async def test_custom_unidecode(self):
string = 'Привіт, світ! Hello, world!'
expected_output = 'Privit, svit! Hello, world!'
output = await custom_unidecode(string)
self.assertEqual(output, expected_output)
async def test_predict_video(self):
with patch('selen.predict_video') as mock_predict_video:
mock_update = MagicMock()
mock_context = MagicMock()
mock_path = 'testcontent/image-asset (1).gif'
await predict_video(mock_update, mock_context, mock_path)
119
482.ЧДТУ. 242240 12 01
mock_predict_video.assert_awaited_once_with(mock_update, mock_context,
mock_path)
if __name__ == '__main__':
unittest.main()
Скрипт приймального тестування acc.py
import os
import unittest
from unittest.mock import patch, MagicMock, mock_open
import sys
sys.path.append('.')
from selen import (
command_start, command_help, command_analyze, command_recognize_author,
command_daily_stats, command_get_user_stats, command_get_group_stats,
command_language, command_set_voice_to_text, voice_message_to_text,
message_format, button_handler, database_get_connection,
database_execute_query, set_language, custom_unidecode,
predict_image, predict_video, search, get_full_url, extract_target_url,
clear_url_params, async_llm, suppress_stdout
)
class AcceptanceTestCase(unittest.TestCase):
def setUp(self):
self.update = MagicMock()
self.context = MagicMock()
self.conn_mock = MagicMock()
self.cursor_mock = MagicMock()
self.update.effective_chat.id = 123456789
self.update.effective_user.id = 987654321
self.update.effective_user.first_name = 'John'
self.update.effective_user.last_name = 'Doe'
self.update.effective_user.username = 'johndoe'
self.update.message.chat_id = 123456789
self.update.message.from_user.id = 987654321
self.update.message.from_user.first_name = 'John'
self.update.message.from_user.last_name = 'Doe'
self.update.message.from_user.username = 'johndoe'
self.update.message.date = 1684345200 # 2023-05-17 12:00:00
self.update.message.text = '/start'
@patch('selen.connect')
async def test_command_start(self, mock_connect):
mock_connect.return_value = self.conn_mock
self.conn_mock.cursor.return_value = self.cursor_mock
self.cursor_mock.fetchone.return_value = None
await command_start(self.update, self.context)
self.context.bot.send_message.assert_awaited_once()
@patch('selen.connect')
async def test_command_help(self, mock_connect):
mock_connect.return_value = self.conn_mock
self.conn_mock.cursor.return_value = self.cursor_mock
self.cursor_mock.fetchone.return_value = ('',)
command_help(self.update, self.context)
self.context.bot.send_message.assert_called_once()
@patch('selen.connect')
120
482.ЧДТУ. 242240 12 01
async def test_command_analyze(self, mock_connect):
mock_connect.return_value = self.conn_mock
self.conn_mock.cursor.return_value = self.cursor_mock
self.cursor_mock.fetchone.return_value = ('',)
self.cursor_mock.fetchall.return_value = [('Test message',)]
self.update.message.text = '/analyze'
self.update.message.reply_to_message = MagicMock()
self.update.message.reply_to_message.from_user.is_bot = False
command_analyze(self.update, self.context)
self.context.bot.send_message.assert_called_once()
@patch('selen.connect')
@patch('selen.search')
@patch('selen.async_llm')
async def test_command_recognize_author(self, mock_async_llm, mock_search,
mock_connect):
mock_connect.return_value = self.conn_mock
self.conn_mock.cursor.return_value = self.cursor_mock
self.cursor_mock.fetchone.return_value = ('',)
mock_search.return_value = 'Search result text'
mock_async_llm.return_value = {'choices': [{'text': 'Author name'}]}
self.update.message.text = '/recognize_author Text to recognize author'
self.context.args = ['Text to recognize author']
command_recognize_author(self.update, self.context)
self.context.bot.send_message.assert_called_once()
@patch('selen.connect')
async def test_database_get_connection(self, mock_connect):
mock_connect.return_value = self.conn_mock
conn = database_get_connection()
mock_connect.assert_called_once()
self.assertEqual(conn, self.conn_mock)
@patch('selen.connect')
async def test_database_execute_query(self, mock_connect):
mock_connect.return_value = self.conn_mock
self.conn_mock.cursor.return_value = self.cursor_mock
self.cursor_mock.execute.return_value = None
self.cursor_mock.fetchall.return_value = [(1, 'test')]
result = database_execute_query(self.conn_mock, 'SELECT * FROM test')
self.cursor_mock.execute.assert_called_once_with('SELECT * FROM test',
None)
self.assertEqual(result, [(1, 'test')])
@patch('selen.connect')
async def test_set_language(self, mock_connect):
mock_connect.return_value = self.conn_mock
self.conn_mock.cursor.return_value = self.cursor_mock
self.cursor_mock.fetchone.return_value = ('',)
set_language(self.update)
self.cursor_mock.execute.assert_called_once()
@patch('selen.unidecode_expect_nonascii')
async def test_custom_unidecode(self, mock_unidecode):
121
482.ЧДТУ. 242240 12 01
mock_unidecode.side_effect = lambda x: x.encode('ascii',
'ignore').decode('ascii')
result = custom_unidecode('Тест привіт 1️2️3️')
expected_result = 'Tect prvt 123'
self.assertEqual(result, expected_result)
@patch('selen.imdecode')
@patch('selen.resize')
@patch('selen.preprocess_input')
async def test_predict_image(self, mock_preprocess_input, mock_resize,
mock_imdecode):
self.update.message.reply_to_message = MagicMock()
self.update.message.reply_to_message.photo = [MagicMock()]
self.context.bot.get_file.return_value = MagicMock()
self.context.bot.get_file.return_value.download_to_memory.return_value =
b'image_data'
mock_imdecode.return_value = 'decoded_image'
mock_resize.return_value = 'resized_image'
mock_preprocess_input.return_value = 'preprocessed_image'
self.context.bot.send_message.return_value = None
predict_image(self.update, self.context, b'image_data')
self.context.bot.send_message.assert_called_once()
@patch('selen.VideoCapture')
@patch('selen.MediaInfo')
@patch('selen.suppress_stdout')
async def test_predict_video(self, mock_suppress_stdout, mock_MediaInfo,
mock_VideoCapture):
mock_suppress_stdout.return_value = suppress_stdout()
mock_VideoCapture.return_value.get.return_value = 30.0
mock_MediaInfo.parse.return_value.tracks = [MagicMock(track_type='Video')]
self.context.bot.send_video.return_value = None
self.context.bot.send_animation.return_value = None
predict_video(self.update, self.context, 'video_path')
self.context.bot.send_video.assert_called_once() or
self.context.bot.send_animation.assert_called_once()
@patch('requests.get')
async def test_search(self, mock_get):
mock_response = MagicMock()
mock_response.text = 'Search result html'
mock_get.return_value = mock_response
mock_open_context = mock_open(read_data='{"translations": {}}')
with patch('builtins.open', mock_open_context):
result = search('search query')
self.assertIsNotNone(result)
@patch('selen.get_full_url')
async def test_clear_url_params(self, mock_get_full_url):
mock_get_full_url.return_value = 'https://www.google.com/search?q=test'
result = clear_url_params('https://www.google.com/search?q=test')
self.assertEqual(result, 'https://www.google.com/search?q=test')
async def test_get_full_url(self):
result = get_full_url('/test')
self.assertEqual(result, 'https://www.google.com/test')
async def test_extract_target_url(self):
122
482.ЧДТУ. 242240 12 01
result = extract_target_url('https://www.google.com/search?q=test')
self.assertEqual(result, 'test')
@patch('selen.llm')
async def test_async_llm(self, mock_llm):
mock_llm.return_value = 'Test result'
result = async_llm('Test input')
self.assertEqual(result, 'Test result')
@patch('sys.stdout')
async def test_suppress_stdout(self, mock_stdout):
with suppress_stdout():
print('Test output')
mock_stdout.write.assert_not_called()
if __name__ == '__main__':
unittest.main()
Скрипти створення таблиць
SAVED_MESSAGES
CREATE TABLE IF NOT EXISTS public.saved_messages
(
id bigint NOT NULL,
id_group bigint NOT NULL,
message text COLLATE pg_catalog."default",
date timestamp with time zone NOT NULL,
sticker_id text COLLATE pg_catalog."default"
);
USERS_INFO
CREATE TABLE IF NOT EXISTS public.users_info
(
user_id bigint NOT NULL,
full_name character varying COLLATE pg_catalog."default" NOT NULL,
username character varying COLLATE pg_catalog."default",
CONSTRAINT users_info_pkey PRIMARY KEY (user_id)
);
GROUPS_SETTINGS
CREATE TABLE IF NOT EXISTS public.groups_settings
(
group_id bigint NOT NULL,
language text COLLATE pg_catalog."default" NOT NULL,
speech_to_text boolean DEFAULT false,
CONSTRAINT groups_settings_pkey PRIMARY KEY (group_id)
);
123
ДОДАТОК В
Розробка telegram бота для збору і аналізу повідомлень користувачів
Інструкція користувачеві
482.ЧДТУ. 242240 34 01
Листів 5
Розробник ________________ Брус В.М.
2024
482.ЧДТУ.242240 34 01
Для початку роботи з ботом необхідно:
1 Встановити додаток Telegram через Google Play або App Store.
2 Відкрити додаток на своєму смартфоні чи планшеті.
3 Знайти бота @selen0_0_bot в пошуку або перейти за посиланням
https://t.me/selen0_0_bot.
4 Натиснути кнопку "Почати" або "Start" в залежності від мови додатку.
Після цього бот привітає вас та надасть коротку довідку про свої можливості.
Далі не обов`язково, але рекомендовано додати бота до групи, через кнопку
яка є в повідомленні надісланому після натискання кнопки почати, або вручну
через налаштування вашої групи.
Ось основні команди для взаємодії з ботом:
1 /start - початок роботи з ботом, виводить загальну інформацію, про те яка
загальна функція бота, головні команди, також має кнопку додати в групу,
по натисканні якої виводиться вікно зі списком груп того хто натиснув,
по натисканню на вибрану групу туди додається бот.
2 /help - довідка по командах, відповіддю на цю команду буде список всіх
наявних команд бота важливих, та тих які можна не використовувати,
також внизу є посилання на групу де можна залишити відгук або написати
про баг.
3 /daily_stats - проаналізувати повідомлення всіх користувачів в чаті за
день, аналізує повідомлення які були написані за день враховуючи
часовий пояс, виводить такі дані як список самих популярних фраз або
словосполучень в даній групі (рисунок 28), також є інформація про
ємоційний відтінок цих повідомлень.
125
482.ЧДТУ.242240 34 01
Рисунок В.1 – Приклад виводу команди /daily_stats
4 /language – зміна мови бота, за командоцю виводиться повідомлення з
кнопками з текстом (рисунок 29), тест це назва мови, при натисканні
кнопки з відповідним текстом мова бота зміниться.
Рисунок В.2 – Приклад виводу команди /language
5 /recognize_author [вхідні данні] – аналізує вхідні дані та виводить автора
тексту, якщо знаходить такого. Ця команда відрізняється від інших тим
що після її введення поруч потрібно вказати текст який потрібно
126
482.ЧДТУ.242240 34 01
проаналізувати, результатом виводу буде ім`я, псевдонім та також іноді
книга або новина звідки текст був взятий, рекомендується
використовувати тільки для визначення літературних діячів. (рисунок
B.3).
Рисунок В.3 – Приклад виводу команди /recognize_author
6 /voice_to_text – перетворення голосових повідомлень в текстові
Вмикає або вимикає перетворення голосових повідомлень в текст, в
включеному варіанті кожен раз коли хтось надсилає таке повідомленя в
групу, бот вивод йому текстовий еквівалент (рисунок В.4).
Рисунок В.4 – Приклад результату перетворення голосу в текст
7 /my_stats - проаналізувати повідомлення користувача в чаті за день
Виводить теж саме що й /daily_stats, але про одного користувача, і за
повідомленнями тілький в тій групі де була викликана команда.
8 При введенні тексту rate с відповіддю на повідомлення з фото, бот
проаналізує це фото та видасть емоційну оцінку текстом, де будуть
написані самі вірогідні емоції на думку нейромережі.
127
482.ЧДТУ.242240 34 01
Рисунок В.6 – Приклад результату аналізу фото нейромережою при команді
rate
9 При введенні тексту rate с відповіддю на повідомлення з відео, бот
проаналізує це відео та надішле повідомлення з цим самим відео, де
зверху буде написана сама вірогідна емоція та полоска яка вказує
впевненість нейромережі в цій емоції.
Рисунок В.7 – Приклад результату аналізу відео нейромережою
128
ДОДАТОК Г
Розробка telegram бота для збору і аналізу повідомлень користувачів
Графічні матеріали
482.ЧДТУ. 242240 90 01
Листів 12
Розробник ________________ Брус В.М.
2024
482.ЧДТУ. 242240 90 01
Рисунок Г.1 – Слайд 1
Рисунок Г.2 – Слайд 2
130
482.ЧДТУ.242240 90 01
Рисунок Г.3 – Слайд 3
Рисунок Г.4 – Слайд 4
131
482.ЧДТУ.242240 90 01
Рисунок Г.5 – Слайд 5
Рисунок Г.6 – Слайд 6
132
482.ЧДТУ.242240 90 01
Рисунок Г.7 – Слайд 7
Рисунок Г.8 – Слайд 8
133
482.ЧДТУ.242240 90 01
Рисунок Г.9 – Слайд 9
Рисунок Г.10 – Слайд 10
134
482.ЧДТУ.242240 90 01
Рисунок Г.11 – Слайд 11
Рисунок Г.12 – Слайд 12
135
482.ЧДТУ.242240 90 01
Рисунок Г.13 – Слайд 13
Рисунок Г.14 – Слайд 14
136
482.ЧДТУ.242240 90 01
Рисунок Г.15 – Слайд 15
Рисунок Г.16 – Слайд 16
137
482.ЧДТУ.242240 90 01
Рисунок Г.17 – Слайд 17
Рисунок Г.18 – Слайд 18
138
482.ЧДТУ.242240 90 01
Рисунок Г.19 – Слайд 19
Рисунок Г.20 – Слайд 20
139
482.ЧДТУ.242240 90 01
Рисунок Г.21 – Слайд 21
Рисунок Г.22 – Слайд 22
Рисунок Г.23 – Слайд 23
140