Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПКС / ПКС. Материалы лекций

.pdf
Скачиваний:
7
Добавлен:
19.09.2023
Размер:
3.23 Mб
Скачать

5. Пример кода для автоматизации в мессенджере WhatsApp (файл wb_read_any.py) 151

from wb_unread import *

def simple_activate(bot_driver, chat_num): chat_elem = None

try:

# клик по чату по его номеру params = '//*[@id="pane-

side"]/div[1]/div/div/div[{}]/div/div/div[2]/div[1]/div[1]'.format(chat_num) chat_elem = bot_driver.find_element(By.XPATH, params) chat_elem.click()

print("Чат {} активирован из списка!!!".format(chat_elem)) except:

print("Завершение функции активации чата {}, т.к. чат не удалось активировать!(".format(chat_elem))

return -11 try:

# получение контекста time.sleep(2)

chat_elem = bot_driver.find_element(By.XPATH, '//*[@id="main"]/div[3]/div/div[2]/div[2]')

print(chat_elem.text) except:

print("Ошибка считывания данных!(") return -12

return 0

if __name__ == "__main__": bot_driver = None

try:

botdriver = simple_prepare() if botdriver is not None:

num_chats = simple_chat_count(botdriver) if num_chats > 0:

num_select = 1 # номер чата для выбора

while int(num_select) >= 1 and int(num_select) <= num_chats: num_select = input("В списке {} чатов, введите номер чата для

считывания всех сообщений"

"(число от 1 до {} включительно); для выхода - любое другое значение".format(num_chats, num_chats))

ret_value = int(simple_activate(botdriver, num_select)) if ret_value >= 0:

print("Функция поиска последних сообщений для чата № {} выполнена

успешно!)") else:

print("Не найдены сообщения для чата № {}!(")

else: # завершение приложения, если ни один из вариантов не выбран print("Нажмите любую клавишу для завершения приложения...") pass

finally:

if botdriver is not None: botdriver.quit()

print("Драйвер браузера и связанные соединения успешно закрыты!!") print("Приложение успешно закрыто.")

Список литературы

152

 

1.Simple Whatsapp Automation Using Python3 and Selenium : [Electronic Resource]. – 2019. – URL: https://medium.com/analytics-vidhya/simple-whatsapp-automation-using-python3-and-selenium-77dad606284b

2.Плас, Дж. Вандер. Python для сложных задач: наука о данных и машинное обучение : [Электронный ресурс] / Дж.

Вандер Плас. – Санкт-Петербург : Питер, 2018. – 576 с. : ил. – URL: http://ibooks.ru/reading.php?productid=356721

3.Северенс, Ч. Введение в программирование на Python : [Электронный ресурс]: учебное пособие / Ч. Северенс. – 2-е

изд. – Москва : ИНТУИТ, 2016. 231 с. – URL: https://e.lanbook.com/book/100703

4.Practical Microservices Development Patterns: CRUD Vs. CQRS : [Electronic Resource]. – 2020. – URL: https://hackernoon.com/practical-microservices-development-patterns-crud-vs-cqrs-h6m3y5y

5.PyCharm. The Python IDE for Professional Developers : [Electronic Resource]. – URL: https://www.jetbrains.com/pycharm/

6.Driver requirements: Documentation for Selenium [Electronic Resource]. – URL: https://www.selenium.dev/documentation/en/webdriver/driver_requirements/

7.Spyne: PRC that doesn't break your back [Electronic Resource]. – 2021. – URL: http://spyne.io/

8.SOAP и REST сервисы с помощью Python-библиотеки Spyne [Electronic Resource]. – 2017. – URL: https://habr.com/ru/post/334290/

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Кафедра информационных управляющих систем

Б1.В.24 «Программирование критических сервисов» для специальностей по направлению 09.03.02 «Информационные системы и технологии»

1.Cервисы программного обеспечения в международных стандартах.

