Как прикрепить изображение vk api

Всем привет! В этой статье мы разберём, как сделать сделать бота для ВКонтакте с помощью Python. Наш бот будет получать сообщение от пользователя и, если оно совпадает с заданным значением, отправлять ответ.

Что понадобится

  • Python версии 3.0+
  • Любая среда разработки или редактор кода (мы используем PyCharm 2020.2.3 Pro)
  • Любое сообщество Vk, к которому вы имеете доступ от имени администратора.

1) Вконтакте

Для начала нужно зайти в группу Vk и найти нужный нам токен сообщества. Токен — уникальный код, который предоставляет право управлять сообществом владельцу этого токена. Так что не размещайте его на публичных страницах, доступных для всех.

Для этого нам нужно перейти на страницу сообщества, «Управление» => «Работа с API». Что такое API объясняется подробнее в этой статье. Далее нажимаем создать ключ, выбираем все галочки и копируем готовый токен.

2) Код программы

Первым делом проверяем наличие Python на компьютере. Для этого открываем терминал (Консоль разработчика на Windows) и пишем слово «python». В случае успеха, в ответ вы получаете информацию об установленной версии языка. Если терминал выдает ошибку, то нужно установить Python на компьютер. Как это сделать описано здесь .

4 API Вконтакте и Python 3: загружаем фото в альбом группы

После установки ЯП, переходим к файлам: нам их потребуется два. Первый файл назовём «tokens.py». В нём будут содержаться токены сообществ, если мы будем использовать не одну группу. Второй файл называется «main.py», в нём будет сам бот.

Еще по теме:  Как узнать id диалога ВК в архиве

Как и в любой программе, сначала импортируем библиотеки. Мы будем использовать библиотеку Vk API. Для её установки заходим в терминал и пишем

pip3 install vk_api

После установки библиотеки, нам следует импортировать её и несколько отдельных модулей внутрь самого нашего файла. Для этого пишем

import vk_api
from vk_api.longpoll import VkEventType, VkLongPoll
from tokens import main_token

Следующий шаг — авторизация бота. Здесь-то нам и понадобится наш токен (полный код программы внизу).

vk_session = vk_api.VkApi(token =main_token)
session_api = vk_session.get_api()
longpoll = VkLongPoll(vk_session)

Затем стоит создать функцию отправки сообщений и указать нужные нам параметры (как добавить вложения в сообщение будет указано в конце статьи).

def sender (id, text):
vk_session.method(‘messages.send’ , ‘message’ : text,
‘random_id’ : 0 >)

Функция принимает 2 значения: «id» и «text». «id» отвечает за внутренний айди пользователя. Его мы берём у него, когда тот пишет в сообщество, а позже ему же отправляем сообщение, за которое отвечает «text».

Хочется заметить наличие параметра «random_id». Этот параметр просто необходим для корректной работы бота, поэтому его просто нужно прописать и присвоить ему значение нуля.

VK API #2 Wall post/edit/delete

Последний этап программы — прослушка поступления новых сообщений. Пока бот запущен, он будет безостановочно проверять, не появилось ли новое сообщение, а если появилось — отправит заданный ответ пользователю. Так, например, если бот получит сообщение «Привет!», то отправит в ответ «Привет, Мир!». Но пользователь может написать кодовое слово как с большой буквы, так и с маленькой. Для того чтобы избежать ошибок в работе бота, используется встроенный метод Пайтона lower(), который переводит весь текст в нижний регистр.

for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.to_me:
if event.to_me:
vk = vk_session.get_api()
msg = event.text.lower()
> user_get = vk.users.get(user_ids =id)
user_get = user_get[0]

if msg == «привет!» :
sender(id, «Привет, Мир!»)

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

Еще по теме:  Как сделать старый интерфейс в ВК

Бонус: как прикрепить фотографию к сообщению

Делается это очень просто: в функции, которая отвечает за отправку сообщений, нужно добавить новый параметр «attachment» и значением для него сделать ссылку на изображение внутри Vk.

def sender (id, text):
vk_session.method(‘messages.send’ , ‘message’ : text,
‘attachment’ : ‘photo1_456264771’ ,
‘random_id’ : 0 >)

Полный код программы

import vk_api
from vk_api.longpoll import VkEventType, VkLongPoll
from tokens import main_token

vk_session = vk_api.VkApi(token =main_token)
session_api = vk_session.get_api()
longpoll = VkLongPoll(vk_session)

def sender (id, text):
vk_session.method(‘messages.send’ , ‘message’ : text,
‘random_id’ : 0 >)

