Отправить сообщение пользователю через VK API из приложения с типом «Веб-сайт»
Есть сайт с уже работающей авторизацией.
Для сайта в VK создали приложение с типом веб-сайт.
Есть необходимость добавить возможность сайту от имени приложения отправлять сообщение пользователям через VK API .
Возможно ли подобное? Насколько я понял, для приложений типа «сайт» доступны не все методы.
Если возможно, то какой метод будет правильнее использовать?
Отслеживать
5,542 3 3 золотых знака 21 21 серебряный знак 41 41 бронзовый знак
задан 27 апр 2016 в 7:47
43 1 1 серебряный знак 4 4 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
На сегодня есть следующие варианты отправки сообщения пользователю ВК:
- от другого пользователя ВК messages.send() ;
- от сообщества в ответ на запрос пользователя – Сообщения для бизнеса;
- уведомления от приложения secure.sendNotification() ;
- платная отправка SMS secure.sendSMSNotification() .
Варианты 1–3 не доступны приложению типа «Сайт». Но можно поступить так:
Заведите аккаунт пользователя ВКонтакте, представляющий ваш сайт – вымышленный персонаж, директор, «лицо» сайта.
Создайте приложение типа Standalone, и получите для него бессрочный токен с правами messages. Тут придётся всего один раз выполнить процедуру с копированием токена из адресной строки браузера.
Зато теперь у вас есть токен, с которым вы сможете из скриптов сайта писать личные сообщения пользователям. Приходить они будут от имени того аккаунта.
Скорее всего, пользователи будут что-то писать в ответ – обрабатывайте их ответы.
Наладьте какой-то механизм на случай если токен вдруг перестанет работать – чтобы вы тут же узнали и выпустили новый.
Как отправить сообщение VK, с помощью Python 3?
Добрый день. До этого писал бота используя vk_api и отправлял сообщения в ответ на присланные. Все работает отлично и без проблем. Но тут встала задача отправки сообщения пользователю просто из списка. Начал искать в интернете и натолкнулся на такую возможность, но через приложение. Во всех примерах (датируемых 2017) используется методы — vk.Session и vk.API, которых на данный момент в библиотеке vk нет. Других примеров найти не смог. Вопрос — как все же отправить сообщение пользователю, зная его ID? Спасибо.
- Вопрос задан более трёх лет назад
- 13205 просмотров
Комментировать
Решения вопроса 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 официального приложения)
Как отправить сообщение в ВКонтакте
В данном уроке мы расскажем, как с помощью бота отправить вам или вашему менеджеру в ВКонтакте уведомление о новом принятом заказе. Бот может сам уточнить у клиента все необходимые детали, касающиеся заказа, собрать контактные данные, а затем отправить всю полученную информацию одним сообщением менеджеру в ВКонтакте.
При желании, в дальнейшем вы можете настроить данный сценарий так, что бот будет опубликован во всех ваших каналах, например в Telegram, на вашем сайте или в приложении. При этом сообщения о всех принятых заказах бот будет высылать менеджеру в личные сообщения в ВКонтакте.
Также вы можете настроить отправку сообщения:
Обратите внимание: бот может отправить сообщение только тем пользователям, которые ранее писали боту
Создайте сценарий
Для начала создадим сценарий, который будет собирать данные у клиента. Начнем с определения канала. Это может быть полезно, если ваш сценарий будет опубликован на нескольких каналах. Добавьте блок Условия и пропишите в нем: $channelType == «vk»

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

Оставим это сообщение на случай, если вы забудете, где нужно тестировать бота.
Подключите канал ВКонтакте

Подключите канал. Для подключения воспользуйтесь этой инструкцией. Токен, который вы получите после подключения, понадобится вам позже.
Мы будем получать имя клиента из его профиля ВКонтакте, а также ID страницы для формирования ссылки на страницу клиента. Поэтому сценарий нужно тестировать непосредственно ВКонтакте, а не в тестовом виджете. То есть, чтобы проверить работу бота, напишите сообщения вашему сообществу ВКонтакте.
После любых изменений в сценарии, не забывайте нажимать «Опубликовать» и дождаться публикации в канал.

Добавьте экран приветствия
Добавьте экран приветствия. Свяжите вариант условий $channelType == «vk» с блоком Текст, в котором напишите:
Здравствуйте, $rawRequest.user_info.first_name! Я помогу вам оставить заявку на оказание наших услуг. С ценами и акциями вы можете ознакомиться по данной ссылке: (ссылка)

С помощью переменной $rawRequest получаем имя клиента из его профиля ВКонтакте.
Добавьте на экран приветствия блок Переход:

Уточним вид услуги.
Для этого свяжем блок Переход с блоком text to $var: Какой вид услуги вам требуется? Пожалуйста, опишите одним сообщением.
Имя переменной: $service

Блок text to $var может принимать абсолютно любой текст, так что прописывать множество разных интентов для принятия вида услуги не нужно.
Запросите комментарий
Чтобы получить дополнительную информацию от пользователя, свяжите блок Переход после ввода $service с еще одним блоком text to $var с содержанием:
Если у вас есть какие-либо дополнительные комментарии или пожелания, пожалуйста, оставьте их сейчас одним сообщением.
Имя переменной: $comment

Запросите телефонный номер
Для запроса номера телефона свяжите блок Переход после ввода $comment с блоком Текст: Укажите, пожалуйста, ваш телефон для связи.

Добавьте блок Интенты на экран с текстом Укажите, пожалуйста, ваш телефон для связи . Выберите готовый интент Телефон.

Свяжите вариант Любая другая фраза с блоком Текст: Пожалуйста, напишите российский мобильный телефон в формате +79111112233.

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

Свяжите блок Переход с экраном Укажите, пожалуйста, ваш телефон для связи. .

Оформим сообщение. Для этого от интента Телефон сделайте связь с блоком Условие.
На этом этапе будьте очень внимательны. Если вы пропустите один пробел или используете хотя бы один неправильный символ, условие не будет работать корректно.
В блок Условие нужно скопировать и вставить следующее:
$text = "Получен новый заказ!" + "\n" + "Ссылка на профиль клиента: " + "https://vk.com/id" + $rawRequest.user_info.id + "\n" + "Телефон: " + $PHONE + "\n" + "Вид услуги: " + $service + "\n" + "Комментарий: " + $comment, $num = _.random(1, 9223372036854775808)

Что это означает?
- Мы создали переменную $text , в которую поместили перечисленные элементы.
- Мы используем сложение строк (строка – это название типа данных в языке программирования Javascript). То есть по сути мы складываем значения переменных, которые получили в ходе сценария, с текстом, который будет пояснять их значение.
- Также мы используем переменную $rawRequest.user_info.id , которая будет содержать значение id страницы пользователя.
- И добавляем переносы строк с помощью знака \n .
- После присвоения значения переменной $text , мы ставим запятую, пробел и создаем переменную $num .
- Этой переменной мы присваиваем случайное значение от 1 до 9223372036854775808 с помощью метода _.random . Этот параметр нужен для идентификации сообщения при отправке в ВКонтакте.
- Если вы используете в сценарии другие переменные, то измените, соответственно, и текст условия в соответствии с вашим сценарием.
Напоминаем, что бот может отправлять сообщения только тем пользователям, с которыми он уже общался. Поэтому, чтобы менеджер, который обрабатывает заявки пользователей, мог получать сообщения, он должен для начала написать любое сообщение самому сообществу.

Оформите HTTP-запрос
От блока Условие создайте связь с блоком HTTP-запрос.

- метод POST
- в BODY скопируйте и вставьте:

Вкладки RESPONSE и HEADERS заполнять не нужно. Составим URL запроса. Он может выглядеть примерно так:
https://api.vk.com/method/messages.send?user_ids=123456789&random_id=$&message=$&access_token=dfgyui4567cvfghj34567fghjk567gfh546yuersbdwy5muej654hg&v=5.101
Разберем его по частям.
- messages.send — это метод API ВКонтакте, который отправляет сообщение
- user_ids= – это значение ID страницы ВКонтакте
- ID пользователя указано в адресной строке страницы ВКонтакте
- Как получить ID, если ID пользователя изменено на буквенно-цифровое, описано здесь

Актуальную версию протокола API ВКонтакте можно проверить по ссылке
После оформления HTTP-запроса сохраните блок. Затем соедините вариант «Завершен успешно» с сообщением Спасибо, ваша заявка отправлена! В ближайшее время с вами свяжется менеджер.

В дальнейшем вы можете добавить на этот экран интенты для обработки сообщений, которые клиент может написать на этом этапе.
Вариант «Завершен с ошибкой» соедините с сообщением Что-то пошло не так. Ошибка $httpStatus. Не страшно! Менеджер читает диалоги с ботом, так что мы свяжемся с вами.

На этот экран вы также можете добавить интенты для обработки сообщений, которые клиент может написать на этом этапе.
Вот и все, готово!
Теперь клиент может пообщаться с ботом и оставить свои контакты. А менеджер получит сообщение с данными клиента.
Не забудьте протестировать сценарий, отправив сообщение в сообщество ВКонтакте.
Как читать свои сообщения ВКонтакте через API
Я любитель использовать API для «общения» с повседневными сервисами. Например, моя статья о API Яндекс.Метрики как раз об этом: как без интерфейса получать нужные данные. Не так давно меня посетила мысль использовать API ВКонтакте, вместо привычного интерфейса. Зачем это может быть нужно? Например, чтобы прочитать свои сообщения, при этом не заходя на страницы vk.com, а значит не появляясь онлайн. У меня вот есть социофобская черта — я не люблю появляться Вконтакте онлайн, но иногда туда приходят сообщения, и было бы неплохо иметь возможность эти сообщения читать, при этом онлайн не появляясь.
Получить доступ к API для доступа к пользовательским данным можно в 3 шага:
- Создание приложение
- Получения токена для доступа к данным от имени пользователя
- Запрос для получения входящих сообщений
Первый и второй шаг нужно сделать 1 раз, а третий шаг придется выполнять каждый раз, когда захочется прочитать свои сообщения ВКонтакте.
Итак, первый шаг: создание своего приложения для API Вконтакте.
1 . Заходим на страницу http://vk.com/dev
2 . Выбираем «Создать приложение»3 . Задаем название и выбираем тип «Standalone-приложение», после чего нажимаем «Подключить приложение»
4 . Потом нужно подтвердить приложение с помощью СМС-кода, отправленного на телефонный номер
5 . Приложение создано и нас встречает страница с информацией о нашем приложении6 . Переходим на страницу «Настройки» и в поле «Состояние» выбираем «Приложение включено и видно всем»
7 . Нажимаем «Сохранить изменения»
8 . Также на этой странице нам пригодятся ID приложения (в красной рамке на изображении ниже) и защищенный ключ (и в синей рамке на изображении ниже)Второй шаг: получение токена для доступа к данным
Этот шаг надо делать будучи залогиненным Вконтакте под тем пользователем, к данным которого нужно получить доступ.
1 . Делаем в браузере запрос https://oauth.vk.com/authorize?client_id=5086933&display=page&redirect_uri=https://oauth.vk.com/blank.html&display=page&scope=messages,offline&response_type=code&v=5.37, где client_id — это ID нашего приложения со страницы настроек. В параметре «scope» перечисляются права доступа нашего приложения. В нашем случае, «messages» означает, что приложение будет иметь доступ к чтению сообщений пользователя. Разрешение «offline» дает нашему приложению доступ к данным пользователя в любое время, при этом доступ будет бессрочный. Помимо «messages» можно задать другие разрешения, которые надо также перечислять через запятую. Например, разрешение «friends» дает доступ к друзьям, тогда scope=messages,friends,offline. Про все возможные разрешения написано тут.
2 . Мы окажемся на странице, где должны разрешить созданному приложению доступ к аккаунту:
3 . Нажимаем «Разрешить»
4 . После этого нас перебросить на страницу вида https://oauth.vk.com/blank.html#code=ce72f6a9157bef81f6, где параметр code содержит верификационный код, действительный 1 час с момента его получения. Копируем этот код
5 . Делаем в браузере запрос https://oauth.vk.com/access_token?client_id=5086933&client_secret=kQwYLYh12Ar21eJzH3R7&redirect_uri=https://oauth.vk.com/blank.html&code=ce72f6a9157bef81f6, где client_id — ID приложения со страницы настроек, client_sercet — защищенный ключ (также со страницы настроек приложения), а code — верификационный код, который мы получили в предыдущем пункте6 . На открывшейся странице будет в формате JSON представлен токен для доступа в значении ключа access_token:
P.S.: Чтобы JSON смотрелся в браузере также хорошо («pretty») как у меня на скриншоте надо установить какое-нибудь разрешение для браузера, позволяющее
Помимо кода доступа JSON содержит ключ expires_in, содержащий срок действия токена (у нас там 0, т. к. токен бессрочный) и user_id пользователя, доступ к данным которого возможен с помощью полученного токена. Копируем токен, он нам теперь будет нужен каждый раз, когда мы будем делать запрос к API.Третий и последний шаг: получение списка входящих сообщений
Перечень всех методов для работы с API Вконтакте доступен по ссылке, но нам пока пригодится только метод messages.get, с помощью которого можно получить список входящих или исходящих сообщений. Вполне возможно, что захочется еще и отправлять сообщения, тут нужен метод messages.send.Использовать метод messages.get предельно просто:
Просто делаем запрос вида https://api.vk.com/method/messages.get?access_token=f73dc057f8d81d96, где access_token — токен для доступа, который мы получили на втором шаге. Получаем приблизительно такую картину:Каждый объект в массиве response — это отдельное сообщение, body — это текст сообщения, uid — идентификатор пользователя, отправившего сообщение, read_state — прочитано ли сообщение (1) или не прочитано (0), out — входящее сообщение (0) или исходящее (1), date — дата сообщения в формате posix, mid — идентификатор сообщения.
Вот такой нетривиальный способ читать свои сообщения Вконтакте.
Вступайте в группу на Facebook и подписывайтесь на мой канал в Telegram, там публикуются интересные статьи про анализ данных и не только.