2.Cервисы программного обеспечения в российских стандартах.

3.Критические объекты и процессы программных средств в международных стандартах.

4.Шаблоны проектирования критических сервисов.

5.Программные компоненты для создания критического сервиса на языке Python.

6.Программные решения на основе критических сервисов в задаче развертывания микросервисной архитектуры.

Преподаватель: Параничев Андрей Викторович

Санкт-Петербург 2022

6. Программные решения на основе критических сервисов в задаче развертывания

154

микросервисной архитектуры

6.1) Проектирование микросервисной архитектуры:

построение UML-диаграммы профилей (profile);

построение UML-диаграммы состояний (state machine) для каждого сервиса;

построение UML-диаграммы пакетов данных (package); выбор СУБД и построение ERD;

построение IDEF0-диаграмм программной реализации и тестирования.

6.2) Проектирование критических сервисов:

построение UML-диаграмм последовательности (sequence), деятельности (activity) и объектов (object) для каждого из прецедентов;

построение UML-диаграммы классов (class) и коммуникаций (communication).

6.3) Программная реализация и тестирование критических сервисов:

установка дополнительных сервисов на основе REST API, настройка репозитория, получение JSON-ответа от БД;

программная реализация функциональных прототипов критических сервисов: данные и методы использования и реализации REST API;

написание и отладка юнит-тестов по данным UML-диаграмм состояний;

программная реализация критических сервисов, отладка и выпуск XML-документации.

6. Пример кода для управления данными мессенджере Telegram

155

с помощью БД MySQL (файл db_mysql.py)

import time

from datetime import date import json

import pymysql

from decimal import *

# для распознавания типа Decimal из формата JSON def decimal_default(obj):

if isinstance(obj, Decimal): return float(obj)

raise TypeError("Ошибка сериализации JSON: '%s'" % type(obj).__name__)

class dbase_mysql: def __init__(self):

db = self.mysql_connect() if db is not None:

print("Проверка чтения") self.select_data("1002")

def mysql_connect(self): db = None

try:

db = pymysql.connect( host='sutct.org', user='1_11', password=‘dsfsadfsdf', database='1_11')

print("Подключение к БД успешно установлено!) (время: {})".format(time.localtime())) except Exception as e:

print("Подключение к БД не установлено!( \n{}\n{}\n(время: {})". e.__repr__(), e.args, format(time.localtime()))

return db

def update_data(self, index, calorie): db = self.mysql_connect()

ret = None try:

if db is not None: cur = db.cursor()

sql = "UPDATE CALORIE_CONTENT SET calorie_content = {} WHERE product_id = {}".format(index, calorie)

print("Запрос {} успешно подготовлен!".format(sql)) else:

print("Не удалось подключиться к БД!(") return ret

except:

print("Запрос {} не удалось подготовить!(".format(sql)) return ret

try:

cur.execute(sql)

print("Выполнение: cur.execute(sql)") json_data = ["Изменение выполнено"] cur = db.cursor()

sql = "SELECT * FROM CALORIE_CONTENT WHERE product_id = {}".format(index) cur.execute(sql)

print("Выполнено: cur.execute(sql)") rows = cur.fetchall()

print("Выполнено: rows = cur.fetchall()") row_headers = [x[0] for x in cur.description]

print("Выполнено: row_headers = [x[0] for x in cur.description]") for row in rows:

json_data.append(dict(zip(row_headers, row)))

print("Выполнено: json_data.append(dict(zip(row_headers, row)))") print("json_data = \n{}".format(json_data))

6. Пример кода для управления данными мессенджере Telegram

156

с помощью БД MySQL (файл db_mysql.py)

ret = json.dumps(json_data, skipkeys=False, ensure_ascii=False, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=decimal_default, sort_keys=False)

print("Успешно получен результат на запрос:\n{}".format(ret)) except Exception as e:

print("Запрос {} не удалось выполнить на сервере!( Ошибка:\n{}\n{}". format(sql, e.__repr__(), e.args))

format(sql, e.__repr__(), e.args)) finally:

