Всё учеба, да учеба, которая медленно но верно движется к логическому завершению. И уже пора, пожалуй, создать какое-то работающее приложение.
Пока очень смутно представляю что это такое будет. Вроде бы прочитал техническое задание, что-то понял, а что-то не очень. Для того и пишу данную статью чтобы "устаканить" свои мысли по поводу написания программы. Итак, техническое задание (довольно таки объемное):
Разработайте сервис, дающий пользователям возможность эффективно управлять своими привычками через бот в Telegram.
Функционал приложения
Основные функции приложения на стороне frontend (телеграм-бот):
- добавление и удаление привычек, полный функционал по редактированию;
- функция фиксации выполнения привычки: выполнил / не выполнил;
- напоминание о необходимости выполнить привычку с фиксацией.
Основная функция сервисного скрипта: оповещение пользователя в заданный/назначенный отрезок времени.
Основные функции приложения на стороне backend (FastAPI):
- хранение и обработка данных, полученных от пользователя (запросы из телеграм-бота);
- аутентификация и авторизация телеграм-бота для доступа к данным.
Что предстоит реализовать
- Телеграм-бот. Этот слой используется как фронтенд-составляющая сервиса. Он нужен для доступа пользователей к своим привычкам, а также обеспечивает полный функционал по их редактированию.
- Сервис аутентификации. Этот слой отвечает за методы работы с привычками со стороны FastAPI. Он реализует основные методы CRUD, используемые пользователями через телеграм-бота. Он также обеспечивает авторизацию действий пользователя в момент запроса к базе данных.
- Механизм переноса привычек: список привычек дублируется на следующий день, привычки удаляются из списка после их проработки. Подробнее работа механизма описана в разделе «Основные функциональные требования».
- Сервисный скрипт оповещений, работающий в фоновом режиме. Уведомляет пользователя о текущем списке привычек в заданный момент времени.
- В качестве базы данных используется связка: PostgreSQL — SQLAlchemy — Alembic.
- Приложение запускается средствами Docker-compose.
Основные функциональные требования
- Архитектура проекта. В ходе реализации frontend- и backend-частей приложения структура папок проекта должна соответствовать архитектурным решениям MVP/MVC.
- Аутентификация. Реализуйте безопасную аутентификацию пользователей через токен, полученный от FastAPI и интегрированный с ботом на платформе Telegram.
- Управление привычками. Обеспечьте пользователям возможность создавать, просматривать, редактировать и удалять свои ежедневные привычки.
- Трекинг выполнения. Добавьте функционал для отметки выполнения привычек на текущий день. Пользователь может отмечать каждую привычку как выполненную или не выполненную.
- Перенос невыполненных привычек. Исходя из распространённого мнения о необходимости 21 дня для привития новой привычки (число можно указать в настройках), дублируйте список привычек на следующий день, оставляя только те, что выполнялись менее 21 раза.
- Уведомления. Реализуйте систему уведомлений для напоминания пользователям отмечать выполнение привычек. Можно использовать отдельный демон-сервис, запускаемый через планировщик задач, или воспользоваться предложенной библиотекой из технологического стека.
Технологический стек
В ходе реализации используйте следующий стек технологий:
- Poetry.
- PostgreSQL.
- SQLAlchemy.
- Alembic.
- PytelegramBotAPI.
- FastAPI.
- PyJWT (по желанию).
- Apscheduler (по желанию).
- crontab (по желанию).
- Docker-compose.
Используйте pyTelegramBotAPI для взаимодействия с пользователями через платформу Telegram.
Реализуйте серверную часть с использованием FastAPI для обеспечения взаимодействия бота с базой данных PostgreSQL.
Используйте SQLAlchemy для работы с базой данных и Alembic для управления миграциями.
Требования к коду
- Имена методов и функций должны содержать глагол действия.
- Имена переменных и функций всегда должны быть развёрнутыми. Избегайте явных сокращений слов и однобуквенных переменных.
- Должно быть предусмотрено хранение паролей в хешированном виде.
- Приложение должно запускаться и работать через команду docker-compose up.
================КОНЕЦ ТЗ==================
С чего начать?!
Чтобы успешно решить эту задачу, рекомендуем обратить внимание на материалы модулей 20, 21, 26 и 27 курса Python Advanced. В них освещаются основы работы с FastAPI, PostgreSQL и SQLAlchemy Alembic.
Базируясь на этих знаниях я и буду создавать своего бота.
Первого и последнего бота (по поиску отлей на hotels.com) я закончил очень давно в марте (кажется) 2023 года. Было не легко.
Надеюсь на базе той информации + полученная инфа по курсу Python Advanced поможет решить эту задачу гораздо быстрей, нежели я делал того бота.
Ну вот, новый проект в Pycharm создан, новый бот в BotFather так же создан (получен токен для доступа к боту).
По техническому заданию нужно использовать FastAPI для управления ботом поэтому начну с установки только необходимых пакетов (см. выше, в ТЗ, их список. Для начала установлю:
- SQLAlchemy.
- PytelegramBotAPI.
- FastAPI.
На базе этих пакетов обеспечу минимально возможный функционал бота.
Да, нам предлагается за основу бота взять готовую структуру и на ее базе делать свой проект.
Чтож, я не собираюсь изобретать велосипед и запускаю "git clone https://gitlab.com/dmitry_lokhanin/structure_example.git" из корневой директории моего проекта:
Структура бота очень похожа на то что я когда-то делал.
Да, судя по шаблону для ключей к боту и сайту hotels.com, это та же самая структура что и бот по поиску отелей:
Ключ для бота я введу а этот, второй пусть пока полежит, вдруг пригодится! Так же сразу переименовал файл .env.template в .env и пошел вспоминать структуру проекта который писал два года назад...
main.py
loader.py
А вот в config.py возникли первые проблемы, пакет dotenv подсвечен красным:
Установка pip install dotenv выдала ошибку:
Потому что недостаточно написать имя пакета dotenv, надо его написать прааааавильно: python-dotenv!!!
Вроде бы все нестыковки завершены, можно попробовать запустить бота... Но что-то мне подсказывает - не всё я еще устранил, ну да ладно - пуск!
Хм, бот запустился, но ни сообщений в консоли, ничего... Ладно, думаю, у меня же логгирование еще никак не налажено, может так и должно, пошел в телегу запускать бота там... Нажал несколько раз /start... ничего... спустя секунд 10 вылетело "эхо":
Ну значит, что-то в этом боте уже работает, но Пайчарм меня озадачил ошибками:
Посмотрю, чего в моём боте по поиску отелей насчет таймаута написано...
А ничего в моем старом проекте об этом не написано, интернеты говорят мол надо сделать так:
Что, кажется сработало и ошибка ушла...
Ну вот, собственно начало боту положено. Бот работает, реагирует эхом на ввод текста...
Теперь его нужно как-то под FastAPI заточить, но это уже в следующих статьях. А я продолжу пока делать 28 HW и изучать основы Web-вёрстки.
P.S. Вроде всё минимально заработало а отправить на гит-сервер не получилось, так как у проекта который я клонировал и взял за основу тоже имеется внутри директория .git и они с моей директорией начали конфликтовать. Пришлось удалить директорию .git из папки structure_example. Затем все содержимое этой папки перекинуть в корень проекта (так даже лучше смотрится) и только после этого я смог запушить на сервер все свои сегодняшние наработки: