Answer the question
In order to leave comments, you need to log in
How to upload a photo with a VK message?
Good afternoon ladies and gentlemen.
I'm making a Vk bot for photo editing.
The bot receives an image in a message, downloads it, saves it in "image.jpg", processes it, saves it in another file "processed.jpg" and sends it back to the user as a message.
The problem is with the latter, that is, with sending the processed image.
Based on the Vk documentation, the image can be loaded using the method photos.getMessagesUploadServer
But there were difficulties with it. Can't send photo to server.
The console output showed that the problem is in the line with
uploads = requests.post(upload_url, files="processed.jpg")
Traceback (most recent call last):
File "C:\Users\admin\Desktop\python\vkbot\bot.py", line 107, in <module>
image_processeds()
File "C:\Users\admin\Desktop\python\vkbot\bot.py", line 92, in image_processeds
uploads = requests.post(upload_url, files="processed.jpg")
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\api.py", line 116, in post
return request('post', url, data=data, json=json, **kwargs)
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\api.py", line 60, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\sessions.py", line 519, in request
prep = self.prepare_request(req)
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\sessions.py", line 462, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\models.py", line 316, in prepare
self.prepare_body(data, files, json)
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\models.py", line 504, in prepare_body
(body, content_type) = self._encode_files(files, data)
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\models.py", line 126, in _encode_files
files = to_key_val_list(files or {})
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\utils.py", line 303, in to_key_val_list
raise ValueError('cannot encode objects that are not 2-tuples')
ValueError: cannot encode objects that are not 2-tuples
import vk_api
from vk_api import VkUpload
from vk_api.longpoll import VkLongPoll, VkEventType
from vk_api.vk_api import VkApiMethod as vk_method
import urllib.request, requests
import image_filters
TOKEN = '_тут_токен_'
token = vk_api.VkApi(token=TOKEN, scope=['photos','messages', 'groups', 'wall'])
longpoll = VkLongPoll(token)
vk_sess = token.get_api()
''' Авторизация по токену, назначение прав доступа к сообщениям, группе, стене. Запуск longpoll '''
for event in longpoll.listen():
''' Прослушка longpoll '''
if event: # Если есть сообщение
if event.type == VkEventType.MESSAGE_NEW and event.to_me:
''' Если есть новое сообщение, адресованное в ЛС группы '''
if event.from_user: # Если пишет пользователь
print("У вас новое сообщение")
''' Прослушка longpoll '''
if event: # Если есть сообщение
if event.type == VkEventType.MESSAGE_NEW and event.to_me:
''' Если есть новое сообщение, адресованное в ЛС группы '''
if event.from_user: # Если пишет пользователь
vk_sess.messages.send(
user_id=event.user_id,
message="Обработка сообщения..."
)
if event.attachments:
print("Получено медиа вложение")
print("Тип => " + event.attachments['attach1_type'])
if event.attachments['attach1_type'] == 'photo':
''' Далее через метод getById получаем информацию о сообщении '''
items = vk_sess.messages.getById(message_ids=event.message_id)
print('\n')
def iters_func():
''' Функция для скачивания изображения на сервер, для дальнейшей обработки '''
item_url = items["items"][0]["attachments"][0]["photo"]["sizes"][4]["url"]
list_items = [item_url]
for value in list_items:
''' Итерирование списка '''
print(value)
''' Сохранение фотографий на сервере '''
urllib.request.urlretrieve(value, "image.jpg")
iters_func()
def image_processeds():
""" Функция сообщает пользователю, что изображение обрабатывается
Далее вызываются функции обработки из модуля image_filters
После обработки фото, бот отправляет соощения, что фото обработано
и отправляет обработанное фото """
vk_sess.messages.send(
user_id=event.user_id,
message="Фотография обрабатывается"
)
vk_sess.messages.send(
user_id=event.user_id,
message="Секундочку...."
)
image_filters.pixel_light()
image_filters.image_contrasts()
image_filters.image_sharpness()
vk_sess.messages.send(
user_id=event.user_id,
message="Фотография обработана.",
)
methods = vk_sess.photos.getMessagesUploadServer(peer_id=event.user_id)
upload_url = methods['upload_url']
print(upload_url)
album_id = methods['album_id']
group_id = methods['group_id']
uploads = requests.post(upload_url, files="processed.jpg")
vk_sess.messages.send(
user_id=event.user_id,
message='processed.jpg'
)
image_processeds()
elif event.attachments['attach1_type'] != 'photo':
vk_sess.messages.send(
user_id=event.user_id,
message="Отправьте фотографию",
)
elif event.text:
vk_sess.messages.send(
user_id=event.user_id,
message="Отправьте фотографию",
)
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question