Как отправить сообщение vk api
Перейти к содержимому

Как отправить сообщение vk api

  • автор:

Как отправить сообщение VK, с помощью Python 3?

Добрый день. До этого писал бота используя vk_api и отправлял сообщения в ответ на присланные. Все работает отлично и без проблем. Но тут встала задача отправки сообщения пользователю просто из списка. Начал искать в интернете и натолкнулся на такую возможность, но через приложение. Во всех примерах (датируемых 2017) используется методы — vk.Session и vk.API, которых на данный момент в библиотеке vk нет. Других примеров найти не смог. Вопрос — как все же отправить сообщение пользователю, зная его ID? Спасибо.

  • Вопрос задан более трёх лет назад
  • 13243 просмотра

Комментировать
Решения вопроса 0
Ответы на вопрос 3

Отправлять сообщение может только группа и только в том случае если пользователь уже отправил ей сообщение

Ответ написан более трёх лет назад
Нравится 1 1 комментарий

vks = vk_api.VkApi(token=token) vk = vks.get_api() vk.messages.send(peer_id = 'ид пользователя или конфы в которую хочешь отправить', random_id = 0, message = 'сообщение')

mspuz @mspuz Автор вопроса

Вот что получилось:
1. С помощью OAuth-авторизации (https://oauth.vk.com/authorize?client_id=&. смог получить token
Далее

import vk token = session = vk.AuthSession(access_token = token) api = vk.API(session) # Например, смог получить тестовые данные о пользователе api.users.get(user_ids=1, v='5.103') # Но при попытке отправки сообщения - получаю Access denied api.messages.send(user_id=96440718, message='Test message', v='5.103')

Как это победить? Или все же невозможно отправить сообщение пользователю просто так?

Нашел такую вот информацию. Видимо теперь просто так сообщение не отправить.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

vk.Session и vk.API были в vk, а вы используете vk_api. Это разные модули.

from vk_api import VkApi, AuthError from vk_api.utils import get_random_id vk_session = VkApi('login', 'password') vk_session.auth(token_only=True) vk = vk_session.get_api() vk.messages.send(user_id=ID_пользователя, message='Сообщение', random_id=get_random_id())

Ответ написан более трёх лет назад
mspuz @mspuz Автор вопроса

from vk_api import VkApi, AuthError from vk_api.utils import get_random_id vk_session = VkApi(login = , password = ) vk_session.auth(token_only=True) vk = vk_session.get_api() vk.messages.send(user_id=, message='Сообщение', random_id=get_random_id())

В результате выдает — «Access denied: no access to call this method». Мне вот интересно, а вы сами хоть раз это делали? Или просто вырываете куски кода из интернета и сюда отправляете?

mspuz @mspuz Автор вопроса

mspuz, Так же попробовал отправлять сообщение друзьям:

from vk_api import VkApi, AuthError from vk_api.utils import get_random_id vk_session = VkApi(login = , password = ) vk_session.auth(token_only=True) vk = vk_session.get_api() for friend in vk.friends.get()['items']: res = vk.messages.send(user_id=friend, message='Сообщение', random_id=get_random_id())

Список ID’шников своих друзей я удачно получаю. Но при попытке отправить сообщение — получаю все тот же «[15] Access denied: no access to call this method».

mspuz, да пробывал, спасибо. Выше человек уже уточнил что с недавних пор message.send не работает для простых смертных. Но вы можете это обойти получив токен из официального приложения и авторизовавшись с его помощью. (Так же нужно указать app_id официального приложения)

Отправить сообщение пользователю через VK API из приложения с типом «Веб-сайт»

Есть сайт с уже работающей авторизацией.
Для сайта в VK создали приложение с типом веб-сайт.
Есть необходимость добавить возможность сайту от имени приложения отправлять сообщение пользователям через VK API .
Возможно ли подобное? Насколько я понял, для приложений типа «сайт» доступны не все методы.
Если возможно, то какой метод будет правильнее использовать?

Отслеживать
5,542 3 3 золотых знака 21 21 серебряный знак 41 41 бронзовый знак
задан 27 апр 2016 в 7:47
43 1 1 серебряный знак 4 4 бронзовых знака

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

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

  1. от другого пользователя ВК messages.send() ;
  2. от сообщества в ответ на запрос пользователя – Сообщения для бизнеса;
  3. уведомления от приложения secure.sendNotification() ;
  4. платная отправка SMS secure.sendSMSNotification() .

Варианты 1–3 не доступны приложению типа «Сайт». Но можно поступить так:

Заведите аккаунт пользователя ВКонтакте, представляющий ваш сайт – вымышленный персонаж, директор, «лицо» сайта.

Создайте приложение типа Standalone, и получите для него бессрочный токен с правами messages. Тут придётся всего один раз выполнить процедуру с копированием токена из адресной строки браузера.

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

Скорее всего, пользователи будут что-то писать в ответ – обрабатывайте их ответы.

Наладьте какой-то механизм на случай если токен вдруг перестанет работать – чтобы вы тут же узнали и выпустили новый.

Как отправить сообщение через API ВК на Node.js Редактировано: 28.08.2020 в 04:45

Если вы уже знакомы с тем, как использовать API ВКонтакте, то скорее всего вы захотели сделать первый шаг в работе с ним. Лично я начал свое погружение в VK API именно с секции сообщений. Сначала это была просто тестовая отправка сообщения.

И так, для того, чтобы отправлять сообщения, в VK API есть метод messages.send

  • peer_id — ID отправителя: беседа, или человек, или сообщество
  • message — Текст сообщения, если не указан параметр attachment или sticker_id
  • attachment — Массив с прикреплениями (точнее, строка, разделяющая прикрепления через запятую)
  • sticker_id — ID стикера
  • random_id — Случайное число, для предотвращения дубликатов сообщений. Для простоты генерации, привязывайте его к текущей дате

Чтобы обращаться к VK API на Node.js, я всегда использую модуль easyvk. Есть и другие варианты, например, vk-io или node-vk-bot-api. Что использовать, решать вам. Но писать статьи я решил с примерами использования easyvk, так как эта библиотека мне знакома больше, чем любая другая, хотябы потому что я ее автор 🙂

На сайте-документации модуля написано подробно о том, как его установить и использовать.

Примеры

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

Отправка сообщения от лица пользователя

  • Токен пользователя
  • Доступ к секции messages

Хотелось бы напомнить, что Messages API официально закрыт для аккаунтов ВКонтакте, но это не значит, что им нельзя пользоваться. В библиотеке easyvk, для получения доступа, авторизация происходит по данным официальных клиентов ВКонтакте (Приложение для Android, например), которые уже имеют доступ к секции Messages API. Вам почти ничего не надо делать для успешной отправки первого сообщения.

Теперь сам пример

const easyvk = require('easyvk') // Подключаем easyvk easyvk(< /** Авторизуемся */ username: 'ВАШ_ЛОГИН', password: 'ВАШ_ПАРОЛЬ' >).then(async (vk) => < /** Отправляем сообщение */ let response = await vk.call('messages.send', < /** Отправляем самому себе */ peer_id: vk.session.user_id, message: "Привет!", /** Получаем случайное число с привязкой к дате*/ random_id: easyvk.randomId() >) console.log(response) // Выводим ID отправленного сообщения >)

Если все получилось, вам придет сообщение с текстом Привет!

Отправка сообщения от лица сообщества

  • Токен сообщества
  • Доступ к секции messages
  • Доступ к диалогку с пользователем, которому хотите отправить сообщение

Как получить токен сообщества самым простым методом, я описал в этой статье

Чтобы получить доступ к диалогу с пользователем, он должен отправить вам любое сообщение

Параметры все те же.

const easyvk = require('easyvk') easyvk(< token: 'ВАШ ТОКЕН СООБЩЕСТВА' >).then(async vk => < let peerId = 1 // ID получателя /** Отправляем сообщение */ let response = await vk.call('messages.send', < peer_id: peerId, message: "Привет!", /** Получаем случайное число с привязкой к дате*/ random_id: easyvk.randomId() >) console.log(response) // Выводим ID отправленного сообщения >)

Если все получилось, сообщество отправило сообщение с текстом Привет!

Отправка сообщения в беседу

https://vk.com/im?sel=c<ID беседы></p>
<p>Для отправки сообщения в беседу в параметре <b>peer_id</b> нужно указать число 2000000000 + ID беседы . ID беседы вы можете получить любым удобным способом: через метод messages.getConversations или по ссылке ВКонтакте <br />» /></p>
<pre><code >const easyvk = require('easyvk') // Подключаем easyvk easyvk(< username: 'ВАШ_ЛОГИН', password: 'ВАШ_ПАРОЛЬ' >).then(async vk => < /** Получаем список бесед */ let conversations = await vk.call('messages.getConversations') conversations = conversations.items.filter(a =>a.conversation && a.conversation.peer.type === ) console.log(response) > >)

Отправка сообщения в беседу от имени сообщества

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

Настройки сообщества

Сервис можно будет найти в меню сообщества

Сервис для приглашений

const easyvk = require('easyvk') // Подключаем easyvk easyvk(< token: 'ТОКЕН СООБЩЕСТВА' >).then(async vk => < let response = await vk.call('messages.send', < /** ID беседы для сообщества. Как его получить, читайте ниже */ peer_id: 2000000009, message: "Всем привет!" >) console.log(response) // Всегда 0 >) 

Как отправлять сообщение от имени сообщества после приглашения в беседу

Это мы уже переходим к разработке мини-чат-бота. Но, конечно, это не он.

Сначала включаем Bots LongPoll (пример будет описан на нем, так как его сможет запустить каждый желающий, позже я буду показывать примеры создания чат-ботов с помощью Callback API тоже)

Для этого заходим в настройки сообщества. И включаем все, что касается LongPoll. А именно:

Настройки сообщества (Работа с API, выставляйте новейшую версию API)

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

Включаем событие входящего сообщения

Теперь подключим Bots LongPoll в easyvk. Не забываем, что приглашение — это обычное входящее сообщение.

const easyvk = require('easyvk') easyvk(< token: 'ТОКЕН СООБЩЕСТВА', reauth: true, v: '5.103' // Обязательно используем новейшую версию ВКонтакте >).then(async vk => < /** Подключаемся к LongPoll */ let connection = await vk.bots.longpoll.connect(); /** Выставляем прослушивание сообщений */ connection.on("message_new", async (msg) => < /** Проверяем, что это приглашение в беседу */ if ( msg.message && msg.message.action && msg.message.action.type === "chat_invite_user" && /** Проверка, что пригласили именно наше сообщество */ msg.message.action.member_id === -vk.session.group_id) < /** Отправляем приветственное сообщение */ let res = await sendHelloMessage(msg.message.peer_id) console.log(res) // Всегда 0 >>) async function sendHelloMessage (peerId) < return vk.call('messages.send', < peer_id: peerId, random_id: easyvk.randomId(), message: "Всем привет!" >) > >)

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

Отправка стикера

ВКонтакте позволяет отправлять стикеры в сообщениях. Честно говоря, мне доводилось только один раз прибегать к отправке стикера. Это было, когда я писал чат-бота для глобальных бесед. Там надо было как-то реализовать пересылку любого стикера, который бы отправил пользователь. По-моему, у меня не получилось. Точнее, это работало только с бесплатными стикерами. Самое время разобраться в этом вопросе поглубже.

Все тот же messages.send

 easyvk(< username: 'ВАШ_ЛОГИН', password: 'ВАШ_ПАРОЛЬ' >).then(async vk => < /** Получаем недавно использованные стикеры */ let response = await vk.call('messages.getRecentStickers') let recentStickers = response.items; /** Отправляем самому себе стикер */ await vk.call('messages.send', < peer_id: vk.session.user_id, sticker_id: recentStickers[0].sticker_id, random_id: easyvk.randomId() >) >) 

Если все получилось, то стикер отправился.

Отправка стикера как граффити

Да-да. И такое бывает. Особенно в последнее время. На сколько мне известно, на данный момент ВКонтакте хранит у себя на серверах 19к стикеров (там почти 20). И все они очень разные, прикольные. Некоторые уже нигде не найти. Но они все равно хранятся. Как в общем-то и любая другая информация в ВК. И это если не считать кастомных стикеров, которые люди загружают как граффити. Разберемся, как они это делают.

Граффити — это обычный документ, загруженный как png изображение. В ВК граффити отображается почти также, как стикер. В некоторых местах, разве что, он бывает в разы больше стикера. А значит и загружать мы его будем как документ.

Для примера возьмем вот такой прикольный стикер https://vk.com/sticker/1-5041-352

Воспользуемся компонентом uploader для загрузки файла.

 easyvk(< username: 'ВАШ_ЛОГИН', password: 'ВАШ_ПАРОЛЬ' >).then(async vk => < let = await vk.uploader.upload(< getUrlMethod: 'docs.getUploadServer', // Метод получения URL getUrlParams: < type: 'graffiti' // Отправляем как граффити >, file: 'https://vk.com/sticker/1-162-256', // Что загружаем isWeb: true, // Просим скачать файл с удаленного сервера saveMethod: 'docs.save' // Сохраняем этим методом >) /** Отправляем самому себе */ await vk.call('messages.send', < peer_id: vk.session.user_id, attachment: `graffiti$_$`, random_id: easyvk.randomId() >) >) 

Вот есть еще такие стикосы

Отправка голосового сообщения

Происходит таким же образом, как и отправка любого документа.

Чтобы отправить голосовое сообщене, вам необходимо его записать в формате Ogg Opus (.ogg). Вы можете записать его в любом другом формате, а затем воспользоваться ffmpeg для форматирования его уже в .ogg, но главное, чтобы в итоге у вас получился файл ogg !

ffmpeg -i audio.wav -acodec libvorbis audio.ogg

Если вам интересна тема работы с аудио и тем, как я сделал наложение эффектов на голосовое сообщение (реверберация, дисторшн и другие), то можете почитать эту статью

А пока что я покажу простейший пример отправки голосового сообщения

const easyvk = require('easyvk') easyvk(< username: 'ВАШ_ЛОГИН', password: 'ВАШ_ПАРОЛЬ' >).then(async vk => < let peerId = vk.session.user_id let fileName = 'file.ogg' /** Получаем URL для загрузки */ let = await vk.call('docs.getMessagesUploadServer', < peer_id: peerId, type: "audio_message" >) /** Загружаем файл */ let file = await vk.uploader.uploadFile(uploadUrl, fileName) let doc = await vk.post('docs.save', file) doc = doc.audio_message; await vk.call('messages.send', < peer_id: peerId, /** Прикрепляем файл как обычный документ */ attachment: `doc$_$_$`, random_id: easyvk.randomId() >) >) 

Кстати говоря, отправка аудио сообщений работает и для сообществ! Просто используйте access_token сообщества для настройки под вас.

Отправляем изображение

  • Изображение с жесткого диска
  • Изображение с удаленного сервера (по URL)

Оба способа поддерживаются в easyvk, поэтому я покажу оба варианта загрузки.

Возьмем какую-нибудь забугорную картинку, почему — не знаю. Просто так. Загрузим ее куда-нибудь в личные сообщения.

Panic Kalm memes

Для загрузки файла с другого сервера в easyvk есть метод vk.uploader.uploadFetchedFile()

Для загрузки файла с жесткого диска в easyvk есть метод vk.uploader.uploadFile()

const easyvk = require('easyvk') easyvk(< username: 'ВАШ_ЛОГИН', password: 'ВАШ_ПАРОЛЬ' >).then(async vk => < let peerId = vk.session.user_id let fileName = 'https://i.imgur.com/PXajpyw.jpg' /** Локальная картинка */ let localFileName = './img.png' /** Получаем URL для загрузки */ let = await vk.call('photos.getMessagesUploadServer', < peer_id: peerId >) /** Загружаем файл (url, file, field - photo, как в документации) */ let file = await vk.uploader.uploadFetchedFile(uploadUrl, fileName, 'photo') let localFile = await vk.uploader.uploadFile(uploadUrl, localFileName, 'photo') /** Сохряняем оба изображения */ let photo = await vk.post('photos.saveMessagesPhoto', file) let localPhoto = await vk.post('photos.saveMessagesPhoto', localFile) photo = photo[0] localPhoto = localPhoto[0] /** Отправляем сообщение */ await vk.call('messages.send', < peer_id: peerId, /** Прикрепляем файл как обычный документ */ attachment: [ `photo$_$_$`, `photo$_$_$` ], random_id: easyvk.randomId() >) >) 

На этом все! Спасибо, что дочитали до конца. Надеюсь, что эта статья вам хоть чем-то помогла и вы научились чему-то новому 🙂

  • Как получить токен сообщества ВКонтакте самым простым методом
  • Отправляем голосовое сообщение ВКонтакте с эффектами

Отправка сообщений через API VK средствами PHP для ленивых

Что мы будем делать: настроим отправку сообщений от имени конкретного пользователя в несколько чатов и другим пользователям используя HTTP запрос средствами PHP, с минимальными усилиями.

Собственно, одними сообщениями мы не ограничимся. Все будет работать через standalone приложение vk по тому принципу, что мы потенциально сможем делать все действия, которые будут доступны этому самому пользователю (точнее все то, на что мы выдадим сами себе права, но об этом чуть позже).

Сообщения рассматриваем именно по той причине, что с ними можно работать только в standalone-приложениях.

План действий:
1. Создаем приложение
2. Получаем access_token
3. отправляем сообщения

1. Создаем приложение

Этот пункт делать под тем аккаунтом, к которому будет привязано приложение (Не обязательно тот же, с которого будут идти сообщения).

image

Имя пишем какое угодно — фигурировать оно нигде не будет.
Тип — Standalone-приложение.

Далее потребуется ввести код с смс-ки которая придет на привязанный к аккаунту номер. После ввода кода ничего не меняем в полях, идем в настройки и копируем ID приложения.

image

Больше тут можно ничего не трогать.

2. Используя ID и secret_key из приложения получаем access_token

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

Для этого создаем на сайте страничку вот с таким кодом:

$client_id — собственно, ID нашего приложения из пункта 1.

$scope — список прав, которые мы можем делать от имени нашего пользователя. Конктерно, для нашей задачи подходит именно такой: возможность доступа в любое время (offline), и доступ к сообщениям (messages). Если надо больше, полный список тут. Можно выставлять либо битовой маской, либо перечислить названия.

Далее, важный момент: Заходим на нашу страничку с кнопкой, будучи залогованы в ВК под тем пользователем, от имени которого будем работать, и жамкаем по кнопочке. Появится подобный запрос:

image

Помимо пункта доступ к общей информации, все остальные пункты будут соответствовать списку разрешений, которые были переданы в scope. Жмем далее и видим следующее:

image

Красным выделен acces_token, ради которого весь второй пункт и писался.

3. HTTP запросами, передавая через POST параметры отправляем сообщения или используем любые другие методы API

Для нетерпеливых, проверить что все работает можно так:

Заменяем нули в конце на наш acces_token и переходим по этой ссылке в браузере.

https://api.vk.com/method/messages.send?user_id=6269901&message=habrahabr&v=5.37&access_token=000000 

Что произойдет:
Сообщение с текстом из параметра message будет отправлено пользователю c указанным user_id. (Если оставить как есть — придет мне. Я не обижусь).

Параметры получателя:
  • user_id — id пользователя-адресата
  • domain — вместо user_id можно указать имя странички адресата (то, что в url-е после vk.com)
  • chat_id — сообщение уйдет в чат. Чтоб взять id чата, заходим в нужный чат, url будет иметь вид vk.com/im?peers=000000&sel=c888. Наш chat_id будет 888 (! не с888)

Полный список методов (при параметре scope=offline,messages) работать можно будет, соответственно только с разделом сообщений.

Ну и напоследок функция для отправки сообщения через POST. Простая, как автомат Калашникова — просто для наглядности:

function send($id , $message) < $url = 'https://api.vk.com/method/messages.send'; $params = array( 'user_id' =>$id, // Кому отправляем 'message' => $message, // Что отправляем 'access_token' => '0000000000000000000000000000', // access_token можно вбить хардкодом, если работа будет идти из под одного юзера 'v' => '5.37', ); // В $result вернется id отправленного сообщения $result = file_get_contents($url, false, stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => http_build_query($params) ) ))); > 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *