Подготовка окружения к запуску:
# Для зауска необходим 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 переводит его в спящий режим, на выход из которого требуется время.
Загрузите все мемы в вашу базу (или просто скачайте их локально, используя 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
Поддержите две команды — лайк и скип каждого из предложенных мемов. Показывайте мемы в порядке их появления в альбоме.
Для просмотра и оценки изображений необходимо запустить утилиту командой:
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/get_first_image_in_album
возвращает первое изображение из альбома. Имеет опциональный параметр album_id - ID альбома с изображениями (по умолчанию наш альбом с мемами).
Эндпоинт /api/like_image
увеличивает счетчик лайков изображения на один и возвращает следующее изображение в альбоме (циклически). Имеет обязательный параметр id - ID изображения.
Эндпоинт /api/skip_image
возвращает следующее изображение в альбоме (циклически). Имеет обязательный параметр id - ID изображения.
ВНИМАНИЕ: ID следующего изображения это поле id
, а не image_id
в ответах на предыдущие два эндпоинта.
Отрегулируйте порядок выдачи мемов таким образом, чтобы заданный заранее мем набрал больше всего лайков. Показывайте его чаще других, а конкурирующие мемы, набирающие много лайков, показывайте реже.
Так как в следующем задании (на 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/like_image_v2
увеличивает счетчик лайков изображения на один и возвращает следующее случайное изображение. Имеет обязательный параметр id - ID изображения (возвращается изображение, отличного от переданного), и обязательный параметр favourite_id - ID изображения "фаворита" (если задан ID, которого нет в базе, то он не учитывается).
Эндпоинт /api/skip_image_v2
возвращает следующее случайное изображение. Имеет необязательный параметр id - ID изображения (возвращается изображение, отличного от переданного; по умолчанию -1 - возвращает случайное изображение), и обязательный параметр favourite_id - ID изображения "фаворита" (если задан ID, которого нет в базе, то он не учитывается).
ВНИМАНИЕ: ID следующего изображения это поле id
, а не image_id
в ответах на предыдущие два эндпоинта.
Пополните коллекцию ваших мемов каким-нибудь большим мемным сообществом!
База изображений была пополнена следующими альбомами:
- еврейские анекдоты и мопсы: Ваши мопсики
- Типичный программист: Забавные кадры из фильмов и сериалов
- Типичный программист: Цитаты
При помощи соответствующих команд:
# Ваши мопсики
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
Сделайте дашборд голосования — статистику, в которой вы сможете в реальном времени следить за тем, как выставляются лайки и меняется топ самых популярных мемов. Как позаботиться о том, чтобы доступ к статистике был только у нужных пользователей? ;)
Для просмотра дашборда можно использовать следующую команду (требуется терминал шириной 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
файл.