Wall post attachments python

Как загрузить изображение на стену в VK через VK API на Python?

Есть изображение на компьютере. Как загрузить это изображение на стену группы VK через VK API на Python? Официальная документация не помогла.

tibhar940

Для данной операции вам необходимо получить токен для вашего приложения.
Можно использовать vk_auth
Для отправления запросов можно использовать библиотеку requests

import requests import json import vk_auth # Ваши данные ВК email = '' password = '' client_id = '' # Необходимые нам права scope = 'wall,photos' # Идентификаторы группы gid = '' token = vk_auth(email, password, client_id, scope)[0] # путь к вашему изображению img = # Получаем ссылку для загрузки изображений method_url = 'https://api.vk.com/method/photos.getWallUploadServer?' data = dict(access_token=token, gid=gid) response = requests.post(method_url, data) result = json.loads(response.text) upload_url = result['response']['upload_url'] # Загружаем изображение на url response = requests.post(upload_url, files=img) result = json.loads(response.text) # Сохраняем фото на сервере и получаем id method_url = 'https://api.vk.com/method/photos.saveWallPhoto?' data = dict(access_token=token, gid=gid, photo=result['photo'], hash=result['hash'], server=result['server']) response = requests.post(method_url, data) result = json.loads(response.text)['response'][0]['id'] # Теперь этот id остается лишь прикрепить в attachments метода wall.post method_url = 'https://api.vk.com/method/wall.post?' data = dict(access_token=token, owner_id='-' + gid, attachments=result, message='') response = requests.post(method_url, data) result = json.loads(response.text) # На выходе мы получим в ответе post_id если не было ошибки

Источник

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

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

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

files = r = requests.post(DATA_UPLOAD_URL, files=files) r.status_code == requests.codes.ok print(r) #html = r.read().decode("utf-8") 

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

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

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

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

Ответы (3 шт):

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=) r.status_code == requests.codes.ok params = wallphoto = vkapi.photos.saveWallPhoto(**params) #attachments.append(wallphoto[0]['id']) photoID = wallphoto[0]['id'] params = params['owner_id'] = '72374405' print(params) vkapi.wall.post(**params) 

Позже уже буду разбираться во всем этом коде и делать его более читаемым. Главное что он сейчас работает 🙂

Читайте также:  View image in html page

Вот мой вариант размещения фотографии на стене сообщества от имени сообщества. Реализован алгоритм, описанный в официальной документации:

# Импортируем необходимые модули 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=) params = # Сохраняем картинку на сервере и получаем её идентификатор photo_id = vk_api.photos.saveWallPhoto(**params)[0]['id'] # Формируем параметры для размещения картинки в группе и публикуем её params = vk_api.wall.post(**params) 

Есть библиотека 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_'.format(**item) for item in photo_list) # Добавление записи на стену vk_session.method("wall.post", < 'owner_id': None, # Посылаем себе на стену 'message': 'Test!', 'attachment': attachment, >) 

Вот так будет выглядеть запись на стене:

Источник

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

Стоит задача загрузить с компьютера и отправить в предложку сообщества фотографию. Ниже описанный код прекрасно работает в методе по отправки фото в сообщения пользователю, но вот на стену загружать не хочет.

import vk_api from vk_api import VkUpload from vk_api.longpoll import VkLongPoll, VkEventType from vk_api.utils import get_random_id import requests import csv import json #Процесс авторизации token = #Тут мой токен authorize = vk_api.VkApi(token = token) longpoll = VkLongPoll(authorize) photo = 'photo/2.jpg' # Сюда помещаю фото из папки image = photo upload = VkUpload(authorize) upload_image = upload.photo_messages(photos = image)[0] attachments = 'photo<>_<>'.format(upload_image['owner_id'], upload_image['id']) href = "'" + attachments + "'" #Проверял, на выходе получается результат по шаблону 'photo100172_166443618' # Функция отправки на стену def send_content( href): authorize.method('wall.post', )

SoreMix

1. Зачем нужны кавычки в href = «‘» + attachments + «‘» ?
2. Загружаете фото на сервер для отправки в ЛС, а сами пытаетесь загрузить фото на стену. Используйте метод для загрузки на стену, как ни странно.

Читайте также:  Символ перевода строки питон

idontgetit

Хах. Точно
Большое спасибо за помощь.

Я новичок и данный код собран кусками с разных уроков, а то что загружает фото в других назначениях не учёл, отчасти из-за внимательности, отчасти из-за частичного непонимания принципов работы

Источник

Бот для автопостинга VK

Для работы нам понадобится токен с разрешениями wall и offline. Для получения токена создайте свое Standalone-приложение Vk. И сохраните его ID.

Далее перейдите по ссылке:
oauth.vk.com/authorize?client_id=IDAPP&scope=wall,offline&redirect_uri=http://api.vk.com/blank.html&response_type=token
И вместо IDAPP подставьте ID своего приложения. Или воспользуйтесь ссылкой, которую я подготовил специально для Вас.

Если все сделано правильно Вас перекинет на другой сайт, а в URL странице в GET параметре access_token будет токен, который нам и нужен, сохраняем его.

Работа XML

Для хранения настроек созданим файл формата .xml со следующем контентом:

 token Text post 120  attachment  copyright 5.122  short name group   
  • «token» на токен, который мы получили выше
  • «Text post» на сообщение, которое должно быть в записи
  • «attachment» на объект, который будет прикреплен к записи
  • «copyright» на ссылку источника
  • «short name group» на короткое имя(без vk.com) страницу сообщества/ пользователя, где будет проходить публикация(стена должна быть открытой для публикации)

Начнем писать код

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

import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML("settings") VK = vk_api.VkApi(token=XML.parsingFile("token")) 

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

import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML("settings") VK = vk_api.VkApi(token=XML.parsingFile("token")) groupsId = [] groupsShortName = "" for child in XML.parsingFile("groups", False): groupsShortName += child.text + "," for group in VK.method("groups.getById", ): groupsId.append(group["id"] * -1) del groupsShortName 

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

import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML("settings") VK = vk_api.VkApi(token=XML.parsingFile("token")) groupsId = [] groupsShortName = "" for child in XML.parsingFile("groups", False): groupsShortName += child.text + "," for group in VK.method("groups.getById", ): groupsId.append(group["id"] * -1) del groupsShortName textPost = XML.parsingFile("textPost") intervalPost = int(XML.parsingFile("interval")) 

Теперь получим все объекты, которые будут прикреплены к записи.

import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML("settings") VK = vk_api.VkApi(token=XML.parsingFile("token")) groupsId = [] groupsShortName = "" for child in XML.parsingFile("groups", False): groupsShortName += child.text + "," for group in VK.method("groups.getById", ): groupsId.append(group["id"] * -1) del groupsShortName textPost = XML.parsingFile("textPost") intervalPost = int(XML.parsingFile("interval")) attachments = [attachment.text for attachment in XML.parsingFile("attachments", False)] copyright = XML.parsingFile("copyright") v = XML.parsingFile("v") 

У нас уже есть все данные, которые нам понадобятся для публикации. Осталось только сделать функцию для публикации и цикл, который будет вызывать функцию публикации.

Читайте также:  Quick search in java

Сначала сделаем цикл, а функцию оставим пустой. Так же код будет работать, только если будет запущен из консоли.

import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML("settings") VK = vk_api.VkApi(token=XML.parsingFile("token")) groupsId = [] groupsShortName = "" for child in XML.parsingFile("groups", False): groupsShortName += child.text + "," for group in VK.method("groups.getById", ): groupsId.append(group["id"] * -1) del groupsShortName textPost = XML.parsingFile("textPost") intervalPost = int(XML.parsingFile("interval")) attachments = [attachment.text for attachment in XML.parsingFile("attachments", False)] copyright = XML.parsingFile("copyright") v = XML.parsingFile("v") done = False def publicPosts(): pass if __name__ == "__main__": done = True while done: publicPosts() time.sleep(intervalPost) 

Чтобы публиковать запись будем вызвать метод API «wall.post» и передавать параметры получение раньше. Если все сработает правильно будет выводится соответствующее сообщение в консоль.

import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML("settings") VK = vk_api.VkApi(token=XML.parsingFile("token")) groupsId = [] groupsShortName = "" for child in XML.parsingFile("groups", False): groupsShortName += child.text + "," for group in VK.method("groups.getById", ): groupsId.append(group["id"] * -1) del groupsShortName textPost = XML.parsingFile("textPost") intervalPost = int(XML.parsingFile("interval")) attachments = [attachment.text for attachment in XML.parsingFile("attachments", False)] copyright = XML.parsingFile("copyright") v = XML.parsingFile("v") done = False def publicPosts(): for groupId in groupsId: for i in range(1, 5): result = VK.method("wall.post", < "owner_id": groupId, "message": textPost, "attachments": attachments, "copyright": copyright, "v": v >) if result["post_id"]: print("Good post, id post - " + str(result["post_id"])) else: print("Error posting") if __name__ == "__main__": done = True while done: publicPosts() time.sleep(intervalPost) 

Заключение

Вот и все, весь код готов. Скажу Вам сразу же мне — 13 лет. И я хочу рассказать и поделиться тем, что я умею и считаю интересным для других. Так мою прошлую публикацию прочитали 2к+ человек, а 40 человек сохранили в закладки, хотя там и есть, что доработать. Это меня замотивировала, спасибо Вам большое.

ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды

Источник

Оцените статью