/BackEnd

Решение задач трека Back End команды "Не творог, а творог"

Primary LanguagePython

Back End

Подготовка окружения к запуску:

# Для зауска необходим Python 3.10
# с установленными зависимотями из requirements.tx

pip install -r requirements.txt


# Для первичного создания базы данных необходимо выполнить скрипт:

python db.py

Для выполнения команд, подразумевающих использование VK api, необходимо создать .env файл в корне проекта с access токеном пользователя (гайд по получению):

# .env
ACCESS_TOKEN=830792YOURACCESSTOKEN...

Помимо использования консольных команд, можно использовать API. Запуск осуществляется следующей командой:

python api.py

Автоматически сгенерированная документация с возможностью вызова методов будет доступна по адресу: localhost:4000/docs

Также имеется возможноть просмотреть и поиграться с API по адресу https://warm-brook-59910.herokuapp.com/docs. В API имеется набор предзагруженных изображений (задачи на 10 и 40 баллов), оно полностью функционально (эндпоинт /api/download_images на загрузку новых изображений из альбома VK тоже работает, но, пожалуйста, не загружайте большие альбомы, так как свободное место сильно ограничено).
Внимание: первый запрос может выполняться значительное время (около 30 секунд), так как в случае отсутствия запросов к API в течение некоторого продолжительного времени, Heroku переводит его в спящий режим, на выход из которого требуется время.


10

Задание

Загрузите все мемы в вашу базу (или просто скачайте их локально, используя API ВКонтакте). Выведите в консоль информацию о полученных мемах — их авторов и количество лайков.

Решение

Загрузить изображения из альбома можно используя эндпоинт /api/download_images (см. автодокументацию) или при помощи команды (требуется access токен в .env файле):

python download_images.py
# или
python download_images.py --owner-id -197700721 --album-id 281940823

Просмотреть список всех загруженных картинок можно при помощи эндпоинта /api/print_images или команды:

python print_images.py

20

Задание

Поддержите две команды — лайк и скип каждого из предложенных мемов. Показывайте мемы в порядке их появления в альбоме.

Решение

Консольная утилита

Для просмотра и оценки изображений необходимо запустить утилиту командой:

python explore_images.py
# или
python explore_images.py --album-id 281940823

Пользователю будет показано изображение (ссылка на просмотр) и немного информации о нем (имя автора и количество лайков), а также будут предложены варианты действий:

  • like - лайкает изображение и переходит к следующему
  • skip - переходит к следующему изображению
  • quit - выходит из утилиты

Пример работы:

Как вам данная картинка?
Ссылка: https://sun9-22.userapi.com/s/v1/ig2/kXarI0MzcoVWDPui1zyH0aDakwoFToFU3nBQPlTnkAxmyy3MpCBi0Kp49d5iq48aI9MlFlKoj3S6H5typmUJhsRZ.jpg?size=1920x1080&quality=95&type=album
Автор: Администрация ВКонтакте
Число лайков: 10
Вы решаете: (like, skip, quit) [skip]: like

А вот эта?
Ссылка: https://sun9-61.userapi.com/s/v1/ig2/qHFoG7wwJEbNnCguxTo6S4LWcH0evp56YrITqH_oV013qIA1UjVScgZ0G3q49cRv5jZXcBJ6AekdLoV5sZyyQPcS.jpg?size=1528x2160&quality=95&type=album
Автор: Влад Хейнов
Число лайков: 5
Вы решаете: (like, skip, quit) [skip]: skip

Вы просмотрели все изображения в альбоме, хотите продолжить? [Y/n]: n

Спасибо за участие!
API

Так как данное задание не подразумевает написание полноценного клиента, будет предложено несколько эндпоинтов, используя которые его можно было бы реализовать. Поиграться с ними можно все также в автодокументации.

Эндпоинт /api/get_first_image_in_album возвращает первое изображение из альбома. Имеет опциональный параметр album_id - ID альбома с изображениями (по умолчанию наш альбом с мемами).

Эндпоинт /api/like_image увеличивает счетчик лайков изображения на один и возвращает следующее изображение в альбоме (циклически). Имеет обязательный параметр id - ID изображения.

Эндпоинт /api/skip_image возвращает следующее изображение в альбоме (циклически). Имеет обязательный параметр id - ID изображения.

ВНИМАНИЕ: ID следующего изображения это поле id, а не image_id в ответах на предыдущие два эндпоинта.


30

Задание

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

Решение

Так как в следующем задании (на 40 баллов) нужно будет дополнить базу новыми изображениями, было решено отказаться от логики просмотра картинок только в одном альбоме, теперь отображаются все доступные изображения из базы.

Принцип работы

Каждому изображению присваивается вес равный числу лайков плюс один: w[i] = likes_count[i] + 1. Исключением является только изображение "фаворит", его вес равен сумме весов остальных изображений: w[F] = sum([w[i] for i in range(N) where i != F]). Чем больше вес, тем больше веротность вытащить изображение. Вероятность вытащить изобращение считается следующим образом: p[i] = w[i] / sum([w[j] for i in range(N)]). Таким образом с наибольшей верояностью мы достаем "фаворит" (вероятность ~0.5), остальные верояности пропорциональны числу лайков.

Чтобы избежать получения одного и того же изображения два раза подряд, ранее полученное изображение исключается во второй итерации (Из-за этого вероятность получить "фаворита" становится незначительно меньше).

Консольная утилита