for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.to_me:
if event.to_me:
vk = vk_session.get_api()
msg = event.text.lower()
> user_get = vk.users.get(user_ids =id)
user_get = user_get[0]

Источник: dzen.ru

Как загрузить картинку к посту в VK с помощью Python

Пытаюсь загрузить картинку вконтакте, прикрепить ее к посту и опубликовать все это на стену группы с помощью Python и VK Api.

Скрипт выглядит вот так:

session = vk.Session(«Здесь_токен») api = vk.API(session) result = api.photos.getWallUploadServer(gid=’110956219′) upload_url = result[‘upload_url’] img = response = requests.post(upload_url, files=img) result = json.loads(response.text) api.photos.saveWallPhoto(photo=json.loads(result[‘photo’])[0][‘photo’], hash=result[‘hash’], server=result[‘server’], gid=’110956219′);

Но при попытке сохранить картинку, в последней строчке получаю ошибку: vk.exceptions.VkAPIError: 121. Invalid hash

  • Хэш передается верный;
  • Права на публикацию в группе есть;
  • Права у приложения wall, photos, groups есть;
  • Параметр gid передается.

В чем еще может быть проблема?

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

result = api.wall.getPhotoUploadServer(gid=’110956219′)

т.е. вместе photos.getWall* использовать wall.getPhoto .

Обратите внимание, что ответ сервера всегда приходит в формате JSON, а поля server, photo и hash в нем содержат строки, внутренний формат которых может изменяться со временем. В частности, строка photo может содержать другой json-объект, который не следует декодировать, разбирать на части или иным образом модифицировать.

А вы этот самый photo и декодируете, и вытаскиваете из него часть:

Еще по теме:  Что то очень вкусное на Вконтакте

api.photos.saveWallPhoto(photo=json.loads(result[‘photo’])[0][‘photo’]. )

Как следствие, у этого photo получается совсем другой хэш, не совпадающий с переданным вами, на что ВК и ругается.

А надо просто не декодировать:

api.photos.saveWallPhoto(photo=result[‘photo’]. )

Источник: husl.ru

Vk_api — прикрепление фотографии и отправка сообщения — Python

Прошу помощи с vk_api: ссылка на github Не могу понять каким образом отправить фото в сообщение. Знаю, что нужно для этого загрузить фото на сайт, получить какие-то его параметры и куда-то вбить. Не пойму какие функции с какими параметрами или какие объекты с какими методами использовать. Запутался окончательно.

Сейчас есть программа (бот), которая авторизуется на сервере VK по токену сообщества. Боту присылаешь фотографию. Бот находит ссылку на эту фотографию. Считывает фотографию. Делает обработку фотографии.

Сохраняет обработанную фотографию на компьютер, где запущен бот. Вопрос: как теперь эту фотографию отправить в ответ? То есть пользователь загрузил фото, и должен в ответ получить уже обработанное. Имеющийся код:

# -*- coding: utf-8 -*- import vk_api import cv2 import numpy import urllib import vk_api.longpoll def main(): token_file = open(‘token.txt’) vk_session = vk_api.VkApi(token = token_file.read()) token_file.close() vk_session._auth_token() vk = vk_session.get_api() longpoll = vk_api.longpoll.VkLongPoll(vk_session) for event in longpoll.listen(): if event.type == vk_api.longpoll.VkEventType.MESSAGE_NEW and event.to_me: msg = vk.messages.getById(message_ids=event.message_id) photo_url = msg[‘items’][0][‘attachments’][0][‘photo’][‘photo_2560’] req = urllib.request.urlopen(photo_url) arr = numpy.asarray(bytearray(req.read()), dtype=numpy.uint8) img = cv2.imdecode(arr, -1) img = cv2.bitwise_not(img) cv2.imwrite(«1.jpg», img) if __name__ == ‘__main__’: main()

Код к задаче: «Vk_api — прикрепление фотографии и отправка сообщения»

Листинг программы

def photo_messages(self, photos): «»» Загрузка изображений в сообщения :param photos: путь к изображению(ям) или file-like объект(ы) :type photos: str, list «»» url = self.vk.method(‘photos.getMessagesUploadServer’)[‘upload_url’] photo_files = open_files(photos) response = self.vk.http.post(url, files=photo_files) close_files(photo_files) response = self.vk.method(‘photos.saveMessagesPhoto’, response.json()) return response

Источник: studassistent.ru

Рейтинг
( Пока оценок нет )
Загрузка ...