Доставка сообщений в ВК удобна большинству сайтов разной направленности: емайлы многие не читают, в таких мессенджерах как Вотсап и Вайбер все сложно. А рассылка новостей и личных уведомлений с сайта в ВК – самое то – легко, просто и сразу видно пользователю.
Для своего сервиса Глиса мне необходимо быстро и бесплатно доставлять уведомления о новых объявлениях пользователям. Базовый канал – емайл – не удобен. Другой хороший канал – мессенджер Телеграмм – решил побороться за приватность и стал не надежен. Поэтому пришлось добавить альтернативу в виде ВК (тем более что сервис умеет еще отслеживать группы в ВК на появление новых записей и комментариев). Был приятно удивлен простотой и продуманностью настройки, даже Телеграмм рядом не стоял.
1. Подключаем виджет «Разрешить писать сообществу»
Виджет выглядит в виде кнопки. Я встроил кнопку в настройки аккаунта пользователя Глисы.
![image](https://habrastorage.org/webt/pw/zc/mk/pwzcmkuhbnvbsnqyvo_dnewyfzc.jpeg)
В тексте нужно заменить 74449217 на id своей группы. Также продумать куда будет сохраняться полученный userId ВКонтакте. В приведенном ниже коде он присваивается полю vk_id, а потом сохраняется вместе с другими настройками.
Документация по виджету.
Разрешение от пользователя у нас получено, теперь организуем отправку сообщений.
2. Отправка сообщений
В настройках своего сообщества включаем сообщения сообщества.
![image](https://habrastorage.org/webt/ax/cx/jy/axcxjyyux6zwdumh5aosgbrfzs0.jpeg)
Генерируем токен своего сообщества.
![image](https://habrastorage.org/webt/b7/72/kx/b772kxr0xmvyfwlzcxw0ulu116i.jpeg)
В общем все готово. Для отправки сообщения используем PHP+CUrl. В функцию отправки в качестве входных параметров передаем ранее полученный id пользователя ВК и текст сообщения. Также функция использует константы vk_token – токен сообщества.
Вместе с изучением возможностей и материала я потратил на организацию отправки оповещений в ВК один день — считаю, что это один из самых простых вариантов коммуникации с пользователем.
Для своего сервиса Глиса мне необходимо быстро и бесплатно доставлять уведомления о новых объявлениях пользователям. Базовый канал – емайл – не удобен. Другой хороший канал – мессенджер Телеграмм – решил побороться за приватность и стал не надежен. Поэтому пришлось добавить альтернативу в виде ВК (тем более что сервис умеет еще отслеживать группы в ВК на появление новых записей и комментариев). Был приятно удивлен простотой и продуманностью настройки, даже Телеграмм рядом не стоял.
1. Подключаем виджет «Разрешить писать сообществу»
Виджет выглядит в виде кнопки. Я встроил кнопку в настройки аккаунта пользователя Глисы.
![image](https://habrastorage.org/webt/pw/zc/mk/pwzcmkuhbnvbsnqyvo_dnewyfzc.jpeg)
В тексте нужно заменить 74449217 на id своей группы. Также продумать куда будет сохраняться полученный userId ВКонтакте. В приведенном ниже коде он присваивается полю vk_id, а потом сохраняется вместе с другими настройками.
<script type='text/javascript' src='https://vk.com/js/api/openapi.js?154'></script>
<div id='vk_send_message'></div>
<script type='text/javascript'>
VK.Widgets.AllowMessagesFromCommunity('vk_send_message', {height: 30},74449217);
VK.Observer.subscribe('widgets.allowMessagesFromCommunity.allowed', function f(userId) {
console.log(userId);
console.log('allowed');
document.getElementById('vk_id').value=userId;
});
VK.Observer.subscribe('widgets.allowMessagesFromCommunity.denied', function f(userId) {
console.log(userId);
console.log('denied');
document.getElementById('vk_id').value='';
});
</script>
Документация по виджету.
Разрешение от пользователя у нас получено, теперь организуем отправку сообщений.
2. Отправка сообщений
В настройках своего сообщества включаем сообщения сообщества.
![image](https://habrastorage.org/webt/ax/cx/jy/axcxjyyux6zwdumh5aosgbrfzs0.jpeg)
Генерируем токен своего сообщества.
![image](https://habrastorage.org/webt/b7/72/kx/b772kxr0xmvyfwlzcxw0ulu116i.jpeg)
В общем все готово. Для отправки сообщения используем PHP+CUrl. В функцию отправки в качестве входных параметров передаем ранее полученный id пользователя ВК и текст сообщения. Также функция использует константы vk_token – токен сообщества.
//отправка сообщения в vk
function send_vk($vk_id, $text_source)
{
$text=rawurlencode($text_source);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
$url="https://api.vk.com/method/messages.send?user_id=$vk_id&v=5.76&access_token=".vk_token;
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POSTFIELDS, "&message=".$text);
$hh=curl_exec($ch);
//если отправка не удалась
if (!strpos(" ".$hh,'{"response":'))
{
//если нет сообщения об ошибке, отправляем повторно
if (!strpos(" ".$hh,'error')) {$hh=curl_exec($ch);}
}
$html=$hh;
curl_close($ch);
return $html;
}
Вместе с изучением возможностей и материала я потратил на организацию отправки оповещений в ВК один день — считаю, что это один из самых простых вариантов коммуникации с пользователем.
Комментарии (8)
greatkir
03.07.2018 09:29За статью спасибо. Но почему-то в последнее время на хабре появляются статьи с PHP-кодом, не оформленные хотя бы по PSR-2. Вы же обычный текст разбиваете на абзацы, делаете отступы, верно? Хотелось бы видеть такое же уважение и к форматированию самого кода, если он публикуется в статье.
Про декларацию типов товарищ AotD уже написал — почему бы не сделать всё более формально для статьи?
AvioD
Простите, но это же просто сумбурный пересказ пары страниц документации вконтакте
Возможно, стоило разбавить пост чем-то еще?
GLISA Автор
ну не знаю. почему сумбурный? вроде все кратко и по пунктам. можно взять и быстро сделать для себя, не рыская где-то еще. разбавлять чем-то — ну если что-то непонятно или не хватает — с удовольствием, а просто так — не вижу смысла
AotD
Сумбурный потому что хотя бы по коду:
Не инициализированная переменная $url непонятно откуда взявшаяся
Зачем? Вы думаете что vk.com забудут продлить ssl сертификаты?
Какой смысл передавать $vk_id как параметр функции, но vk_token как константу определенную неизвестно где?
Если это может быть json, то чем не понравилось json_decode?
Про описание типов входных/выходных параметров я промолчу.
GLISA Автор
все работает исправно, несмотря на идеальный код. этот код абсолютно рабочий.
косячок — но работе не мешает. php прощает такие вещи.
хостинг без https — поэтому. если не прав — поправьте. но все отлично работает.
меня устраивает. так меньше кода. плюс думаю по скорости работы должно быть быстрее. хотя это в данном случае не существенно.
смысл в том, что поскольку сообщения идут от имени моего сообщества, то vk_token не меняется и он определен в константах. $vk_id — это id пользователя vk, он постоянно меняется.
AotD
Тут ключевая фраза «все отлично работает». Её нужно перефразировать в «на моём окружении и в данный момент этот код, кажется, делает то что мне нужно».
GLISA Автор
в обычном денвере все работает, на обычном хостинге тоже. честно — не представляю где может не работать. сделал для своего проекта — решил поделиться. т.к. не нашел короткой и простой инструкции в интернете.