S
S
slavamironoff2019-07-31 19:06:53
Python
slavamironoff, 2019-07-31 19:06:53

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")

Error output to the console.
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

1 answer(s)
K
keddad, 2019-08-01
@keddad

You can't just specify a file name, you need a full-fledged descriptor for this. You need to do something like

files = {'upload_file': open('file.txt','rb')}
r = requests.post(url, files=files)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question