Проект бота, предназначенного для поиска фильмов по названию.
Бот доступен в Telegram под ником @anfimov_cinema_bot.
Базовая команда. Не делает примерно ничего, кроме вывода подсказки о командах для поиска и справки. Под капотом еще и сохраняет id пользователя в нашу базу для дальнейшего использования.
Выполняет поиска фильма по ключевому слову/словам. Отдает пользователю описание фильма + название. Дальше доступны три опции:
- Если фильм не тот — можно продолжить поиск и пролистывать фильмы, пока они не закончатся в поисковой выдаче.
- Если фильм тот — можно посмотреть более подробное описание и получить ссылку на Кинопоиск.
- Устали — отдохните. Или просто закончите поиск.
Для получения информации о фильме, бот умеет ходить в неофициальное API Кинопоиска, и доставать оттуда интересующую информацию.
Забирает из базы историю запросов пользователя. Выводит на экран в виде списка фильмов с датами поиска в скобках. Если история длинная - она разбивается на страницы по 10 записей.
Может показывать дубли — не баг, а фича — когда пользователь, например, дважды искал одно и тоже.
Забирает из базы статистику о том, сколько раз мы показывали пользователю тот или иной фильм, и выводит эту информацию пользователю. Фильмы в списке упорядочены по количеству показов (по убыванию). Если статистика длинная - она разбивается на страницы по 10 записей.
Выводит список всех команд с кратким описанием их работы для пользователя.
В качестве хранилищ информации использовал две базы данных:
- Postgres - статистика показов фильмов, история поиска;
- Redis - кэш, state пользователя.
Используемые библиотеки:
- aiogram - библиотечка для работы с ботами в Telegram. Сделал туда пару PR-ов в процессе, надеюсь, примут;
- sqlalchemy - ORM для работы с базой;
- aiohttp - для походов в стороннее API за информацией;
- alembic - управление миграциями;
- pydantic - работа с настройками приложения, которые могут использовать env-переменные;
- cashews - асинхронный кэш, который умеет работать с Redis.
В качестве источника данных о фильмах взял неофициальное API Кинопоиска.
Деплоил в Yandex Cloud:
- в качестве менеджера зависимостей использовал uv;
- создал сеть и виртуальную машину с Ubuntu;
- склонировал туда код из своего репозитория;
- используя tmux, зашел по ssh на машинку для поднятия баз через docker compose и запуска самого приложения;
Склонируйте код проекта
git clone https://gitlab.manytask.org/python/students-fall-2022/danfimov.git
Перейдите в директорию с проектом
cd cinemabot
Установите uv. Подробнее об установке можно почитать в официальной документации.
curl -LsSf https://astral.sh/uv/install.sh | sh
Установите зависимости
uv sync --all-extras
Создайте файл conf/.env
с необходимыми переменными для работы бота и базы данных
cp conf/.env.example conf/.env
Запустите базу данных и приложение с помощью docker-compose
make up
- Поддержка стандартного flow: поиск фильма - далее/подробнее/стоп, история поиска и статистика показов фильмов;
- Внедрение alembic для комфортной работы с изменениями в базе данных;
- Замена MemoryStorage на Redis;
- Базовый деплой бота в Yandex Cloud (VM c открытой с помощью tmux сессией);
- Кэширование результатов запросов в API, чтобы не перегружать его;
- Деплой здорового человека через CI с предварительной проверкой тестами и линтерами, сборкой Docker-образов и автоматической выкаткой;
- Ориентирование на язык пользователя: поддержка вывода описания на русском или английском языках в зависимости от языка в приложении;
- Добавление дополнительных источников информации о фильмах помимо неофициального API Кинопоиска;
- Настройка полей в выдаче поиска для каждого пользователя через хранение информации в State;