Загрузка фотографий
Вы можете загружать фотографии напрямую через методы API, либо воспользоваться встроенным загрузчиком
Пути загрузки¶
Загрузка фотографий на стену, в сообщение, на аватар беседы или куда-либо еще происходит раздельно. Для каждого из таких вариантов существует свой отдельный статический метод:
message: Для сообщенийchat_ava: Для аватара в беседуalbum: В альбомwall: На стенуpage_ava: Аватар страницы/группыmarket: Товарmarket_album: Альбом товара
Каждый из этих методов принимает filesили photo (в зависимости от метода), в который вы можете передать один из следующих объектов:
BytesIOобъект- Поток байтов (
bytes) pathlib.Pathдо файла- Путь до фотографии строкой
И также принимает аргументы, которые будут переданы в соответсвующий для каждого из загрузчиков метод, получающий 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)