db.close() return ret

def select_data(self, index): db = self.mysql_connect() ret = None

try:

if db is not None: cur = db.cursor()

sql = "SELECT * FROM CALORIE_CONTENT WHERE product_id = {}".format(index) print("Запрос {} успешно подготовлен!)".format(sql))

else:

print("Не удалось подключиться к БД!(") return ret

except:

print("Запрос {} не удалось подготовить!(".format(sql)) return ret

try:

cur.execute(sql)

print("Выполнено: cur.execute(sql)") rows = cur.fetchall()

print("Выполнено: rows = cur.fetchall()") row_headers = [x[0] for x in cur.description]

print("Выполнено: row_headers = [x[0] for x in cur.description]")

json_data = []

for row in rows: json_data.append(dict(zip(row_headers, row)))

print("Выполнено: json_data.append(dict(zip(row_headers, row)))") print("json_data = \n{}".format(json_data))

ret = json.dumps(json_data, skipkeys=False, ensure_ascii=False, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=str, sort_keys=False)

print("Успешно получен результат на запрос:\n{}".format(ret)) except Exception as e:

print("Запрос {0} не удалось выполнить на сервере!( Ошибка:\n{1}\n{2}".format(sql, e.__repr__(), e.args))

finally:

db.close() return ret

def insert_data(self, data): db = self.mysql_connect() ret = None

try:

if db is not None: cur = db.cursor()

sql = "INSERT INTO EATING_LOGBOOK (log_date, user_name, mass, product_id) VALUES ('" + str(date.today()) +"'"

for d in data:

sql = sql + ", " + str(d) sql = sql + ")"

print("Запрос {} успешно подготовлен!)".format(sql)) else:

print("Не удалось подключиться к БД!(") return ret

6. Пример кода для управления данными мессенджере Telegram

157

с помощью БД MySQL (файл db_mysql.py)

except:

print("Запрос {} не удалось подготовить!(".format(sql)) return ret

try:

cur.execute(sql)

print("Выполнено: cur.execute(sql)") json_data = ["Данные успешно добавлены"] print("json_data = \n{}".format(json_data))

ret = json.dumps(json_data, skipkeys=False, ensure_ascii=False, check_circular=True,

allow_nan=True, cls=None, indent=None, separators=None, default=decimal_default, sort_keys=False)

print("Успешно получен результат на запрос:\n{}".format(ret)) except Exception as e:

print("Запрос {} не удалось выполнить на сервере!( Ошибка:\n{}\n{}". format(sql, e.__repr__(), e.args))

finally:

db.close() return ret

def delete_data (self, index): db = self.mysql_connect() ret = None

try:

if db is not None: cur = db.cursor()

sql = "DELETE FROM EATING_LOGBOOK WHERE log_id = {}".format(index) print("Запрос {} успешно подготовлен!)".format(sql))

else:

print("Не удалось подключиться к БД!(") return ret

except:

print("Запрос {} не удалось подготовить!(".format(sql)) return ret

try:

cur.execute(sql)

print("Выполнение: cur.execute(sql)") json_data = ["Изменение выполнено"] print("json_data = \n{}".format(json_data))

ret = json.dumps(json_data, skipkeys=False, ensure_ascii=False, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=decimal_default, sort_keys=False)

print("Успешно получен результат на запрос:\n{}".format(ret)) except Exception as e:

print("Запрос {} не удалось выполнить на сервере!( Ошибка:\n{}\n{}". format(sql), e.__repr__(), e.args)

finally:

db.close() return ret

6. Пример кода для управления данными мессенджере Telegram

158

с помощью БД MySQL (файл unittest_pymysql.py)

import unittest

from db_mysql import dbase_mysql