Для просмотра и оценки изображений необходимо запустить утилиту командой:

python explore_images_v2.py

Утилита сначала спрашивает ID изображения "фаворита", а дальше работа с ней не отличается от работы с утилитой из задания на 20 баллов.

API

Эндпоинт /api/like_image_v2 увеличивает счетчик лайков изображения на один и возвращает следующее случайное изображение. Имеет обязательный параметр id - ID изображения (возвращается изображение, отличного от переданного), и обязательный параметр favourite_id - ID изображения "фаворита" (если задан ID, которого нет в базе, то он не учитывается).

Эндпоинт /api/skip_image_v2 возвращает следующее случайное изображение. Имеет необязательный параметр id - ID изображения (возвращается изображение, отличного от переданного; по умолчанию -1 - возвращает случайное изображение), и обязательный параметр favourite_id - ID изображения "фаворита" (если задан ID, которого нет в базе, то он не учитывается).

ВНИМАНИЕ: ID следующего изображения это поле id, а не image_id в ответах на предыдущие два эндпоинта.


40

Задание

Пополните коллекцию ваших мемов каким-нибудь большим мемным сообществом!

Решение

База изображений была пополнена следующими альбомами:

При помощи соответствующих команд:

# Ваши мопсики
python download_images.py --owner-id -201685685 --album-id 276590697
# Забавные кадры из фильмов и сериалов
python download_images.py --owner-id -30666517 --album-id 179046344
# Цитаты
python download_images.py --owner-id -30666517 --album-id 182535992

50

Задание

Сделайте дашборд голосования — статистику, в которой вы сможете в реальном времени следить за тем, как выставляются лайки и меняется топ самых популярных мемов. Как позаботиться о том, чтобы доступ к статистике был только у нужных пользователей? ;)

Решение

Для просмотра дашборда можно использовать следующую команду (требуется терминал шириной 105 и более символов):

python print_dashboard.py -n 15 -k 10 --secret secret

В консоль будет выведена таблицы топа и последних изображений, которые обновляется каждую секунду:

--------------------------------------------------------------------------------------------------
|                                                                                                |
|                                                                                                |
|                                       TОП 15 изображений                                       |
|                                                                                                |
|                          Время обновления: 2022-04-24 02:33:26.839895                          |
|                                                                                                |
|             ID |          Автор          |Лайки|               Путь                            |
|            ----+-------------------------+-----+-----------------------------------            |
|              10|          Тимофей Москвин|   12|     images/281940823/457240660.jpg            |
|               3|              Влад Хейнов|   11|     images/281940823/457240647.jpg            |
|              15|              Влад Хейнов|    9|     images/281940823/457240671.jpg            |
|              27|             Иван Вожаков|    8|     images/281940823/457240683.jpg            |
|               4|              Влад Хейнов|    6|     images/281940823/457240648.jpg            |
|               8|      Екатерина Казанская|    6|     images/281940823/457240653.jpg            |
|              12|          Степан Работкин|    6|     images/281940823/457240665.jpg            |
|              13|              Влад Хейнов|    6|     images/281940823/457240667.jpg            |
|              42|              Влад Хейнов|    6|     images/281940823/457240701.jpg            |
|               1| Администрация ВКонтакте |    5|     images/281940823/457240642.jpg            |
|               2|              Влад Хейнов|    5|     images/281940823/457240646.jpg            |
|              33|              Влад Хейнов|    5|     images/281940823/457240690.jpg            |
|              48|            Настя Лаврова|    5|     images/281940823/457240708.jpg            |
|               6|              Влад Хейнов|    4|     images/281940823/457240650.jpg            |
|               9|      Екатерина Казанская|    4|     images/281940823/457240659.jpg            |
|                                                                                                |
|                               Последние 10 лайкнутых изображений                               |
|                                                                                                |
|     Прошло времени   | ID |          Автор          |Лайки|               Путь                 |
|  --------------------+----+-------------------------+-----+----------------------------------- |
|        0:00:23.859294|   1| Администрация ВКонтакте |    5|     images/281940823/457240642.jpg |
|        0:00:27.576384|   9|      Екатерина Казанская|    4|     images/281940823/457240659.jpg |
|        0:00:33.595592|  12|          Степан Работкин|    6|     images/281940823/457240665.jpg |
|        0:00:40.129808|  27|             Иван Вожаков|    8|     images/281940823/457240683.jpg |
|        0:00:46.643325|  51|          Гриша Пешехонов|    4|     images/281940823/457240713.jpg |
|        0:00:51.908021|  33|              Влад Хейнов|    5|     images/281940823/457240690.jpg |
|        0:00:54.172496|  18|           Максим Тарасов|    4|     images/281940823/457240674.jpg |
|        0:00:58.696545|   4|              Влад Хейнов|    6|     images/281940823/457240648.jpg |
|        0:01:13.842026|   3|              Влад Хейнов|   11|     images/281940823/457240647.jpg |
|        0:01:15.945689|   2|              Влад Хейнов|    5|     images/281940823/457240646.jpg |
|                                                                                                |
|                                                                                                |
--------------------------------------------------------------------------------------------------

Для просмотра дашборда через API, можно использовать эндпоинт /api/print_dashboard. Он имеет три параметра: n - количество изображений в топе; k - количество изображений в последних; secret - секрет для доступа.

Для доступа к дашборду необходимо знать secret (равен "secret" по умолчанию). Его можно задать через переменные окружения или .env файл.