Как отправить картинку vk api

Yondime

Известный

Автор темы

Первым делом нам нужно подключить необходимые либы и ввести токен с айди юзера + рандомное число для ВК АПИ

Вводим константы + либы:

local requests = require(«requests») — самая крутая либа local USER_ID = 010101010110 — айди пользователя local GROUP_TOKEN = «ПРИВАТКА» — токен группы
Нужная функция для ВК АПИ, получаем рандомное число:
function randomInt() — выдает рандомное число, чтобы сообщение отправилось ( требует вк апи ) math.randomseed(os.time() + os.clock()) return math.random(-2147483648, 2147483648) end
Чтобы отправить фото, мы сделаем функцию для простого использования
Вызываем функцию отправления фотографии:
sendPhoto(getGameDirectory()..’/1.png’) function sendPhoto(path) — содержимое функции распишу ниже end
Для отправки фотки, следуя методам по апи вк, нужно залить ее на сервер
Загрузка фотки на сервер:
local upResponse = requests.post((«https://api.vk.com/method/photos.getMessagesUploadServer?user_id=%dv=5.131»):format(USER_ID, GROUP_TOKEN)).json() — отправляем запрос на метод вк, в котором получаем ссылочку для загрузки local uploadedResponse = uploadPhoto(path, upResponse.response.upload_url) — загружаем фото на ссылку
Функция загрузки фотки по ссылке:

Учим бота отправлять изображения. Курс «Создание чат-бота ВКонтакте на python». Часть 4


Загружаем фотографию по полученной ссылке:
function uploadPhoto(filename, uploadUrl) local fileHandle = io.open(filename,»rb») if (fileHandle) then local fileContent = fileHandle:read( «*a» ) fileHandle:close() local boundary = ‘abcd’ local header_b = ‘Content-Disposition: form-data; name=»file»; filename=»‘ .. filename .. ‘»rnContent-Type: image/pngrn’ local fileContent = ‘—‘ ..boundary .. ‘rn’ ..header_b ..’rn’.. fileContent .. ‘rn—‘ .. boundary ..’—rn’ local resp = requests.post(uploadUrl, < headers = < [«Content-Length»] = fileContent:len(), [‘Content-Type’] = ‘multipart/form-data; boundary=’ .. boundary >, data = fileContent >) return resp.json() end end

Дальше мы сохраняем нашу фоточку по методу в вк апи чтобы получить нужные нам данные для прикрепления ее к сообщению

Получаем данные для прикрепления фотографии к сообщению:

Еще по теме:  Где находится архив в ВК с телефона на айфоне

local saveResponse = requests.post((«https://api.vk.com/method/photos.saveMessagesPhoto?server=%dhash=%sv=5.131»):format(uploadedResponse.server,uploadedResponse.photo,uploadedResponse.hash, GROUP_TOKEN)).json() local image = saveResponse.response[1] local att_image = («photo%d_%d_%s»):format(image.owner_id, image.id, image.access_key)
Ну и в конце мы просто отправляем стандартное сообщение вк обычным методом
Отправляем сообщение с прикрепленной Фотографией:
return requests.post((«https://api.vk.com/method/messages.send?user_id=%daccess_token=%sv=5.131»):format(USER_ID, att_image, GROUP_TOKEN, randomInt())) — обычный способ отправки вк
В итоге так будет выглядеть функция в сборе:
Готовая функция sendPhoto:
function sendPhoto(path) local upResponse = requests.post((«https://api.vk.com/method/photos.getMessagesUploadServer?user_id=%dv=5.131»):format(USER_ID, GROUP_TOKEN)).json() local uploadedResponse = uploadPhoto(path, upResponse.response.upload_url) local saveResponse = requests.post((«https://api.vk.com/method/photos.saveMessagesPhoto?server=%dhash=%sv=5.131»):format(uploadedResponse.server,uploadedResponse.photo,uploadedResponse.hash, GROUP_TOKEN)).json() local image = saveResponse.response[1] local att_image = («photo%d_%d_%s»):format(image.owner_id, image.id, image.access_key) return requests.post((«https://api.vk.com/method/messages.send?user_id=%daccess_token=%sv=5.131»):format(USER_ID, att_image, GROUP_TOKEN, randomInt())) end

Готовый код прикреплю в файлике ниже

отправляем картинку с помощью вк бота(на python)


Если есть вопросы, готов ответить на них в теме или лс группы вк ​

Источник: www.blast.hk

Как отправить картинку пользователю с помощью бота в вк [закрыт]

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

Закрыт 3 года назад .

Язык Python, библиотека vk_api.
Проверял множество способов которые нашел в интернете, но ничего не работает.
Мне нужно когда пользоветель отправляет боту команду /tabl , бот отсылал картинку. Проблема в том, что я немогу отсылать картинку.
Помогите кто знает.

Отслеживать
user262779
задан 23 авг 2019 в 14:28
375 2 2 серебряных знака 14 14 бронзовых знаков

«Проверял множество способов», — какие именно? Обычно используется класс VkUpload и его метод photo_messages после чего полученный access_token прикладывается attachment ‘ом типа photo к сообщению.

23 авг 2019 в 14:44
Если можеш пример использования напиши пожалуйста
23 авг 2019 в 14:58
У меня получилось получить access_key, а как его в отправить?
24 авг 2019 в 8:52

Еще по теме:  Коды стикеров в ВК

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Для загрузки фотографии на сервер ВК используется класс VkUpload и его метод photo_messages .

Данный метод вернёт нам ответ, из которого нам необходимо извлечь owner_id , id и access_key . Данные значения нам нужны для формирования attachment ‘а к сообщению.

attachment имеет следующий вид: f’__’ .
Иногда access_key можно опустить, но для отправки в сообщениях он нужен.

Формируем его с типом photo и значениями, полученными выше.
Чтобы приложить его к сообщению, используется поле с тем же названием — attachment .

Пример:

from vk_api import VkApi from vk_api.upload import VkUpload from vk_api.utils import get_random_id TOKEN = ‘. ‘ PEER_ID = . def upload_photo(upload, photo): response = upload.photo_messages(photo)[0] owner_id = response[‘owner_id’] photo_id = response[‘id’] access_key = response[‘access_key’] return owner_id, photo_id, access_key def send_photo(vk, peer_id, owner_id, photo_id, access_key): attachment = f’photo__’ vk.messages.send( random_id=get_random_id(), peer_id=peer_id, attachment=attachment ) def main(): vk_session = VkApi(token=TOKEN) vk = vk_session.get_api() upload = VkUpload(vk) send_photo(vk, PEER_ID, *upload_photo(upload, ‘photo.jpg’)) if __name__ == ‘__main__’: main()

Данный код отправит в беседу (или ЛС) c peer_id равным PEER_ID изображение photo.jpg

Не забудьте заменить в начале кода переменные TOKEN ( access_token ) и PEER_ID на соответствующие им свои значения.

UPD:

Для отправки фото по URL его все равно придётся загрузить (хотя бы в ОЗУ).
Для этого можно воспользоваться модулями requests и io .

Пример:

from vk_api import VkApi from vk_api.upload import VkUpload from vk_api.utils import get_random_id import requests from io import BytesIO TOKEN = ‘. ‘ PEER_ID = . URL = ‘. ‘ def upload_photo(upload, url): img = requests.get(url).content f = BytesIO(img) response = upload.photo_messages(f)[0] owner_id = response[‘owner_id’] photo_id = response[‘id’] access_key = response[‘access_key’] return owner_id, photo_id, access_key def send_photo(vk, peer_id, owner_id, photo_id, access_key): attachment = f’photo__’ vk.messages.send( random_id=get_random_id(), peer_id=peer_id, attachment=attachment ) def main(): vk_session = VkApi(token=TOKEN) vk = vk_session.get_api() upload = VkUpload(vk) send_photo(vk, PEER_ID, *upload_photo(upload, URL)) if __name__ == ‘__main__’: main()

Еще по теме:  Как установить статус в ВК для сообщества

Источник: ru.stackoverflow.com

Как отправить фото в Вк ботом с помощью Python?

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

  • Вопрос задан более трёх лет назад
  • 14939 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 3

EvgenyCherny

I’m don’t want you say I love you.
Привет, ты можешь воспользоваться комментариями выше, но я отвечу на твой вопрос

«Я хочу отправить фото с компьютера»

так вот чтобы отправить фото с компьютера нужно его загрузить и отправить методом messages.send
Ниже приведен код:

a = vk.method(«photos.getMessagesUploadServer») b = requests.post(a[‘upload_url’], files=).json() c = vk.method(‘photos.saveMessagesPhoto’, )[0] d = «photo<>_<>».format(c[«owner_id»], c[«id»]) vk.method(«messages.send», )

Также не забудьте прописать import requests

Ответ написан более трёх лет назад
Нравится 1 1 комментарий
Знаю, что поздно пишу, но у меня ошибка
File «E:ProjectsBotsTelegram Bot to Vk postingvk2.py», line 10, in b = requests.post(vk.method(«photos.getMessagesUploadServer»)[‘upload_url’], files=).json() TypeError: VkApiMethod.__call__() takes 1 positional argument but 2 were given

Bloodie_lie

В vk_api встроена нужная вам функция VkUpload
Пример:

upload = vk_api.VkUpload(vk) photo = upload.photo_messages(‘вашфайл’) owner_id = photo[0][‘owner_id’] photo_id = photo[0][‘id’] access_key = photo[0][‘access_key’] attachment = f’photo__’ vk.messages.send(peer_id=event.object.peer_id, random_id=0, attachment=attachment)
Ответ написан более трёх лет назад
Нравится 1 2 комментария

знаю поздно пишу , но у меня он жалуется на последнюю строчку vk.messages.send(peer_id=event.object.peer_id, random_id=0, attachment=attachment)
Traceback (most recent call last):
File «C:/Users/slava/PycharmProjects/pythonProject1/venv/test.py», line 24, in
vk.messages.send(peer_id=event.object.peer_id, random_id=0, attachment=attachment)
NameError: name ‘event’ is not defined

Я в этом деле новичок, но хотелось бы узнать почему это могло произойти. В качестве фотографии я использую скриншот

pg.screenshot(«screenshotacran.png») upload = vk_api.VkUpload(vk) photo = upload.photo_messages(‘screenshotacran.png’) owner_id = photo[0][‘owner_id’] photo_id = photo[0][‘id’] access_key = photo[0][‘access_key’] attachment = f’photo__’ vk.messages.send(peer_id=event.object.peer_id, random_id=0, attachment=attachment)

Источник: qna.habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...