Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 54

Міністерство освіти і науки України

Київський національний університет імені Тараса Шевченка


Кафедра програмних систем і технологій

ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ ОЦІНЮВАННЯ КОМФОРТНОСТІ


КЛІМАТИЧНИХ УМОВ

Курсова робота

Пояснювальна записка

Виконавець
студент групи ІПЗ-32 __________________ Дмитро НАГІРНЯК
(підпис, дата)

Керівник
асистент кафедри ПСТ __________________ Єлизавета ЖАБСЬКА
(підпис, дата)

Київ – 2023
ЗАВДАННЯ НА КУРСОВУ РОБОТУ

1. Тема курсової роботи: «Програмне забезпечення оцінювання комфортності


кліматичних умов».
Науковий керівник курсової роботи: асистент кафедри програмних систем і
технологій Єлизавета ЖАБСЬКА
2. Термін подання студентом курсової роботи: 11.06.2023 р.
3. Зміст пояснювальної записки: аналіз проблеми оцінки комфортності кліматичних
умов та огляд наявних аналогів, опис предметної області та визначення специфікації
вимог до застосунку; оцінка точності наявних сервісів для надання прогнозу погоди
та проектування застосунку, розробка архітектури програмної системи та структури
програмного забезпечення; програмна реалізація застосунку; опис роботи
застосунку.
4. Дата видачі завдання: 27.01.2023 р.

2
АНОТАЦІЯ

У даній курсовій роботі представлено програмне забезпечення оцінювання та


прогнозування комфортності погодних умов. Описано детально реалізацію
запропонованої системи, огляд аналогів та вихідний продукт.
У ході роботи досліджені моделі, здатні передбачати комфортність погодних
умов на основі наявних даних. Обрана найкраща модель для здійснення поставленої
мети.
Результати роботи будуть корисними для користувачів Telegram, які шукають
зручний спосіб отримати прогноз комфортності погоди. Бот може бути
використаний для підтримки прийняття рішень щодо активностей на відкритому
повітрі, планування відпочинку або підготовки до певних заходів.

3
ЗМІСТ

Вступ..........................................................................................................................................................5
1.Інформаційний огляд.............................................................................................................................7
1.1. Огляд проблематики .........................................................................................................................7
1.2 Огляд останніх рішень .......................................................................................................................9
1.3 Дослідження ресурсів ..................................................................................................................... 18
2.Методи розрахунку коефіціенту комфортності .................................................................................. 20
3. Технології розв’язку поставленої задачі ..........................................................................................30
3.1. Постановка задачі ...........................................................................................................................30
3.2. Структурно-функціональне моделювання процесів ...................................................................31
3.3. Діаграма варіантів використання ..................................................................................................33
4. Програмна реалізація..........................................................................................................................35
4.1. Вибір засобів програмної реалізації ..............................................................................................35
4.1.1 Мова програмування......................................................................................................................35
4.1.2 Середовище розробки.................................................................................................................... 36
4.2 Опис розроблених методів...............................................................................................................38
4.3 Результати роботи ............................................................................................................................39
4.3 Висновок ...........................................................................................................................................43
5. Список викорастаних джерел............................................................................................................44
Додаток А – Приклади кодової бази.....................................................................................................45

4
Вступ
Погода завжди відігравала важливу роль у житті суспільства. Клімат, погода
та природні явища можуть мати різний вплив, починаючи від вибору одягу на
наступний день або планування відпустки найближчим часом, й закінчуючи
кількістю жертв, зумовлених стихійними лихами. Погодні умови також мають
вплив на самопочуття кожної окремої людини, оскільки зміни в погоді можуть
викликати підвищення або зниження тиску, алергічні реакції або впливати на
психічний стан.

Головна мета полягає у створенні ефективного та зручного інструменту, який


забезпечить користувачам доступ до прогнозів комфортності погоди через
платформу Telegram.

У ході роботи будуть використані методи прогнозування та обробки даних для


створення моделі прогнозу комфортності погодних умов. Бот буде отримувати
інформацію про погодні параметри, такі як температура, вологість та швидкість
вітру, і на їх основі робити прогнози щодо комфортності для користувачів.
Окрім того, в роботі буде звернута увага на розробку зручного інтерфейсу
бота, щоб користувачі могли легко інтерактивно взаємодіяти з ним. Бот буде
надавати зручний спосіб отримання прогнозів комфортності погоди в режимі
реального часу.

Результати даної роботи будуть корисними для широкого кола користувачів,


які бажають отримувати інформацію про комфортність погодних умов. Бот може
бути використаний для прийняття рішень щодо зовнішніх активностей, планування
маршрутів, вибору одягу та взуття, а також оптимізації енергоспоживання в
будівлях.
Розробка програмного забезпечення в формі Telegram бота для
прогнозування комфортності погодних умов має на меті забезпечити користувачам
зручний та надійний інструмент для отримання актуальної інформації про
5
комфортність погоди, що сприятиме покращенню їхнього благополуччя та
зручності.

Це підкреслює важливість розуміння впливу погоди на самопочуття та


прийняття відповідних заходів для підтримки фізичного та емоційного
благополуччя в різних погодних умовах. Тому прогноз погоди є значною та
актуальною проблемою, розв'язання якої є важливим для суспільства.

6
1.Інформаційний огляд
1.1. Огляд проблематики

Погода може впливати на самопочуття людини на різних рівнях, як


фізичному, так і емоційному. Цей вплив може бути прямим та непрямим, і залежить
від різних факторів, таких як температура, вологість повітря, атмосферний тиск,
швидкість вітру та інші метеорологічні умови.
Фізичний вплив погоди на самопочуття може виявлятися у відчуттях
комфорту або дискомфорту. Наприклад, висока температура може спричинити
перевантаження організму, втому та втому, особливо при тривалій експозиції на
сонце або у важких умовах жари. З іншого боку, низькі температури можуть
викликати холод, озноб та дискомфорт, особливо без належного одягу або у вологих
умовах.
Погода також може впливати на роботу органів та систем організму. Також,
зміни вологості повітря можуть впливати на роботу дихальної системи, особливо у
людей з астмою або іншими захворюваннями дихальних шляхів.
Емоційний вплив погоди може бути відчутним у формі зміни настрою,
емоційного стану та поведінки. Наприклад, сонячна погода може підвищити настрій,
збільшити енергію та активність, покращити настроєвий стан. З іншого боку,
похмура або дощова погода може спричинити почуття сумніву, зниження енергії,
апатію та роздратованість.
Деякі люди можуть переносити погодні зміни легко, тоді як інші можуть бути
більш вразливими та відчувати більш помітний вплив на своє самопочуття.
У зв'язку з цим, що існує багато рішень для отримання прогнозу погоди, які
задовольняють потреби більшості користувачів, зручність сервісів стає все
важливішою. За останні 10 років соціальні мережі неухильно збільшували свою
популярність, а особливо вражаючим є зростання популярності месенджера
Telegram, який упродовж останніх 3 років увійшов до топ-10 найпопулярніших
соціальних мереж в Україні за даними компанії Research & Branding Group . На
початку 2020 року найпопулярнішими соціальними мережами в Україні були
Facebook (58% усіх респондентів), YouTube (41%), Instagram (28%) і Telegram (14%).
Популярність Telegram зумовлена не тільки захищеністю особистих даних
користувачів, але і різноманітністю функцій, які він надає. Крім спілкування в
приватних чатах та групових конференціях до 100 000 учасників, Telegram дозволяє
створювати та переглядати канали, а також здійснювати дзвінки. Для користувачів,
які активно працюють у сфері інформаційних технологій, Telegram надає
безкоштовний API для створення ботів.
Боти - це зовнішні програми, які працюють в Telegram. Вони виглядають як
облікові записи, що керуються програмами, а їх основна функція - автоматично
реагувати на команди, введені користувачами. Таким чином, працюючи через
інтерфейс Telegram, боти імітують дії живих користувачів, що робить їх
використання зручним і зрозумілим. Враховуючи актуальність цієї проблеми, метою
даної роботи є створення телеграм-бота для аналізу прогнозу погоди на основі даних
метеорологічного сервісу та прогнозування комфортності цієї погоди
для користувача.
1.2. Огляд останніх рішень

На сьогоднішній день існує широкий вибір сервісів, які дозволяють отримати


прогноз погоди. Ці сервіси відрізняються у способі реалізації та наданій інформації
для користувачів. Наприклад, серед зарубіжних веб-ресурсів можна виділити
Weather.com - англомовний ресурс від оператора кабельного і супутникового
телебачення з США, Accuweather.com (Рисунок 1.1) та Darksky.net. Українські веб-
сайти, такі як Sinoptik.ua (Рисунок 1.2), Gismeteo.ua (Рисунок 1.3), Meteoprog.ua
(Рисунок 1.4) , meteo.ua та інші, також надають прогноз погоди.

Крім того, існують популярні додатки для платформ Android та iOS, які дозволяють
отримати прогноз погоди. Деякі з них включають 1Weather, AccuWeather,
Yahoo.Weather.

Рисунок 1.1 – Сайт Accuweather.com

9
Рисунок 1.2 – Сайт Sinoptik.ua

Рисунок 1.3 – Сайт Gismeteo.ua

10
Рисунок 1.4 – Сайт Meteoprog.ua

11
Існує багато сервісів по прогнозуванню погоди в інтрнеті, але хотілося б
розглянути найкращих представників з них детальніше та подивитися з якими
алгоритмами та методами аналізу вони працюють:
1. Weather Underground

Рисунок 1.5 – Сайт Weather Underground

Weather Underground є одним з найпопулярніших і найбільш відомих сервісів, який


надає користувачам інформацію про погоду на всіх континентах світу. Він пропонує
докладну та актуальну інформацію про погоду, що забезпечується за допомогою
мережі датчиків, розміщених по всьому світу.
Weather Underground дозволяє користувачам переглядати дані про погоду на
сьогоднішній день, на завтрашній день, на тиждень та на місяць. Крім того, сервіс
надає додаткові функції, такі як сповіщення про погодні умови та їх зміни, а також
можливість встановити погодний агент на мобільному пристрої або веб-сторінці.

12
Weather Underground забезпечує детальну інформацію про погоду, включаючи
температуру повітря, швидкість вітру, вологість, атмосферний тиск, опади та інші
показники, що необхідні для оцінки комфортності кліматичних умов.
Всі ці дані збираються зі станцій моніторингу, які встановлюються по всьому світу, і
опрацьовуються з використанням спеціальних алгоритмів, що дозволяє забезпечити
максимальну різноманітність інформації.
Weather Underground використовує різні методи та алгоритми для
забезпечення точності та надійності своїх прогнозів.
Основні методи та алгоритми, які використовуються в системі, описані нижче:
• Аналіз повітряних мас: Weather Underground здійснює аналіз повітряних мас,
щоб визначити, які типи погоди можуть бути пов'язані з кожною масою. Це
дає змогу зрозуміти, які умови впливають на погодні явища в конкретному
регіоні.
• Аналіз гідрометеорологічних даних: Weather Underground використовує
гідрометеорологічні дані, такі як температура повітря, вологість, тиск, опади
та інші, щоб зрозуміти поточні погодні умови та передбачити їх зміну в
майбутньому.
• Моделювання погоди: Weather Underground використовує різні моделі погоди,
щоб дати прогноз погоди на майбутнє. Вони використовують моделі, такі як
Global Forecast System (GFS) та North American Mesoscale (NAM), щоб
отримати прогноз погоди на різні терміни, від годин до декількох днів.
• Аналіз супутникових та радіолокаційних зображень: Weather Underground також
використовує дані з супутникових та радіолокаційних зображень, щоб
отримати інформацію про рух хмар, вітрові напрямки та інші погодні явища.
• Використання штучного інтелекту: Weather Underground використовує штучний
інтелект для аналізу даних та підвищення точності прогнозів.

13
2. Dark Sky
Ця метеорологічна служба пропонує різноманітні інструменти для візуалізації та
прогнозування погоди, включаючи додатки для мобільних пристроїв та веб-сайти.
Крім того, Dark Sky забезпечує API, яке дозволяє розробникам інтегрувати дані про
погоду у свої додатки та веб-сайти.
Однією з унікальних рис Dark Sky є її здатність прогнозувати час до дощу з
точністю до хвилини на конкретному місці. Це забезпечується за допомогою
алгоритму, який аналізує дані про повітря, температуру та інші показники, щоб
визначити місце та час дощу.
Ще один алгоритм, який використовує Dark Sky, - це "Мікроклімат". Він
аналізує дані з більш ніж 200 тисяч метеостанцій по всьому світу та враховує різні
фактори, такі як тип місцевості та висота над рівнем моря, щоб дати більш точний
прогноз для конкретної локації.

Dark Sky використовує різні методи та алгоритми для передбачення погоди. Основні
з них:
• Метеорологічні моделі: Dark Sky використовує глобальні моделі погоди, такі як
GFS (Global Forecast System) та NAM (North American Mesoscale) для
отримання загальної карти погоди. Ці моделі базуються на чисельних методах
та фізичних принципах, щоб передбачити температуру, вітер, хмарність та
інші метеорологічні параметри.
• Радарна технологія: Dark Sky також використовує радарні дані, які збираються з
різних метеорологічних джерел, щоб відслідковувати рух хмар та
передбачити, коли до певного регіону наближатимуться дощі чи сніг.
• Аналіз даних за допомогою машинного навчання: Dark Sky використовує
нейронні мережі та інші методи машинного навчання для аналізу великої
кількості даних погоди та покращення точності передбачень. Наприклад,
система використовує глибинне навчання (deep learning), щоб відслідковувати
хмари та передбачати різноманітні метеорологічні події, такі як зливи або
град.
14
• Аналіз показників на основі геоданих: Dark Sky використовує геодані, щоб
збирати дані про погоду з різних джерел, таких як метеорологічні станції,
супутники та засоби збору даних на землі. Система обробляє ці дані та
здійснює аналіз показників, таких як вологість, тиск та інші, щоб покращити
точність передбачень.

3. AccuWeather
AccuWeather (Рисунок 1.1) - це популярний сервіс погоди, який надає користувачам
актуальну інформацію про погоду, прогнози та різноманітні функції пов'язані зі
здоров'ям, подорожами, спортом та іншими сферами життя.

Однією з головних послуг, що надає AccuWeather, є прогнози погоди, які базуються


на використанні різних методів та алгоритмів. Деякі з них включають:
• Моделювання погоди: AccuWeather використовує низку різних математичних
моделей для прогнозування погоди. Ці моделі включають у себе статистичні
методи, чисельні алгоритми та фізичні закони. Дані з різних джерел, таких як
супутники та метеостанції, аналізуються та використовуються для розрахунку
моделей.
• Аналіз даних: Крім моделювання, AccuWeather збирає, обробляє та аналізує
велику кількість даних з різних джерел, щоб встановити тенденції та
залежності між різними показниками погоди.
• Штучний інтелект: AccuWeather використовує штучний інтелект та машинне
навчання для прогнозування погоди. Ці технології дозволяють системі
навчатися на основі даних про погоду та встановлювати залежності між
різними показниками.
• Гідрометеорологічні дослідження: Компанія також здійснює
гідрометеорологічні дослідження та аналіз впливу погоди на різні сфери
життя, такі як сільське господарство, енергетика, транспорт та туризм.

15
Основні функції AccuWeather:
• Прогноз погоди. AccuWeather надає користувачам точний інформаційний
прогноз погоди на кожен день, який оновлюється кожну годину.

• Карти погоди. Сервіс надає користувачам інтерактивні карти, які дозволяють


бачити погодні умови в різних частинах світу в режимі реального часу.
• Функції пов'язані зі здоров'ям. AccuWeather містить спеціальні розділи про
погодні умови, які можуть вплинути на здоров'я людей, наприклад, алергії,
грип та інші захворювання.
• Подорожі. Сервіс дозволяє планувати подорожі, надаючи інформацію про
погодні умови та кліматичні зміни в різних регіонах світу.
• Спорт. AccuWeather надає користувачам інформацію про погодні умови та
кліматичні зміни, які можуть вплинути на спортивні події, наприклад,
футбольні матчі, гольф та інші.
• Радар погоди. AccuWeather має спеціальний розділ з радаром погоди, який
дозволяє користувачам відстежувати рух хмар, опадів та інших погодних
явищ в режимі реального часу.

4. Gismeteo
Це український сервіс прогнозу погоди, який надає актуальну інформацію про
погодні умови та кліматичні показники у більш ніж 100 країнах світу. Система має
багатий функціонал, який дозволяє користувачам отримати детальну інформацію
про погоду в різних регіонах, а також про прогноз на найближчі дні.
Однією з головних функцій Gismeteo є надання інформації про погодні умови.
Система використовує аналітичні дані, які надходять з більш ніж 40 тисяч станцій
моніторингу по всьому світу. Крім того, Gismeteo використовує сучасні алгоритми
та моделі прогнозування погоди, що дозволяє досить точно передбачати погодні
умови на найближчі дні.
Окрім прогнозу погоди, Gismeteo надає користувачам детальну інформацію
про кліматичні умови в різних регіонах. Користувачі можуть переглядати
16
інформацію про температуру повітря, вологість, тиск, швидкість вітру та інші
показники в різних місцях. Також в системі доступні інтерактивні карти, які
дозволяють користувачам відслідковувати зміни погодних умов на великій
території.

Для прогнозування погоди Gismeteo використовує різноманітні методи та


алгоритми, такі як:
 Моделювання погодних умов - Gismeteo використовує численні методи для
моделювання поведінки атмосфери, такі як чисельні моделі прогнозування
погоди. Ці моделі використовуються для прогнозування погодних умов на
короткі та довгі періоди часу.
 Супутникова зйомка - Gismeteo використовує дані з супутників для
визначення погодних умов. Ці дані використовуються для визначення
масштабу погодних явищ, таких як урагани, шторми, туман та ін.
 Аналіз метеорологічних даних - Gismeteo використовує аналіз
метеорологічних даних для прогнозування погодних умов. Ці дані
включають в себе інформацію про температуру, вологість, тиск, швидкість
вітру та інші параметри.
 Машинне навчання - Gismeteo використовує технології машинного
навчання для покращення точності прогнозів погоди. Ці технології
дозволяють системі вчитися на основі історичних даних про погоду та
підвищувати точність прогнозування.
 Прогнозування туману - Gismeteo має власну технологію прогнозування
туману. Ця технологія базується на статистичних даних та даних
метеорологічних станцій.

17
1.3. Дослідження ресурсів

Різні сервіси надають різну інформацію щодо прогнозу погоди. Похибки під
час аналізу прогнозу – неминуче явище. Для того, щоб порівняти точність прогнозу
різних сервісів використовувався ресурс rp5.ua, що представляє собою щоденник
погоди (Рисунок 1.6). Під час дослідження дані про прогноз погоди збиралися з
наступних джерел:
1. Sinoptik.ua
2. Gismeteo.ua
3. Meteoprog.ua
4. Accuweather.com

Рисунок 1.5 – Сайт rp5.ua

18
З кожного джерела отримувався прогноз погоди для міста Київ. Порівняння
проводилося за наступними критеріями: виправданість прогнозу температури та
прогнозу імовірності опадів. Спостереження проводилися у період з 15 по 30 травня.
Імовірності виправданості розраховувались як залишок від відсоткової різниці між
прогнозами метеорологічних сервісів та реальними показниками, збереженими
вкінці спостережень. Результати випробувань наведені у таблиці 1.1 та таблиці
1.2.

Таблиця 1.1 – Виправданість прогнозу температури


Джерело прогнозу Імовірність виправданості прогнозу у
Києві, %
Sinoptik 92.5
Gismeteo 89.36
Meteoprog 92.3
Accuweather 93.33

Таблиця 1.2 – Середнє значення прогнозу імовірності опадів у дні коли опади
спостерігались та імовірність вдалого прогнозу опадів

Джерело Середнє значення прогнозу Імовірність вдалого прогнозу


прогнозу імовірності опадів, % опадів, %
Sinoptik 45.2 73.6
Gismeteo 60.3 55.3
Meteoprog 55.7 59.7
Accuweather 37.4 95

За результатами випробувань можна зробити висновок, що серед


досліджених сервісів прогнозу погоди найбільш точним виявився сайт
Accuweather.

19
2. Методи розрахунку коефіціенту комфортності

Для розробки програмного забезпечення, яке оцінює комфортність погодних умов,


можна використати різні методи і алгоритми. Основні методи, які можуть бути
використані, включають:

• Аналіз метеорологічних даних: для оцінювання комфортності кліматичних умов


на вулиці потрібно зібрати велику кількість метеорологічних даних, таких як
температура повітря, вологість, швидкість вітру, атмосферний тиск та інші.
Після цього потрібно проаналізувати ці дані та побудувати залежності між
ними. Для цього можна використати статистичні методи, такі як кореляційний
аналіз, регресійний аналіз.

• Визначення показників теплового комфорту: для визначення комфортності


кліматичних умов на вулиці можна використати різні показники теплового
комфорту, такі як індекс термічного комфорту (Heat Index), індекс
охолодження вітром (Wind Chill Index), індекс гріючої потужності
сонячної радіації (Solar Radiative Heat Index) та інші. Для розрахунку цих
показників можна використати математичні формули та алгоритми, які вже
існують.

• Метод Піхта: цей метод базується на оцінці ступеня комфортності за допомогою


індексу термічного дискомфорту, який визначається за допомогою
фізіологічних параметрів людини, таких як температура тіла, вологість та
інші. Цей метод використовується в багатьох країнах світу для визначення
комфортності кліматичних умов.

• Метод PET (Physiologically Equivalent Temperature): цей метод базується на ідеї,


що людина відчуває однаковий комфорт, коли значення температури,
вологості, швидкості вітру та інших факторів знаходяться в певному
20
співвідношенні. PET визначається як температура повітря, яка б мала бути,
щоб забезпечити такий самий ступінь комфорту, як при поточних погодних
умовах.

• Метод UTCI (Universal Thermal Climate Index): цей метод базується на


використанні термофізіологічних моделей та враховує вплив різних факторів
на терморегуляцію людини. UTCI визначається як температура повітря, яка б
забезпечувала такий самий ступінь термічного комфорту, як при поточних
погодних умовах.

• Індекс WBGT (Wet Bulb Globe Temperature): Цей метод враховує температуру
вологого термометра, температуру глобуса і температуру сухого термометра
для визначення комфортності умов. Він широко використовується на
спортивних заходах і в промислових галузях для оцінки ризику перегріву
організму.

• Індекс THI (Temperature-Humidity Index): Цей індекс враховує температуру


повітря і відносну вологість для визначення комфортності умов. Він часто
використовується в аграрних дослідженнях для оцінки стресу у тварин.

