Skip to content

Телеграм бот для поиска фильмов

Notifications You must be signed in to change notification settings

danfimov/cinemabot

Repository files navigation

Cinemabot

Проект бота, предназначенного для поиска фильмов по названию.

Бот доступен в Telegram под ником @anfimov_cinema_bot.

Available bot commands

/start

Базовая команда. Не делает примерно ничего, кроме вывода подсказки о командах для поиска и справки. Под капотом еще и сохраняет id пользователя в нашу базу для дальнейшего использования.

/find название фильма

Выполняет поиска фильма по ключевому слову/словам. Отдает пользователю описание фильма + название. Дальше доступны три опции:

  • Если фильм не тот — можно продолжить поиск и пролистывать фильмы, пока они не закончатся в поисковой выдаче.
  • Если фильм тот — можно посмотреть более подробное описание и получить ссылку на Кинопоиск.
  • Устали — отдохните. Или просто закончите поиск.

Для получения информации о фильме, бот умеет ходить в неофициальное API Кинопоиска, и доставать оттуда интересующую информацию.

/history

Забирает из базы историю запросов пользователя. Выводит на экран в виде списка фильмов с датами поиска в скобках. Если история длинная - она разбивается на страницы по 10 записей.

Может показывать дубли — не баг, а фича — когда пользователь, например, дважды искал одно и тоже.

/stats

Забирает из базы статистику о том, сколько раз мы показывали пользователю тот или иной фильм, и выводит эту информацию пользователю. Фильмы в списке упорядочены по количеству показов (по убыванию). Если статистика длинная - она разбивается на страницы по 10 записей.

/help

Выводит список всех команд с кратким описанием их работы для пользователя.

Tech details

В качестве хранилищ информации использовал две базы данных:

  • Postgres - статистика показов фильмов, история поиска;
  • Redis - кэш, state пользователя.

Используемые библиотеки:

  • aiogram - библиотечка для работы с ботами в Telegram. Сделал туда пару PR-ов в процессе, надеюсь, примут;
  • sqlalchemy - ORM для работы с базой;
  • aiohttp - для походов в стороннее API за информацией;
  • alembic - управление миграциями;
  • pydantic - работа с настройками приложения, которые могут использовать env-переменные;
  • cashews - асинхронный кэш, который умеет работать с Redis.

В качестве источника данных о фильмах взял неофициальное API Кинопоиска.

Deploy details

Деплоил в Yandex Cloud:

  • в качестве менеджера зависимостей использовал poetry;
  • создал сеть и виртуальную машину с Ubuntu;
  • склонировал туда код из своего репозитория;
  • используя tmux, зашел по ssh на машинку для поднятия баз через docker compose и запуска самого приложения;

Run locally

Склонируйте код проекта

  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

Roadmap

  • Поддержка стандартного flow: поиск фильма - далее/подробнее/стоп, история поиска и статистика показов фильмов;
  • Внедрение alembic для комфортной работы с изменениями в базе данных;
  • Замена MemoryStorage на Redis;
  • Базовый деплой бота в Yandex Cloud (VM c открытой с помощью tmux сессией);
  • Кэширование результатов запросов в API, чтобы не перегружать его;
  • Деплой здорового человека через CI с предварительной проверкой тестами и линтерами, сборкой Docker-образов и автоматической выкаткой;
  • Ориентирование на язык пользователя: поддержка вывода описания на русском или английском языках в зависимости от языка в приложении;
  • Добавление дополнительных источников информации о фильмах помимо неофициального API Кинопоиска;
  • Настройка полей в выдаче поиска для каждого пользователя через хранение информации в State;