Файл: Лабораторная работа 06 по в. 24 программирование критических сервисов Студент гр. Ист111 П. П. Иванов.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 13
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Кафедра информационных управляющих систем
Лабораторная работа № 06
по Б1.В.24 «ПРОГРАММИРОВАНИЕ КРИТИЧЕСКИХ СЕРВИСОВ»
Студент гр. ИСТ-111_____________________________ П.П. Иванов
(подпись)
Проверил ___________________________ А. В. Параничев
(оценка и подпись)
Санкт-Петербург
2023 год
Программная реализация подключения локальной и протестированной удаленной базы данных в Telegram
[желтым - для подстановки своих значений; зеленым - прочитать комментарии и удалить перед отправкой; все выделение убрать перед отправкой; файл переименовать по шаблону]
[Критерии оценок:
+1 балл: при выполнении типовых действий без применения DesignPatterns;
+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)
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Кафедра информационных управляющих систем
Лабораторная работа № 06
по Б1.В.24 «ПРОГРАММИРОВАНИЕ КРИТИЧЕСКИХ СЕРВИСОВ»
Студент гр. ИСТ-111_____________________________ П.П. Иванов
(подпись)
Проверил ___________________________ А. В. Параничев
(оценка и подпись)
Санкт-Петербург
2023 год
Программная реализация подключения локальной и протестированной удаленной базы данных в Telegram
[желтым - для подстановки своих значений; зеленым - прочитать комментарии и удалить перед отправкой; все выделение убрать перед отправкой; файл переименовать по шаблону]
[Критерии оценок:
+1 балл: при выполнении типовых действий без применения DesignPatterns;
+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 & (
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 строк.