• Індекс HI (Heat Index): Цей індекс враховує температуру повітря і відносну


вологість для визначення комфортності умов, особливо щодо теплового
стресу. Він використовується в метеорології та громадському здоров'ї.

• Індекс AT (Apparent Temperature): Цей індекс враховує температуру повітря,


відносну вологість, швидкість вітру та інші фактори для визначення
комфортності умов для людини. Він широко використовується в
метеорологічних службах для надання прогнозів погоди.

21
• Індекс PMV/PPD (Predicted Mean Vote/Percent Predicted Dissatisfied): Цей індекс
використовується для оцінки комфорту у внутрішніх приміщеннях. Він
враховує різні параметри, такі як температура, вологість, швидкість повітря,
одяг та активність людини для передбачення оцінки комфорту та відсотку
незадоволених людей.

Метод Піхта є одним із найпоширеніших методів для визначення


комфортності кліматичних умов на вулиці. Він був розроблений в 1970-х роках
німецьким дослідником Гансом Піхтом і дотримується теорії теплового балансу
організму людини.

Формула для розрахунку індексу термічного комфорту за методом Піхта виглядає


наступним чином:

PTC=0.72×Ta+0.4×(Tr−10)+4.89×104v2−3.2

де:
T_a - температура повітря в градусах Цельсія;
T_r - температура радіаційної поверхні в градусах Цельсія;
v - швидкість вітру в метрах за секунду.

Значення індексу термічного комфорту за методом Піхта може приймати значення


від -10 до 50, де більші значення вказують на більш комфортні умови.

Метод PET (Physiological Equivalent Temperature) - це метод оцінки термічного


комфорту на основі фізіологічних відчуттів людини. Він був розроблений в Японії в
1970-х роках та базується на визначенні еквівалентної температури, яка відображає
те, яку температуру повітря та вологість має бути для того, щоб людина відчувала
22
комфорт.

Основна формула методу PET має наступний вигляд:

PET = Ta - (1 - fcl) [(Ta - 10) √(es - ea)] - 0.3(v - 0.5) — 1.4

де:

Ta - температура повітря в градусах Цельсія;


fcl - одяг людини (від 0 до 1, де 0 - повна відкритість, 1 - повна закритість);
es - насичена водяна пара при температурі повітря;
ea - фактичний вміст водяної пари в повітрі;
v - швидкість вітру в м/с.

Значення PET менше 0 говорить про відчуття холоду, від 0 до 20 - про


комфортні умови, від 20 до 30 - про легкий дискомфорт, від 30 до 40 - про
серйозний дискомфорт, а значення більше 40 говорить про небезпечні умови для
здоров'я.

Метод PET є більш точним за методом Піхта, оскільки враховує більшу


кількість факторів, таких як відносну вологість, а також ступінь одягу.

Метод UTCI (Universal Thermal Climate Index) - це метод, який враховує


більше факторів, які впливають на комфортність кліматичних умов. Він
розроблений на основі фізіологічних та метеорологічних досліджень та описує, як
людський організм реагує на різні погодні умови.

Індекс UTCI визначається за формулою:

UTCI = Ta + (a1 + a2V^0.5 + a3V - a4w)(H - 10) / 10

23
де:
Ta - температура повітря,
V - швидкість вітру,
w - насиченість водяної пари в повітрі,
H - відносна вологість повітря,
а1-а4 - коефіцієнти, що залежать від рівня фізіологічного навантаження та статі
людини.

Значення UTCI вимірюється в градусах Цельсія. Для рівня фізичного


навантаження використовуються три рівні: спокійний, помірний та інтенсивний.

UTCI залежить від температури повітря, відносної вологості та швидкості вітру.

Є різні зони термічної зручності:

• зона тепла, коли UTCI менше -9 °C;

• зона комфорту, коли UTCI знаходиться в межах від -9 до 26 °C;

• зона тепластресу, коли UTCI перевищує 26 °C;

• зона тяжкого теплового стресу, коли UTCI перевищує 38 °C.

Індекс WBGT (Wet Bulb Globe Temperature) - це метод визначення


комфортності погодних умов, який враховує температуру вологого термометра,
температуру глобуса і температуру сухого термометра. Цей показник широко
використовується на спортивних заходах, у промисловості та в інших сферах для
оцінки ризику перегріву організму.

Формула для розрахунку індексу WBGT зазвичай має такий вигляд:

WBGT = 0.7Twb + 0.2Tg + 0.1Ta

24
де:

Twb - температура вологого термометра (у градусах Цельсія)


Tg - температура глобуса (у градусах Цельсія)
Ta - температура повітря (у градусах Цельсія)

Температура вологого термометра (Twb) вимірюється за допомогою


термометра, який обернений у вологу ганчірку і вітерець. Він враховує вплив
вологості повітря на організм.

Температура глобуса (Tg) вимірюється за допомогою глобусного термометра, який


має чорний кулястий датчик. Він враховує вплив теплового випромінювання на
організм.

Температура повітря (Ta) - це просто температура навколишнього повітря, яка може


бути виміряна звичайним термометром.

Значення індексу WBGT і їх інтерпретація можуть варіюватися в залежності від


контексту та застосування. Зазвичай, чим вище значення індексу WBGT, тим більше
ризик перегріву і теплового стресу для людей.

Індекс THI (Temperature-Humidity Index) - це метод визначення комфортності


погодних умов, який враховує температуру повітря та вологості. Цей показник
широко використовується для оцінки впливу тепла та вологості на організм людини
і встановлення рівня теплового стресу.

Формула для розрахунку індексу THI має такий вигляд:

THI = T + 0.36(T - 55)(1 - RH/100)

де:

T - температура повітря (у градусах Цельсія)

RH - відносна вологість повітря (у відсотках)

25
За допомогою цієї формули, індекс THI враховує ефект вологості на відчуття
температури. Чим вище значення індексу THI, тим більше ризик теплового стресу
для людини.

Інтерпретація значень індексу THI може варіюватися, але загальною практикою є


наступне:

• THI менше 70: комфортні умови

• THI 70-75: легкий дискомфорт

• THI 75-80: помірний дискомфорт

• THI 80-85: значний дискомфорт

• THI більше 85: небезпечні умови, можливий тепловий стрес

Індекс THI допомагає встановити рекомендації щодо заходів безпеки та захисту від
теплового стресу, таких як вживання води, уникання фізичних навантажень у гарячу
частину дня та застосування захисного спорядження.

Індекс HI (Heat Index) - це метод визначення комфортності погодних умов,


який враховує взаємодію температури повітря та вологості. Цей показник
використовується для оцінки впливу тепла на організм людини та визначення
ризику перегріву.

Формула для розрахунку індексу HI має такий вигляд:

HI = c1 + c2T + c3RH + c4TRH + c5T^2 + c6RH^2 + c7T^2RH + c8TRH^2 +


c9T^2RH^2

де: HI - індекс Heat Index T - температура повітря (у градусах Цельсія) RH - відносна


вологість повітря (у відсотках) c1, c2, ..., c9 - коефіцієнти, що враховують взаємодію
факторів

За допомогою цієї формули, індекс HI враховує ефект вологості на відчуття


температури. Чим вище значення індексу HI, тим більше ризик перегріву та
дискомфорту для людини.

26
Інтерпретація значень індексу HI зазвичай використовує наступні категорії:

• HI менше 27: комфортні умови

• HI 27-32: помірний стрес від тепла

• HI 32-41: помірний ризик перегріву

• HI 41-54: значний ризик перегріву

• HI більше 54: небезпечні умови, можливі теплові удари

Індекс AT (Apparent Temperature) - це метод визначення комфортності


