Загрузка фотографий
Вы можете загружать фотографии напрямую через методы 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)