Доброго времени суток дамы и господа.
Делаю 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="Отправьте фотографию",
)