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

ПКС / ПКС. Лабораторная 6

.docx
Скачиваний:
2
Добавлен:
19.09.2023
Размер:
151.7 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,

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

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

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

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

Лабораторная работа № 06

по Б1.В.24 «ПРОГРАММИРОВАНИЕ КРИТИЧЕСКИХ СЕРВИСОВ»

Студент гр. ИСТ-111_____________________________ П.П. Иванов

(подпись)

Проверил ___________________________ А. В. Параничев

(оценка и подпись)

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

2023 год

Программная реализация подключения локальной и протестированной удаленной базы данных в Telegram

[желтым - для подстановки своих значений; зеленым - прочитать комментарии и удалить перед отправкой; все выделение убрать перед отправкой; файл переименовать по шаблону]

[Критерии оценок:

+1 балл: при выполнении типовых действий без применения Design Patterns;

+2 и +3 балла: при применении, соответственно, 1 и 2 шаблонов проектирования (выбираются на занятии)

ИНИЦИАЛИЗАЦИЯ TELEGRAM-БОТА

После перехода в Telegram и поиска @BotFather создан Telegram-бот coffee_591_00 [составить недлинное имя, ассоциированное с заданием в 7й лабораторной работе; запомнить токен вида botNNN:ABC и нигде его не публиковать, т.к. токен позволяет выполнять любые настройки бота], первоначальная информация о боте в формате JSON (по адресу https://api.telegram.org/botNNN:ABC/getme, где botNNN:ABC - секретный токен бота).

{JSON-ответ}

Для бота выполнена инициализация с помощью команды /start (https://tlgrm.ru/docs/bots).

НАСТРОЙКА СРЕДЫ РАЗРАБОТКИ TELEGRAM-БОТА

[по умолчанию обсуждается PyCharm; для VisualStudio используется следующий раздел]

Разработка Telegram-бота выполняется с помощью PyCharm на языке Python, после создания проекта устанавливается библиотека "чистого" API Telegram с помощью команды в консоли (https://docs-python.ru/packages/biblioteka-python-telegram-bot-python/ ):

pip install python-telegram-bot

Результат установки показан на рис. 1.

Рис. 1. Результат установки библиотеки python-telegram-bot [подставить свой скриншот]

ЗАПУСК TELEGRAM-БОТА ДЛЯ ВЫПОЛНЕНИЯ КОМАНД ПО ОТОБРАЖЕНИЮ ДАННЫХ

Далее создан новый файл config.py, в который вписываются токен и исходные данные: API_TOKEN = '111111111:AAAAAAAAAAAAAAAAAAAAAAAAAAA'

Далее добавлен прототип файла базы данных, включающий 4 списка по параметрам по теме "Расчет бонусных баллов для кофеен": test_dbase.py [добавить свои данные]:

import config

import json

class DBase:

T_NAV_NAMES = {'1': 'Навигатор Digma 100',

'2': 'Навигатор Garmin 150',

'3': 'Навигатор Garmin 120'}

T_NAV_PRICES = {'1': '5000',

'2': '14000',

'3': '12000'}

def get_navigator_data(self, index_param):

ret = "Данные не найдены!( Параметр:{}".format(index_param)

index = int(index_param)

if(index == 0):

ret = json.dumps(self.T_NAV_NAMES, ensure_ascii = False)

elif(index == 1):

ret = json.dumps(self.T_NAV_PRICES, ensure_acii = False)

return ret

Содержимое файла main.py, в котором показано извлечение всех исходных данных по соответствующим командам: [необходимо составить команды для извлечения данных, в зависимости от КАЖДОГО из 4 параметров таблицы из лабораторной работы 2; можно использовать sqlite]

from telegram.ext import Updater, CommandHandler

from telegram.ext import MessageHandler, Filters, InlineQueryHandler

import config

updater = Updater(token=config.API_TOKEN)

dispatcher = updater.dispatcher

dbase = config.DBase()

def about():

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

"/navigators index, где index - номер параметра в таблице навигаторов;" \

"/vendors index, где index - номер параметра в таблице производителей"

# функция обработки команды '/start'

def func_start(update, context):

context.bot.send_message(chat_id=update.effective_chat.id,

text="Бот Coffee_591_00!")

# функция обработки текстовых сообщений

def func_text(update, context):

text_out = 'Получено сообщение: ' + update.message.text + '\n' + about()

context.bot.send_message(chat_id=update.effective_chat.id, text=text_out)

# функция обработки команды '/navigators'

def func_navigators(update, context):

if context.args:

text_reply = dbase.get_navigator_data(context.args[0])

context.bot.send_message(chat_id=update.effective_chat.id,

text=text_reply)

else:

context.bot.send_message(chat_id=update.effective_chat.id,

text='Необходимо указать аргумент команды /navigators')

# функция обработки команды '/vendors'

def func_vendors(update, context):

if context.args:

text_reply = "Команда вызвана с первым параметром " + context.args[0]

context.bot.send_message(chat_id=update.effective_chat.id,

text=text_reply)

else:

context.bot.send_message(chat_id=update.effective_chat.id,

text='Необходимо указать аргумент команды /vendors')

# функция обработки не распознанных команд

def func_unknown(update, context):

context.bot.send_message(chat_id=update.effective_chat.id,

text="Введена неизвестная команда!(")

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

start_handler = CommandHandler('start', func_start)

dispatcher.add_handler(start_handler)

# обработчик текстовых сообщений

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

dispatcher.add_handler(text_handler)

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

navigators_handler = CommandHandler('navigators', func_navigators)

dispatcher.add_handler(navigators_handler)

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

vendors_handler = CommandHandler('vendors', func_navigators)

dispatcher.add_handler(vendors_handler)

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

unknown_handler = MessageHandler(Filters.command, func_unknown)

dispatcher.add_handler(unknown_handler)

# запуск прослушивания сообщений

updater.start_polling()

# обработчик нажатия Ctrl+C

updater.idle()

Рис. 2. Фрагмент работы кода с локальной БД в Telegram для бота "" [подставить свой скриншот]

В результате подключения к базе данных MySQL, сформирован следующий код для темы "Расчет бонусных баллов кофейни": [подключиться к удаленной базе данных из 5й лабораторной, используя протестированный модуль вида connect_dbase.py]

from telegram.ext import Updater, CommandHandler

from telegram.ext import MessageHandler, Filters, InlineQueryHandler

import config

from connect_dbase import DBase

updater = Updater(token=config.API_TOKEN)

dispatcher = updater.dispatcher

db = DBase()

def about():

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

"/card index, где index - номер параметра в таблице Промокоды; \n" \

"/getcode Номер карты Желаемая скидка(%) - для получения промокода; \n " \

"/balance Номер карты, чтобы посмотреть количество баллов; \n" \

"/code для вывода промокодов; \n"

# функция обработки команды '/start'

def func_start(update, context):

context.bot.send_message(chat_id=update.effective_chat.id,

text="Бот Curse_591_10")

# функция обработки текстовых сообщений

def func_text(update, context):

text_out = 'Получено сообщение: ' + update.message.text + '\n' + about()

context.bot.send_message(chat_id=update.effective_chat.id, text=text_out)

def func_card(update, context):

if context.args:

try:

index = int(context.args[0])-1

data = db.getallData()

if (int(context.args[0]) < 6):

text_reply = f"""Номер карты: {data[index]['Card_name']} \n Имя пользователя: {data[index]['User_name']} \n Сумма баллов: {data[index]['summ_BP']} \n"""

else:

text_reply = "Данные отсутствуют!"

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

else:

try:

data = db.getallData()

for item in data:

text_reply = f"""Номер карты: {item['Card_name']} \n Имя пользователя: {item['User_name']}\n Сумма баллов: {item['summ_BP']} \n"""

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

def func_code(update, context):

if context.args:

try:

index = int(context.args[0])-1

data = db.getcodeData()

if (int(context.args[0]) < 6):

text_reply = f"""Номер карты: {data[index]['Card_name']} \n Промокод: {data[index]['Code_name']} \n Скидка: {data[index]['Sale']} \n Дата окончания действия: {data[index]['end_date']}"""

else:

text_reply = "Данные отсутствуют!"

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

else:

try:

data = db.getcodeData()

for item in data:

text_reply = f"""Номер карты: {item['Card_name']} \n Промокод: {item['Code_name']}\n Скидка: {item['Sale']} \n Дата окончания действия: {item['end_date']}"""

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

def func_del(update, context):

if context.args:

try:

text_reply = db.deloneData(context.args[0])

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

else:

text_reply = "Укажите идентификатор команды /delete"

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

def func_insert(update, context):

if len(context.args)==4:

try:

text_reply = db.InsertData(context.args[0], context.args[1], context.args[2], context.args[3])

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

else:

text_reply = "Укажите идентификаторы команды /insert \nКод Скидка Дата окончания id карты"

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

def func_up(update, context):

if len(context.args)==5:

try:

text_reply = db.UpdateData(context.args[0], context.args[1], context.args[2], context.args[3], context.args[4])

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

else:

text_reply = "Укажите идентификаторы команды /update \nКод Скидка Дата окончания id карты и изменяемую строку(id code)"

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

def func_balance(update, context):

if context.args:

try:

text_reply = db.ShowBalance(context.args[0])

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

else:

text_reply = "Укажите идентификаторы команды /balance Номер карты"

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

def func_getcode(update, context):

if len(context.args)==2:

try:

text_reply = db.GetCode1(context.args[0], context.args[1])

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

except Exception as e:

context.bot.send_message(chat_id=update.effective_chat.id, text=e)

else:

text_reply = "Укажите идентификаторы команды /getCode Номер карты Скидка"

context.bot.send_message(chat_id=update.effective_chat.id, text=text_reply)

# функция обработки не распознанных команд

def func_unknown(update, context):

context.bot.send_message(chat_id=update.effective_chat.id,

text="Введена неизвестная команда!(")

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

start_handler = CommandHandler('start', func_start)

dispatcher.add_handler(start_handler)

# обработчик текстовых сообщений

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

dispatcher.add_handler(text_handler)

card_handler = CommandHandler('card', func_card)

dispatcher.add_handler(card_handler)

code_handler = CommandHandler('code', func_code)

dispatcher.add_handler(code_handler)

del_handler = CommandHandler('delete', func_del)

dispatcher.add_handler(del_handler)

ins_handler = CommandHandler('insert', func_insert)

dispatcher.add_handler(ins_handler)

up_handler = CommandHandler('update', func_up)

dispatcher.add_handler(up_handler)

bc_handler = CommandHandler('balance', func_balance)

dispatcher.add_handler(bc_handler)

gc_handler = CommandHandler('getcode', func_getcode)

dispatcher.add_handler(gc_handler)

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

unknown_handler = MessageHandler(Filters.command, func_unknown)

dispatcher.add_handler(unknown_handler)

# запуск прослушивания сообщений

updater.start_polling()

# обработчик нажатия Ctrl+C

updater.idle()

db.close()

Рис. 3. Фрагмент работы кода с удаленной БД в Telegram для бота "": создание записи [подставить свой скриншот]

Рис. 4. Фрагмент работы кода с удаленной БД в Telegram для бота "": чтение записи [подставить свой скриншот]

Рис. 5. Фрагмент работы кода с удаленной БД в Telegram для бота "": обновление записи [подставить свой скриншот, в зависимости от реализуемого шаблона проектирования]

Рис. 6. Фрагмент работы кода с удаленной БД в Telegram для бота "": удаление записи [подставить свой скриншот, в зависимости от реализуемого шаблона проектирования]

Вывод: о работе Telegram-бота для функций CRUD через удаленную базу данных; о применении шаблонов проектирования в коде: 5-7 строк.