Перейти к содержанию

Загрузка фотографий

Вы можете загружать фотографии напрямую через методы API, либо воспользоваться встроенным загрузчиком

Пути загрузки

Загрузка фотографий на стену, в сообщение, на аватар беседы или куда-либо еще происходит раздельно. Для каждого из таких вариантов существует свой отдельный статический метод:

  • message: Для сообщений
  • chat_ava: Для аватара в беседу
  • album: В альбом
  • wall: На стену
  • page_ava: Аватар страницы/группы
  • market: Товар
  • market_album: Альбом товара

Каждый из этих методов принимает filesили photo (в зависимости от метода), в который вы можете передать один из следующих объектов:

  1. BytesIO объект
  2. Поток байтов (bytes)
  3. pathlib.Path до файла
  4. Путь до фотографии строкой

И также принимает аргументы, которые будут переданы в соответсвующий для каждого из загрузчиков метод, получающий upload_url. То есть каждый из загрузчиков принимает идентичные аргументы, какие бы он принимал при вызове VK API метода, возвращающего upload_url, но при этом вам нужно в эти же аргументы передать поле files/photo. Все аргументы, принимающие файлы, стоят в самом начале, поэтому их можно передавать без имени ключа

Example

Загрузка фотографии в сообщение, указывая путь

photos = vq.Photo.message( # Сюда все поля для `photos.getMessagesUploadServer`
    "example.png", # Не указываем имя аргумента. При случае нескольких фотографий просто перечисляем через запятую (пример ниже)
    peer_id=vq.PEER + 10 # ID какого-то чата
)
photos = await photos() # Сюда можно передать поля для `photos.saveMessagesPhoto` (В конкретном случае)
# Теперь `photos` — список объектов `Photo`
Для метода wall (загружающий на стену) и сохраняющим вызовом методы будут иные (photos.getWallUploadServer и photos.saveWallPhoto)


Код для копипаста в реакцию (со стертыми комментариями). Не забудьте сделать ее async и добавить payload-аргумент типа vq.Event()

photos = vq.Photo.message(
    "example.png",
    peer_id=event.object.message.peer_id
)
photos = await photos()

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

Tip

Если ваш загрузчик загружал фото в сообщение, вы можете передать результат напрямую в поле attachment у vq.Message (пример внизу)

Объект Photo

Каждый объект фотографии (описанный документацией VK API), полученный загрузчиком (загрузчик в любом случае возвращает список этих фотографий), имеет несколько определенных полей и возможностей:

  • info: Все содержимое вкшного объекта фотографии, описаннного у них в документации
  • full_id: Полный айдификатор (f"{self.info.owner_id}_{self.info.id}"), используемый, например, для photo_id при инициализации элемента карусели
  • as_attach: full_id с приставкой photo в начале (f"photo{self.full_id}") + access_key, если таковой имеется

__repr__ возвращает поле as_attach

Example

Загрузка фотографий в сообщение всеми способами

from pathlib import Path

import vkquick as vq


@vq.Cmd(names=["send photo"], prefs=["/"])
@vq.Reaction("message_new")
async def send_photo(event: vq.Event):
    photos = vq.Photo.message(
        "example123.png", # Путь строкой
        Path("example123.png"), # Путь через pathlib.Path,
        open("example123.png", "rb").read(), # Байтами
        open("example123.png", "rb"), # BytesIO
        await vq.Photo.download("https://example.com/some/link/to/image") # Загрузка фотографии по ссылке
        peer_id=event.object.message.peer_id
    )
    photos = await photos() # Сюда поля для `.save` метода
    return vq.Message("Your photo:", attachment=photos)