Будь ласка, використовуйте цей ідентифікатор, щоб цитувати або посилатися на цей матеріал: https://er.chdtu.edu.ua/handle/ChSTU/8847
Назва: Розробка telegram бота для збору і аналізу повідомлень користувачів
Автори: Немов, Руслан Григорович
Брус, Владислав Максимович
Ключові слова: TELEGRAM-БОТ;АНАЛІЗ ТЕКСТІВ;ОБРОБКА ПРИРОДНОЇ МОВИ;МАШИННЕ НАВЧАННЯ;МЕСЕНДЖЕР;АРХІТЕКТУРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ;СТАТИСТИКА;TELEGRAM BOT;TEXT ANALYSIS;NATURAL LANGUAGE PROCESSING;MACHINE LEARNING;MESSENGER;SOFTWARE ARCHITECTURE;STATISTICS
Дата публікації: 12-чер-2024
Короткий огляд (реферат): АНОТАЦІЯ Виконавець: Брус Владислав Максимович Назва квалифікаційної бакалаврської роботи: Telegram бот для збору і аналізу повідомлень користувачів Спеціальність: 121 «Інженерія програмного забезпечення» Установа: Черкаський державний технологічний університет Місто, рік: Черкаси, 2024 рік. Основні ідеї - Створення 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.
URI (Уніфікований ідентифікатор ресурсу): https://er.chdtu.edu.ua/handle/ChSTU/8847
Розташовується у зібраннях:121 Інженерія програмного забезпечення (Інженерія програмного забезпечення)

Файли цього матеріалу:
Файл Опис РозмірФормат 
Кваліфікаційна робота бакалавра Брус Владислав Максимович.pdf
  Restricted Access
4.37 MBAdobe 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