class TestsCreate(unittest.TestCase): def test_create_success(self):

print("Выполнение test_create_success") db = dbase_mysql()

self.assertEqual('["Данные успешно добавлены"]', db.insert_data(['\'rozaroza\'',300,2])) # add assertion here

def test_create_fail(self): print("Выполнение test_create_fail") db = dbase_mysql()

self.assertNotEqual('["Данные успешно добавлены"]', db.insert_data(['\'rozaroza\'', 2]))

class TestsUpdate(unittest.TestCase): def test_update_success(self):

print("Выполнение test_create_success") db = dbase_mysql()

self.assertEqual('["Изменение выполнено", {"product_id": 1, "product_name": "tomato", "calorie_content": 24.0, "fats_content": 0.2, "proteins_content": 1.1, "carbohydrates_content": 3.8, "water_content": 92.0, "cellulose_content": 1.4}]', db.update_data(1, 24)) # add assertion here

def test_update_fail(self): print("Выполнение test_create_fail") db = dbase_mysql()

self.assertNotEqual('["Изменение выполнено", {"product_id": 1, "product_name": "tomato", "calorie_content": 25.0, "fats_content": 0.2, "proteins_content": 1.1, "carbohydrates_content": 3.8, "water_content": 92.0, "cellulose_content": 1.4}]',

db.update_data(1, 24))

class TestsRead(unittest.TestCase): def test_read_success(self):

print("Выполнение test_create_success") db = dbase_mysql()

self.assertEqual(['[{"log_id": 11, "log_date": "20.10.2021", "user_name": "ulitka0000", "mass": 23232, "product_id": 3}]'], db.select_data(11)) # add assertion here

def test_read_fail(self): print("Выполнение test_create_fail") db = dbase_mysql()

self.assertNotEqual('[{"log_id": 10, "log_date": "2021-10-19", "user_name": "rozaroza", "mass": 62, "product_id": 1}]',

db.select_data(10))

class TestsDelete(unittest.TestCase): def test_delete_success(self):

print("Выполнение test_create_success") db = dbase_mysql()

self.assertEqual('["Изменение выполнено"]', db.delete_data(4)) # add assertion here

def test_delete_fail(self): print("Выполнение test_create_fail") db = dbase_mysql()

self.assertNotEqual('["Изменение выполнено"]', db.delete_data(10))

if __name__ == '__main__': unittest.main()

 

6. Пример кода для управления данными мессенджере Telegram

 

 

 

 

159

 

с помощью БД MySQL (файл unittest_pymysql.py)

 

 

 

 

 

 

 

 

Номер теста п/п

Тестовая функция и значения параметров

Ожидаемый результат

Фактический результат

Результат теста

1

assertEqual:

["Изменение выполнено",

["Изменение выполнено",

OK

 

db.update_data(1, 24)

{"product_id": 1, "product_name":

{"product_id": 1, "product_name":

 

 

 

"tomato", "calorie_content": 24.0,

"tomato", "calorie_content": 24.0,

 

 

 

 

 

 

 

 

"fats_content": 0.2,

"fats_content": 0.2,

 

 

 

 

"proteins_content": 1.1,

"proteins_content": 1.1,

 

 

 

 

"carbohydrates_content": 3.8,

"carbohydrates_content": 3.8,

 

 

 

 

"water_content": 92.0,

"water_content": 92.0,

 

 

 

 

"cellulose_content": 1.4}]

"cellulose_content": 1.4}]

 

 

2

assertNotEqual:

["Изменение выполнено",

["Изменение выполнено",

OK

 

db.update_data(1, 24)

{"product_id": 1, "product_name":

{"product_id": 1, "product_name":

 

 

 

"tomato", "calorie_content": 25.0,

"tomato", "calorie_content": 24.0,

 

 

 

 

 

 

 

 

"fats_content": 0.2,

"fats_content": 0.2,

 

 

 

 

"proteins_content": 1.1,

"proteins_content": 1.1,

 

 

 

 

"carbohydrates_content": 3.8,

"carbohydrates_content": 3.8,

 

 

 

 

"water_content": 92.0,

"water_content": 92.0,

 

 

 

 

"cellulose_content": 1.4}]

"cellulose_content": 1.4}]

 

 

