@slavamironoff

Как загрузить фото сообщением вк?

Доброго времени суток дамы и господа.
Делаю Vk бота, для обработки фото.
Бот принимает изображение в сообщении, он его скачивает сохранив в "image.jpg", обрабатывает, сохраняет в другой файл "processed.jpg" и отправляет пользователю обратно сообщением.
Проблема с последним, а то есть с отправкой обработанного изображения.
Исходя из документации Vk, изображение можно загрузить методом photos.getMessagesUploadServer
Но с ним возникли трудности. Не могу отправить фото на сервер.
Вывод в консоль показал, что проблема в строке с
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="Отправьте фотографию",
                    )
  • Вопрос задан
  • 192 просмотра
Пригласить эксперта
Ответы на вопрос 1
@keddad
Ученик
Нельзя просто указать имя файла, для этого нужен полноценный дескриптор. Нужно сделать что то вроде
files = {'upload_file': open('file.txt','rb')}
r = requests.post(url, files=files)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы