Проект бота, предназначенного для поиска фильмов по названию.
Бот доступен в 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:
- в качестве менеджера зависимостей использовал poetry;
- создал сеть и виртуальную машину с Ubuntu;
- склонировал туда код из своего репозитория;
- используя tmux, зашел по ssh на машинку для поднятия баз через docker compose и запуска самого приложения;
Склонируйте код проекта
git clone https://gitlab.manytask.org/python/students-fall-2022/danfimov.git
Перейдите в директорию с проектом
cd 13.3.HW3/cinemabot
Установите Poetry. Подробнее об установке можно почитать в официальной документации Poetry.
curl -sSL https://install.python-poetry.org | python3 -
Установите зависимости
poetry install
Создайте файл .env
с необходимыми переменными для работы бота и базы данных
# Env variables example
BOT_TOKEN="<your_bot_token>" # from BotFather
KINOPOISK_API_KEY="<your_token>" # from kinopoiskapiunofficial.tech/
POSTGRES_USER="cinemabot_admin"
POSTGRES_PASSWORD="password"
POSTGRES_DB="cinemabot_db"
Запустите базу данных с помощью docker-compose
make db
Запустите миграции, чтобы создать в базе необходимые сущности
make migrate
Запустите бота
make run
- Поддержка стандартного flow: поиск фильма - далее/подробнее/стоп, история поиска и статистика показов фильмов;
- Внедрение alembic для комфортной работы с изменениями в базе данных;
- Замена MemoryStorage на Redis;
- Базовый деплой бота в Yandex Cloud (VM c открытой с помощью tmux сессией);
- Кэширование результатов запросов в API, чтобы не перегружать его;
- Деплой здорового человека через CI с предварительной проверкой тестами и линтерами, сборкой Docker-образов и автоматической выкаткой;
- Ориентирование на язык пользователя: поддержка вывода описания на русском или английском языках в зависимости от языка в приложении;
- Добавление дополнительных источников информации о фильмах помимо неофициального API Кинопоиска;
- Настройка полей в выдаче поиска для каждого пользователя через хранение информации в State;