Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

python загрузка файлов vk

#python #вконтакте #vkontakte_api


Подключил VK API. Необходимо сделать отправку файлов на сервер как о этом рассказано
на этой странице - http://vk.com/dev/upload_files
P.S. Загрузка файлов на стену пользователя

import vk
from time import sleep
import sys
import urllib.request
import urllib.parse
import base64
import requests

vkapi = vk.API(access_token='token', app_id='id')
sleep(0.5)

data = vkapi.photos.getWallUploadServer(user_id="72374405")
DATA_USER_ID = data['user_id']
DATA_ALBUM_ID = data['album_id']
DATA_UPLOAD_URL = data['upload_url']

#with open("1.jpg", "rb") as image_file:
    #fileD = base64.b64encode(image_file.read())


#files = {'1.jpg': open('1.jpg', 'rb')}
#r = requests.post(DATA_UPLOAD_URL, files=files)
#r.status_code == requests.codes.ok
#print(r)
#html = r.read().decode("utf-8")

#dataP = '1.jpg'
dataP = "photo=" + dataP#.encode("ASCII")
response = urllib.request.urlopen(DATA_UPLOAD_URL,dataP)
html = response.read().decode("utf-8")
print (html)


решеткой помечено то, что пробовал но не сработало, либо не подошло.

Вроде как корректно отработался вариант с 

files = {'1.jpg': open('1.jpg', 'rb')}
r = requests.post(DATA_UPLOAD_URL, files=files)
r.status_code == requests.codes.ok
print(r)
#html = r.read().decode("utf-8")


Однако в таком случае не работает вывод и тем самым я не могу понять, отработался
ли должным образом запрос.

В случае успешного завершения кода выхлоп таков: 

{"server":622624,"photo":"[]","hash":"8112ae8847b27fb1cdf678d3d168e6ae"}


То есть загрузка изображения провальная.

Может кто-либо смог или и так знает как загрузить файл на сервер ВК через POST на
Python3. Поделитесь опытом, советом, замечанием. Если что-то в коде непонятно - пишите;
отвечу.
    


Ответы

Ответ 1



Вот мой вариант размещения фотографии на стене сообщества от имени сообщества. Реализован алгоритм, описанный в официальной документации: # Импортируем необходимые модули import vk import requests # Задаём идентификатор группы, токен доступа, картинку и её описание group_id = 'my_group_id' access_token = 'my_access_token' filename = 'image.jpg' caption = 'Some text' # Авторизуемся в VK session = vk.Session(access_token=access_token) vk_api = vk.API(session) # Получаем адрес сервера для загрузки картинки upload_url = vk_api.photos.getWallUploadServer(group_id=group_id)['upload_url'] # Формируем данные параметров для сохранения картинки на сервере request = requests.post(upload_url, files={'photo': open(filename, "rb")}) params = {'server': request.json()['server'], 'photo': request.json()['photo'], 'hash': request.json()['hash'], 'group_id': group_id} # Сохраняем картинку на сервере и получаем её идентификатор photo_id = vk_api.photos.saveWallPhoto(**params)[0]['id'] # Формируем параметры для размещения картинки в группе и публикуем её params = {'attachments': photo_id, 'message': caption, 'owner_id': '-' + group_id, 'from_group': '1'} vk_api.wall.post(**params)

Ответ 2



Есть библиотека vk_api, у нее есть вспомогательный класс для загрузки файлов VkUpload, а у него есть нужный метод photo_wall. Добавляю пример использования (ссылка на полный скрипт с картинками): import vk_api from vk_api import VkUpload login, password = '', '' # Авторизация vk_session = vk_api.VkApi(login, password) vk_session.auth() upload = VkUpload(vk_session) # Для загрузки изображений # Загрузка картинок на сервера вк и получение их id photos = ['1.jpg', '2.jpg'] photo_list = upload.photo_wall(photos) attachment = ','.join('photo{owner_id}_{id}'.format(**item) for item in photo_list) # Добавление записи на стену vk_session.method("wall.post", { 'owner_id': None, # Посылаем себе на стену 'message': 'Test!', 'attachment': attachment, }) Вот так будет выглядеть запись на стене:

Ответ 3



Как-то разобрался :D import vk from time import sleep import sys import urllib.request import urllib.parse import base64 import requests import json vkapi = vk.API(access_token='token', app_id='app_id') sleep(0.5) data = vkapi.photos.getWallUploadServer(user_id="72374405") DATA_USER_ID = data['user_id'] DATA_ALBUM_ID = data['album_id'] DATA_UPLOAD_URL = data['upload_url'] r = requests.post(DATA_UPLOAD_URL, files={'photo': open('1.jpg',"rb")}) r.status_code == requests.codes.ok params = {'server': r.json()['server'], 'photo': r.json()['photo'], 'hash': r.json()['hash']} wallphoto = vkapi.photos.saveWallPhoto(**params) #attachments.append(wallphoto[0]['id']) photoID = wallphoto[0]['id'] params = {'attachments': 'photo' + '72374405_' + str(photoID), 'message': 'Test'} params['owner_id'] = '72374405' print(params) vkapi.wall.post(**params) Позже уже буду разбираться во всем этом коде и делать его более читаемым. Главное что он сейчас работает :)

Комментариев нет:

Отправить комментарий