погодних умов, який враховує взаємодію температури повітря, вологості та
швидкості вітру. Цей показник використовується для оцінки того, як температура
сприймається організмом людини.

Формула для розрахунку індексу AT базується на показнику температури, вологості


та швидкості вітру. Індекс AT можна обчислити за допомогою такої формули:

AT = c1 + c2T + c3V + c4TV + c5T^2 + c6V^2 + c7T^2V + c8TV^2 + c9T^2V^2

де: AT - індекс Apparent Temperature T - температура повітря (у градусах Цельсія) V


- швидкість вітру (у метрах за секунду) c1, c2, ..., c9 - коефіцієнти, які враховують
взаємодію факторів

Індекс AT допомагає врахувати вплив вологості та швидкості вітру на


сприйняття температури організмом. Він враховує, як ці фактори впливають на
відчуття комфорту чи дискомфорту для людини.

Інтерпретація значень індексу AT може варіюватися в залежності від країни та


контексту використання. Зазвичай використовуються наступні категорії:

• AT менше 18: комфортні умови

• AT 18-24: помірний дискомфорт

• AT 25-32: помірний ризик перегріву


27
• AT 33-41: значний ризик перегріву

• AT більше 41: небезпечні умови, можливі теплові удари

Індекс PMV/PPD (Predicted Mean Vote/Percent Predicted Dissatisfied) - це метод


оцінки комфортності погодних умов, який враховує не лише температуру повітря,
але і такі фактори, як вологість, швидкість повітря, тепловтечіння та активність
людини. Цей показник використовується для визначення комфортних параметрів у
приміщеннях та проектування ефективної системи кондиціювання.

Формула для розрахунку індексу PMV базується на залежностях між


температурою повітря, вологістю, швидкістю повітря та іншими факторами.
Розрахунок індексу PMV використовує таку формулу:

PMV = (0.303 * емпіричне - 0.028) * Q_m + (0.028 * емпіричне - 0.386) * М - (0.028 *


емпіричне - 0.386) * М - W + 3.96 * 10^(-8) * F_cl * (T_cl^4 - Т^4) + fcl * hcl * (T_cl -
Т) - 0.0023 * М * (5417 - 1.006 * М) - 0.42 * (М - 58.15)

де:

PMV - індекс Predicted Mean Vote (передбачене середнє значення оцінки)


Q_m - тепловтечіння (в кілокалоріях на годину на метр квадратний)
М - метаболічна енергія (в кілокалоріях на годину на метр квадратний)
W - вплив одягу (в кілотекселях)
F_cl - дія випромінювання одягу (в кілотекселях)
T_cl - температура одягу (в градусах Цельсія)
Т - температура повітря (в градусах Цельсія)
fcl - площа тіла, покрита одягом (у долях одиниці)
hcl - коефіцієнт теплопровідності одягу емпіричне - емпіричний коефіцієнт, який
залежить від швидкості повітря, вологості та інших факторівчд

Індекс PMV оцінює комфортність умов за шкалою від -3 до +3, де:

• Значення PMV від -3 до -2 вказує на значний дискомфорт через холод


• Значення PMV від -2 до -1 вказує на помірний дискомфорт через холод
• Значення PMV від -1 до +1 вказує на комфортні умови
• Значення PMV від +1 до +2 вказує на помірний дискомфорт через спеку
28
• Значення PMV від +2 до +3 вказує на значний дискомфорт через спеку

Індекс PPD (Percent Predicted Dissatisfied) використовується для визначення


ймовірності задоволення людей умовами комфорту. Зазвичай, якщо PPD менше
10%, вважають, що умови комфортні для більшості людей.

Розрахунок індексу PMV/PPD вимагає точних значень факторів, таких як


температура повітря, вологість, швидкість повітря, метаболічна активність людини
та інші параметри, тому використання цього методу часто пов'язане з
вимірюваннями та складними розрахунками.

Взагалом оглянувши усі можливі методи та індекси для розрахунку було


обрано саме метод PET. У інших методах наприклад у методі Піхта
використовується “температура радіаційної поверхні в градусах Цельсія”,
отримання цього значення з відкритих джерел для конкретного місця є неможливим,
а запитувати у користувача цього значення є недоречним. У інших методах також
багато змінних які складно взяти з відкритих джерел або запитувати у користувача.
Саме тому для його зручності було обрано метод PET. Едине що повинен вказати
користувач це коефіціент його “вдягненості” у значеннях від 1 до 0. Після цього по
формулі буде розраховано коефіціент комфортності для конкретного місця яке
зацікавить користувача.

29
3. Технології розв’язку поставленої задачі
3.1. Постановка задачі

Метою роботи є розробка телеграм боту, що збирає дані про погоду з сервісу
Accuweather та обраховує коефіціент комфортності.

Вимоги до функціоналу бота:


- Бот повинен збирати інформацію про погоду з відкритих джерел.
- Бот повинен підримувати функцію пошуку прогнозу погоди за назвою міста, яку
вводить користувач.
- Бот повинен мати можливість надавати прогноз погоди при відправленні йому
своєї геолокації.
- Бот повинен мати можливість розраховувати комфортність погоди для вказанного
місця.

Повідомлення з прогнозом погоди повинне містити в собі:


1) фактичну температуру повітря
2) вологість
3) швидкість повітря
4) опис погоди
5) значення комфортності погоди (PET)

30
3.2. Структурно-функціональне моделювання процесів

Для функціонального моделювання процесів буде використовуватися


методологія IDEF0, яка базується на графічній мові для опису системи. Спочатку
проводиться опис системи в цілому та її взаємодії з навколишнім середовищем за
допомогою контекстної діаграми. Потім здійснюється функціональна декомпозиція,
де система розбивається на підсистеми, а кожна підсистема описується окремо за
допомогою діаграм декомпозиції. Процеси зображуються на діаграмі за допомогою
блоків, які з'єднуються стрілками для показу зв'язків між ними. В IDEF0 можна
виділити п'ять типів стрілок:
• Вхід - об'єкти, що використовуються як вхідні дані для процесу. Допускається,
що робота може не мати жодної стрілки входу. Стрілка входу направлена в
лівий бік процесу.
• Управління - інформація, керуюча процесами роботи. Керуючі стрілки несуть
інформацію, яка вказує, що повинен виконувати процес і яким чином. Кожен
процес повинен мати хоча б одну стрілку управління, яка направлена у
верхню грань.
• Вихід - об'єкти, в які перетворюються входи. Кожен процес повинен мати хоча б
одну стрілку виходу, яка виходить з правої межі процесу.
• Механізм - ресурси, які виконують роботу. Стрілка механізму малюється
направленою в нижню межу процесу.
• Виклик - спеціальна стрілка, що вказує на іншу модель роботи. Стрілка виклику
направлена з нижньої частини процесу і використовується для вказівки того,
що деяка робота виконується за межами модельованої системи. Не є
обов’язковою.

Нижче наведені контекстна IDEF0 (Рисунок 2.1) та IDEF0 першого рівня діаграми
(Рисунок 2.2)

31
Рисунок 2.1 – Контекста IDEF0 діаграма

Рисунок 2.2 – IDEF0 діаграма першого рівня

32
3.3. Діаграма варіантів використання

Діаграми варіантів використання служать для спрощення взаємодії з


майбутніми користувачами системи та клієнтами шляхом відображення того, що
система має робити, не розкриваючи конкретних методів реалізації.
При роботі з варіантами використання слід дотримуватися наступних правил:
• Кожен варіант використання має принаймні одну особу, яка здійснює дії.
• Кожен варіант використання має ініціатора.
• Кожен варіант використання призводить до певного результату.

Варіанти використання можуть також взаємодіяти між собою. Виокремлено такі


типи взаємодії між варіантами використання:
• Включення: один варіант використання вбудовується в інший.
• Додавання: варіант використання може бути розширений іншим у певних
ситуаціях або в точці розширення.
• Узагальнення: варіант використання успадковує характеристики батьківського
варіанту використання, але може перевизначити деякі з них або додати нові,
схоже на спадкування в класах.

Для практичної роботи з діаграмою варіантів використання були виділені такі


конкретні варіанти використання:
• Запит прогнозу погоди для введеного міста.
• Запит прогнозу погоди для для надісланої геолокації.

Єдиним актором є користувач.

33
Діаграма варіантів використання (Рисунок 2.3) наведена нижче:

Рисунок 2.3 – Діаграма варіантів використання

З наведеної вище діаграми варіантів використання ми можем визначити наступні


умови користування ботом:
1. Користувач мусить виконати будь-яку операцію для того, щоб переглянути
результат.
2. Користувач не повинен для того, щоб виконати запит прогнозу погоди у
збереженому місті проводити авторизацію чи інші дії.
3. Користувач може зробити запит прогнозу погоди за введеним містом.
4. Користувач може зробити запит прогнозу погоди за геолокацією.

Реалізацію діграми можна побачити у файлі “main.py”[1].

34
4. Програмна реалізація
4.1 Вибір засобів програмної реалізації
4.1.1 Мова програмування

Для створення телеграм-бота "WhatSence" була обрана мова програмування


Python. Основна перевага Python полягає у його легкості читання, зрозумілості і
вищій якості порівняно з іншими мовами програмування. Код на Python читається
легше, що спрощує його повторне використання і обслуговування порівняно з
іншими мовами. Однорідний стиль оформлення коду на Python полегшує його
розуміння, навіть для тих, хто не брав участі в його написанні. Крім того, Python
підтримує сучасні механізми об'єктно-орієнтованого програмування, що сприяє
багаторазовому використанню коду.
Крім зазначених переваг, Python є однією з найкращих мов для швидкої
розробки програмного забезпечення. Порівняно з компілюючими або строго
типізованими мовами, такими як C, C++ і Java, Python значно збільшує
продуктивність розробника. Обсяг коду на Python, який потрібно написати, зазвичай
становить лише 20-30% від еквівалентного коду на мові C++ або Java. Це означає
менше введення з клавіатури, менше часу на налагодження і менші затрати на
підтримку. Крім того, програми на Python можуть бути виконані безпосередньо,
обходячи тривалі етапи компіляції.
Важливим фактором при виборі Python є широкий спектр корисних пакетів з
відкритим кодом, які можна зручно використовувати для реалізації проектів. Один з
таких пакетів - telebot, що реалізує API телеграм-бота з використанням Python.

Під час реалізації боту наступні методи з Telegram Bot API були використані:
1) sendMessage(chat_id, text) – метод для відправлення повідомлення ботом
користувачу
2) messageHandler() – обробник, необхідний для вилову повідомлень від
користувачів.

35
4.1.2 Середовище розробки

Для розробки було використано популярне та високо оцінюваний редактор


коду – Visual Code. Це зручний редактор надає засоби для аналізу коду, графічний
відладчик, інструмент для запуску юніт-тестів та багато інших корисних дрібниць,
таких як підказка по сигнатурі функції (Рисунок 3.1), знаходження всіх згадувань
конструкції (Рисунок 3.2) та інші.

Рисунок 3.1 – Підказка по сигнатурі функції

36
Рисунок 3.2 – Знаходження всіх згадувань конструкції

37
4.2 Опис розроблених методів
Нижче наведений список методів для роботи телеграм боту:
1) send_welcome(message) - Цей метод надсилає привітальне повідомлення
користувачеві під час початку чату.
2) process_weather(message) - Цей метод обробляє інформацію про погоду на
основі введення користувача (назва міста) або його місцезнаходження та
обчислює рівень комфорту (PET) на основі значення одягу, встановленого
користувачем.
3) set_clothing(message) - Цей метод дозволяє користувачу встановити значення
одягу в межах від 0 до 1, вказуючи їхній вибір одягу в різних погодних
умовах.
4) process_location(message) - Цей метод обробляє інформацію про
місцезнаходження користувача та отримує дані про погоду для цього місця за
допомогою API OpenWeatherMap.

38
4.3. Результати роботи

Нижче представлені скріншоти з основними сценаріями, щоб


продемонструвати результати роботи:
1) До початку роботи з ботом база даних не має записів (Рисунок 4.1)

Рисунок 4.1 – Початок роботи з ботом

39
2) Після натискання кнопки “Start” з’явиться інструкція користування (Рисунок
4.2) у розділі “меню”

Рисунок 4.2 – Панель керування та інструкція

40
3) Для відображення прогнозу погоди у конкретному місті потрібно ввести назву
міста яке цікавить (Рисунок 4.3)

Рисунок 4.3– Прогнозування з запитом за назвою міста

41
4) Для відображення прогнозу погоди у місці вашого знаходження потрібно
відправити геолокацію (Рисунок 4.4)

Рисунок 4.3– Прогнозування з запитом за назвою міста

42
ВИСНОВОК

Під час виконання роботи був реалізований телеграм бот “WeatherSence”


мовою Python для прогнозування комфортності погодних умов. Всі вимоги
дотримані, варіанти використання протестовані.
Відповідно до поставлених задач реалізовані можливості запиту прогнозу
комфортності погоди за введеним містом або за геолокацією.
З можливих покращень для бота у майбутньому можна виділити зберігання
міста для запиту, з якого бот буде брати прогнози погоди, самостійне
попередження ботом у разі виникнення погодних катастроф, прогнозування за
вказаною датою та побудова графіків погоди на найближчі дні.
За час виконня курсової було покращено навики у програмуванні мовою
Python. Поглиблено знання у сфері розробки ботів для телеграму.

43
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Опади, що випадають з хмар та з повітря, їх види, вимірювання. Карта розподілу


опадів https://vseosvita.ua/library/opadi-so-vipadaut-z-hmar-ta-z-povitra-ih-vidi-
vimiruvanna-karta-rozpodilu-opadiv-74220.html
2. Python Pros and Cons: What are The Benefits and Downsides of the Programming
Language https://www.netguru.com/blog/python-pros-and-cons
3. Олексій Васильєв. Програмування мовою Python. 2019
4. Практика користування соцмережами в Україні http://rb.com.ua/blog/praktika-
polzovanija-socsetjami-v-ukraine/?
fbclid=IwAR3LAJVpOwYPgDWdQ7uqvkWXrUnX8S_rkXry9nhmtuxsNUsinpNnn96zI
vs
5. Beautiful Soup Documentation
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
6. Дмитро Златопольський. Основи програмування на мові Python. 2016
7. Benefits of Python over Other Programming Languages
https://www.invensis.net/blog/it/benefits-of-python-over-other-programming-languages/
8. Real Python Course, Part 1 Real Python Team. Real Python. 2017
9. Щоденник погоди https://rp5.ua/
10. Python documentation https://docs.python.org
11. Telegram Bot API https://core.telegram.org/bots/api
12. 2017 Bot Overview: Perspective on Top Bots and Top Channels for Bots
https://chatbotsmagazine.com/2017-bot-overview-perspective-on-top-bots-and-top-
channels-for-bots-d03310f9a864

44
Додаток А – Приклади кодової бази

1. main.py (частина).
...
# bot_token = "5803215513:AAFCzskGTV2Lztl58xyOloqUeLCjtm7uqMQ"
# api_key = "99aa6b2ab24f297fc28ee38cc1d0ef1a"

import telebot
import requests
import math
from googletrans import Translator
bot_token = '5803215513:AAFCzskGTV2Lztl58xyOloqUeLCjtm7uqMQ'
api_key = '99aa6b2ab24f297fc28ee38cc1d0ef1a'

bot = telebot.TeleBot(bot_token)
translator = Translator()

clothing = {}

@bot.message_handler(commands=['start'])
def send_welcome(message):
bot.reply_to(message, "Привіт!\n Я бот для визначення комфортності погоди у твоєму місті.\n\nВстанови значення
своєї вдягненості від 0 до 1 командою /setclothing\nПісля цього відправ або назву свого міста або геолокацію і ми
визначимо комфортність!\n\nЯкщо бажаєш дізнатись про значення PET - пиши команду /pet !")

@bot.message_handler(commands=['pet'])
def send_welcome(message):
bot.reply_to(message, "Значення PET менше 0 говорить про відчуття холоду, від 0 до 20 - про комфортні умови, від
20 до 30 - про легкий дискомфорт, від 30 до 40 - про серйозний дискомфорт, а значення більше 40 говорить про
небезпечні умови для здоров'я.")

@bot.message_handler(commands=['setclothing'])
def set_clothing(message):
try:
value = float(message.text.split()[1])
if 0 <= value <= 1:
user_id = message.from_user.id
clothing[user_id] = value
bot.reply_to(message, f"Значення одягу успішно встановлено: {value}")
else:
raise ValueError
except (IndexError, ValueError):
bot.reply_to(message, "Некоректне значення одягу. Введіть число від 0 до 1.")

@bot.message_handler(func=lambda message: True)


def process_weather(message):
city = message.text.lower()

url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric'
response = requests.get(url)
data = response.json()

if data['cod'] == '404':
bot.reply_to(message, 'Місто не знайдено. Перевірте правильність введення.')
return

temperature = data['main']['temp']
humidity = data['main']['humidity']
45
wind_speed = data['wind']['speed']
weather_desc = data['weather'][0]['description']
# translated_desc = translator.translate(weather_desc, src='en', dest='uk').text

user_id = message.from_user.id
user_clothing = clothing.get(user_id, 0.5)

es = 6.11 * math.exp(5417.7530 * ((1 / 273.16) - (1 / (temperature + 273.16))))


ea = (humidity / 100) * es
v = wind_speed
pet = temperature - (1 - user_clothing) * ((temperature - 10) * math.sqrt(es - ea)) - 0.3 * (v - 0.5) - 1
pet = round(pet, 2)

weather_info = f"Погода у {city}:\n" \


f"Температура: {temperature}°C\n" \
f"Вологість: {humidity}%\n" \
f"Швидкість вітру: {wind_speed} м/с\n" \
f"Опис погоди: {weather_desc}\n" \
f"Комфортність погоди(PET): {pet}\n\n" \

bot.reply_to(message, weather_info)
print(f"Пользователь {message.from_user.first_name} отправил сообщение: {message.text}")

@bot.message_handler(content_types=['location'])
def process_location(message):
latitude = message.location.latitude
longitude = message.location.longitude

url = f'http://api.openweathermap.org/data/2.5/weather?lat={latitude}&lon={longitude}&appid={api_key}&units=metric'
response = requests.get(url)
data = response.json()

if data['cod'] == '404':
bot.reply_to(message, 'Неможливо отримати дані про погоду для цього місця розташування.')
return

temperature = data['main']['temp']
humidity = data['main']['humidity']
wind_speed = data['wind']['speed']
weather_desc = data['weather'][0]['description']
# translated_desc = translator.translate(weather_desc, src='en', dest='uk').text

user_id = message.from_user.id
user_clothing = clothing.get(user_id, 0.5)

es = 6.11 * math.exp(5417.7530 * ((1 / 273.16) - (1 / (temperature + 273.16))))


ea = (humidity / 100) * es
v = wind_speed
pet = temperature - (1 - user_clothing) * ((temperature - 10) * math.sqrt(es - ea)) - 0.3 * (v - 0.5) - 1
pet = round(pet, 2)

weather_info = f"Погода у вашому місці:\n" \


f"Температура: {temperature}°C\n" \
46
f"Вологість: {humidity}%\n" \
f"Швидкість вітру: {wind_speed} м/с\n" \
f"Опис погоди: {weather_desc}\n" \
f"Комфортність погоди(PET): {pet}"

bot.reply_to(message, weather_info)

bot.polling()

2.__init__.py(частина).

@staticmethod
def check_regexp_input(regexp, method_name):

if not isinstance(regexp, str):


logger.error(f"{method_name}: Regexp filter should be string. Not able to use the supplied type.")

def message_handler(
self,
commands: Optional[List[str]] = None,
regexp: Optional[str] = None,
func: Optional[Callable] = None,
content_types: Optional[List[str]] = None,
chat_types: Optional[List[str]] = None,
**kwargs):

"""
if content_types is None:
content_types = ["text"]

method_name = "message_handler"

if commands is not None:


self.check_commands_input(commands, method_name)
if isinstance(commands, str):
commands = [commands]

if regexp is not None:


self.check_regexp_input(regexp, method_name)

if isinstance(content_types, str):
logger.warning("message_handler: 'content_types' filter should be List of strings (content types), not string.")
content_types = [content_types]

def decorator(handler):
handler_dict = self._build_handler_dict(handler,
chat_types=chat_types,
content_types=content_types,
commands=commands,
regexp=regexp,
func=func,
**kwargs)
self.add_message_handler(handler_dict)
return handler

return decorator

47
def add_message_handler(self, handler_dict):
self.message_handlers.append(handler_dict)

def register_message_handler(self, callback: Callable, content_types: Optional[List[str]] = None,


commands: Optional[List[str]] = None,
regexp: Optional[str] = None, func: Optional[Callable] = None,
chat_types: Optional[List[str]] = None, pass_bot: Optional[bool] = False, **kwargs):

method_name = "register_message_handler"

if commands is not None:


self.check_commands_input(commands, method_name)
if isinstance(commands, str):
commands = [commands]

if regexp is not None:


self.check_regexp_input(regexp, method_name)

if isinstance(content_types, str):
logger.warning(
"register_message_handler: 'content_types' filter should be List of strings (content types), not string.")
content_types = [content_types]

handler_dict = self._build_handler_dict(callback,
chat_types=chat_types,
content_types=content_types,
commands=commands,
regexp=regexp,
func=func,
pass_bot=pass_bot,
**kwargs)
self.add_message_handler(handler_dict)

def edited_message_handler(self, commands=None, regexp=None, func=None, content_types=None, chat_types=None,


**kwargs):

if content_types is None:
content_types = ["text"]

method_name = "edited_message_handler"

if commands is not None:


self.check_commands_input(commands, method_name)
if isinstance(commands, str):
commands = [commands]

if regexp is not None:


self.check_regexp_input(regexp, method_name)

if isinstance(content_types, str):
logger.warning(
"edited_message_handler: 'content_types' filter should be List of strings (content types), not string.")
content_types = [content_types]

def decorator(handler):
handler_dict = self._build_handler_dict(handler,
chat_types=chat_types,
content_types=content_types,
commands=commands,
regexp=regexp,
48
func=func,
**kwargs)
self.add_edited_message_handler(handler_dict)
return handler

return decorator

def add_edited_message_handler(self, handler_dict):


self.edited_message_handlers.append(handler_dict)

3. logging.py (частина)

def __threaded_polling(self, non_stop=False, interval=0, timeout=None, long_polling_timeout=None,


logger_level=logging.ERROR, allowed_updates=None):
if not (logger_level) or (logger_level < logging.INFO):
warning = "\n Warning: this message appearance will be changed. Set logger_level=logging.INFO to continue
seeing it."
else:
warning = ""
# if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
logger.info('Started polling.' + warning)
self.__stop_polling.clear()
error_interval = 0.25

polling_thread = util.WorkerThread(name="PollingThread")
or_event = util.OrEvent(
polling_thread.done_event,
polling_thread.exception_event,
self.worker_pool.exception_event
)

while not self.__stop_polling.wait(interval):


or_event.clear()
try:
polling_thread.put(self.__retrieve_updates, timeout, long_polling_timeout, allowed_updates=allowed_updates)
or_event.wait()
polling_thread.raise_exceptions()
self.worker_pool.raise_exceptions()
error_interval = 0.25
except apihelper.ApiException as e:
if self.exception_handler is not None:
handled = self.exception_handler.handle(e)
else:
handled = False
if not handled:
if logger_level and logger_level >= logging.ERROR:
logger.error("Threaded polling exception: %s", str(e))
if logger_level and logger_level >= logging.DEBUG:
logger.error("Exception traceback:\n%s", traceback.format_exc())
if not non_stop:
self.__stop_polling.set()

logger.info("Exception occurred. Stopping." + warning)


else:

logger.info("Waiting for {0} seconds until retry".format(error_interval) + warning)


time.sleep(error_interval)
if error_interval * 2 < 60:
error_interval *= 2
else:
49
error_interval = 60
else:

time.sleep(error_interval)
polling_thread.clear_exceptions() # *
self.worker_pool.clear_exceptions() # *
except KeyboardInterrupt:

logger.info("KeyboardInterrupt received." + warning)


self.__stop_polling.set()
break
except Exception as e:
if self.exception_handler is not None:
handled = self.exception_handler.handle(e)
else:
handled = False
if not handled:
polling_thread.stop()
polling_thread.clear_exceptions() # *
self.worker_pool.clear_exceptions() # *
raise e
else:
polling_thread.clear_exceptions()
self.worker_pool.clear_exceptions()
time.sleep(error_interval)

polling_thread.stop()
polling_thread.clear_exceptions()
self.worker_pool.clear_exceptions()

logger.info('Stopped polling.' + warning)

def __non_threaded_polling(self, non_stop=False, interval=0, timeout=None, long_polling_timeout=None,


logger_level=logging.ERROR, allowed_updates=None):
if not (logger_level) or (logger_level < logging.INFO):
warning = "\n Warning: this message appearance will be changed. Set logger_level=logging.INFO to continue
seeing it."
else:
warning = ""

logger.info('Started polling.' + warning)


self.__stop_polling.clear()
error_interval = 0.25

while not self.__stop_polling.wait(interval):


try:
self.__retrieve_updates(timeout, long_polling_timeout, allowed_updates=allowed_updates)
error_interval = 0.25
except apihelper.ApiException as e:
if self.exception_handler is not None:
handled = self.exception_handler.handle(e)
else:
handled = False

if not handled:
if logger_level and logger_level >= logging.ERROR:
logger.error("Polling exception: %s", str(e))
if logger_level and logger_level >= logging.DEBUG:
logger.error("Exception traceback:\n%s", traceback.format_exc())
if not non_stop:
self.__stop_polling.set()

50
logger.info("Exception occurred. Stopping." + warning)
else:

logger.info("Waiting for {0} seconds until retry".format(error_interval) + warning)


time.sleep(error_interval)
error_interval *= 2
else:
time.sleep(error_interval)
except KeyboardInterrupt:

logger.info("KeyboardInterrupt received." + warning)


self.__stop_polling.set()
break
except Exception as e:
if self.exception_handler is not None:
handled = self.exception_handler.handle(e)
else:
handled = False
if not handled:
raise e
else:
time.sleep(error_interval)

logger.info('Stopped polling.' + warning)

def _exec_task(self, task, *args, **kwargs):


if self.threaded:
self.worker_pool.put(task, *args, **kwargs)
else:
try:
task(*args, **kwargs)
except Exception as e:
if self.exception_handler is not None:
handled = self.exception_handler.handle(e)
else:
handled = False
if not handled:
raise e

def stop_polling(self):

self.__stop_polling.set()

def stop_bot(self):

self.stop_polling()
if self.threaded and self.worker_pool:
self.worker_pool.close()

def set_update_listener(self, listener: Callable):

self.update_listener.append(listener)

def get_me(self) -> types.User:

result = apihelper.get_me(self.token)
return types.User.de_json(result)

51
def get_file(self, file_id: Optional[str]) -> types.File:

return types.File.de_json(apihelper.get_file(self.token, file_id))

def get_file_url(self, file_id: Optional[str]) -> str:

return apihelper.get_file_url(self.token, file_id)

def download_file(self, file_path: str) -> bytes:

return apihelper.download_file(self.token, file_path)


def log_out(self) -> bool:
return apihelper.log_out(self.token)
def c
return apihelper.close(self.token)

4.requests.py(частина)

try:
from charset_normalizer import __version__ as charset_normalizer_version
except ImportError:
charset_normalizer_version = None

try:
from chardet import __version__ as chardet_version
except ImportError:
chardet_version = None

def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version):


urllib3_version = urllib3_version.split(".")
assert urllib3_version != ["dev"]

if len(urllib3_version) == 2:
urllib3_version.append("0")

major, minor, patch = urllib3_version # noqa: F811


major, minor, patch = int(major), int(minor), int(patch)
# urllib3 >= 1.21.1, <= 1.26
assert major == 1
assert minor >= 21
assert minor <= 26

if chardet_version:
major, minor, patch = chardet_version.split(".")[:3]
major, minor, patch = int(major), int(minor), int(patch)
# chardet_version >= 3.0.2, < 6.0.0
assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0)
elif charset_normalizer_version:
major, minor, patch = charset_normalizer_version.split(".")[:3]
major, minor, patch = int(major), int(minor), int(patch)

assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0)


else:
raise Exception("You need either charset_normalizer or chardet installed")
52
def _check_cryptography(cryptography_version):
try:
cryptography_version = list(map(int, cryptography_version.split(".")))
except ValueError:
return

if cryptography_version < [1, 3, 4]:


warning = "Old version of cryptography ({}) may cause slowdown.".format(
cryptography_version
)
warnings.warn(warning, RequestsDependencyWarning)

try:
check_compatibility(
urllib3.__version__, chardet_version, charset_normalizer_version
)
except (AssertionError, ValueError):
warnings.warn(
"urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
"version!".format(
urllib3.__version__, chardet_version, charset_normalizer_version
),
RequestsDependencyWarning,
)

try:
try:
import ssl
except ImportError:
ssl = None

if not getattr(ssl, "HAS_SNI", False):


from urllib3.contrib import pyopenssl

pyopenssl.inject_into_urllib3()

# Check cryptography version


from cryptography import __version__ as cryptography_version

_check_cryptography(cryptography_version)
except ImportError:
pass

from urllib3.exceptions import DependencyWarning

warnings.simplefilter("ignore", DependencyWarning)

import logging
from logging import NullHandler

from . import packages, utils


from .__version__ import (
__author__,
__author_email__,
__build__,
__cake__,
__copyright__,
__description__,
__license__,
__title__,
53
__url__,
__version__,
)
from .api import delete, get, head, options, patch, post, put, request
from .exceptions import (
ConnectionError,
ConnectTimeout,
FileModeWarning,
HTTPError,
JSONDecodeError,
ReadTimeout,
RequestException,
Timeout,
TooManyRedirects,
URLRequired,
)
from .models import PreparedRequest, Request, Response
from .sessions import Session, session
from .status_codes import codes

logging.getLogger(__name__).addHandler(NullHandler())

warnings.simplefilter("default", FileModeWarning, append=True)

54

You might also like