3

assertEqual:

[{"product_id": 11, "product_name":

[]

Failed

 

db.select_data(11)

"banana", "calorie_content": 94.0,

ожидаемый и фактический результат

 

"fats_content": 0.2,

 

 

 

 

"proteins_content": 1.0,

следует указывать числовыми значениями

 

 

"carbohydrates_content": 22.0,

 

 

 

 

 

 

 

"water_content": 74.0,

 

 

 

 

 

"cellulose_content": 2.0}]

 

 

 

4

assertNotEqual:

[{"product_id": 5, "product_name":

[{"product_id": 5, "product_name":

Failed

 

db.select_data(10)

"fried almond", "calorie_content":

"fried almond", "calorie_content":

 

 

 

642.0, "fats_content": 55.9,

642.0, "fats_content": 55.9,

 

 

 

 

 

 

 

 

"proteins_content": 22.4,

"proteins_content": 22.4,

 

 

 

 

"carbohydrates_content": 12.3,

"carbohydrates_content": 12.3,

 

 

 

 

"water_content": 3.0,

"water_content": 3.0,

 

 

 

 

"cellulose_content": 4.7}]

"cellulose_content": 4.7}]

 

 

6. Пример кода для управления данными мессенджере Telegram

160

с помощью БД MySQL (файл tg_gui_bot.py)

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters import config

from db_mysql import dbase_mysql

db = config.DataBase()

updater = Updater(token = config.TOKEN) dispatcher = updater.dispatcher

class tg_bot:

def __init__(self):

self.updater = Updater(token=config.TOKEN) self.dispatcher = self.updater.dispatcher self.dbase = dbase_mysql()

start_handler = CommandHandler('start', self.func_start) self.dispatcher.add_handler(start_handler)

text_handler = MessageHandler(Filters.text & (~Filters.command), self.func_text) self.dispatcher.add_handler(text_handler)

# обработчик команды '/insert'

insert_handler = CommandHandler('insert', self.func_insert) self.dispatcher.add_handler(insert_handler)

# обработчик команды '/select'

select_handler = CommandHandler('select', self.func_select) self.dispatcher.add_handler(select_handler)

# обработчик команды '/update'

select_handler = CommandHandler('update', self.func_update) self.dispatcher.add_handler(select_handler)

# обработчик не распознанных команд

unknown_handler = MessageHandler(Filters.command, self.func_unknown) self.dispatcher.add_handler(unknown_handler)

#запуск прослушивания сообщений self.updater.start_polling()

#обработчик нажатия Ctrl+C self.updater.idle()

def about(self):

return "Для извлечения исходных данных используйте команды:\n \

/insert ['имя пользователя', масса продукта без единиц измерения, id продукта], где index - номер параметра в таблице содержания калорий от 1 до 7;\n \

/select index, где index - номер параметра в таблице продуктов от 1 до 5\n \

/delete index, где index - номер параметра в таблице записей журнала потребления\n \ /update index calorie, где index - номер параметра в таблице продуктов от 1 до 5, calorie

- новая калорийность продукта"

def func_start(self, update, context):

context.bot.send_message(chat_id=update.effective_chat.id, text="CalorieCalculatingBot591 a.k.a mxkrsCalCalcBot")

# обработчик команды '/delete'

insert_handler = CommandHandler('delete', self.func_delete) self.dispatcher.add_handler(insert_handler)

def func_text(self, update, context):

text_out = 'Получено сообщение: ' + update.message.text + '\n' + self.about() context.bot.send_message(chat_id=update.effective_chat.id, text=text_out)