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
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
В 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