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

Для своего сервиса Глиса мне необходимо быстро и бесплатно доставлять уведомления о новых объявлениях пользователям. Базовый канал – емайл – не удобен. Другой хороший канал – мессенджер Телеграмм – решил побороться за приватность и стал не надежен. Поэтому пришлось добавить альтернативу в виде ВК (тем более что сервис умеет еще отслеживать группы в ВК на появление новых записей и комментариев). Был приятно удивлен простотой и продуманностью настройки, даже Телеграмм рядом не стоял.

1. Подключаем виджет «Разрешить писать сообществу»

Виджет выглядит в виде кнопки. Я встроил кнопку в настройки аккаунта пользователя Глисы.

image

В тексте нужно заменить 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

Генерируем токен своего сообщества.

image

В общем все готово. Для отправки сообщения используем 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)


  1. AvioD
    03.07.2018 01:03
    +1

    Простите, но это же просто сумбурный пересказ пары страниц документации вконтакте
    Возможно, стоило разбавить пост чем-то еще?


    1. GLISA Автор
      03.07.2018 01:17

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


      1. AotD
        03.07.2018 06:41
        +4

        Сумбурный потому что хотя бы по коду:

        $ch = curl_init($url);

        Не инициализированная переменная $url непонятно откуда взявшаяся
        
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        

        Зачем? Вы думаете что vk.com забудут продлить ssl сертификаты?
        $url = "https://api.vk.com/method/messages.send?user_id=$vk_id&v=5.76&access_token=" . vk_token;
        

        Какой смысл передавать $vk_id как параметр функции, но vk_token как константу определенную неизвестно где?
        if (!strpos(" ".$hh,'{"response":')) 

        Если это может быть json, то чем не понравилось json_decode?

        Про описание типов входных/выходных параметров я промолчу.


        1. GLISA Автор
          03.07.2018 09:05

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

          $ch = curl_init($url);

          Не инициализированная переменная $url непонятно откуда взявшаяся

          косячок — но работе не мешает. php прощает такие вещи.

          curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
          curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

          Зачем? Вы думаете что vk.com забудут продлить ssl сертификаты?


          хостинг без https — поэтому. если не прав — поправьте. но все отлично работает.

          if (!strpos(" ".$hh,'{«response»:'))

          Если это может быть json, то чем не понравилось json_decode?


          меня устраивает. так меньше кода. плюс думаю по скорости работы должно быть быстрее. хотя это в данном случае не существенно.

          $url = «api.vk.com/method/messages.send?user_id=$vk_id&v=5.76&access_token=». vk_token;

          Какой смысл передавать $vk_id как параметр функции, но vk_token как константу определенную неизвестно где?


          смысл в том, что поскольку сообщения идут от имени моего сообщества, то vk_token не меняется и он определен в константах. $vk_id — это id пользователя vk, он постоянно меняется.


          1. AotD
            03.07.2018 09:21

            Тут ключевая фраза «все отлично работает». Её нужно перефразировать в «на моём окружении и в данный момент этот код, кажется, делает то что мне нужно».


            1. GLISA Автор
              03.07.2018 11:09

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


  1. greatkir
    03.07.2018 09:29

    За статью спасибо. Но почему-то в последнее время на хабре появляются статьи с PHP-кодом, не оформленные хотя бы по PSR-2. Вы же обычный текст разбиваете на абзацы, делаете отступы, верно? Хотелось бы видеть такое же уважение и к форматированию самого кода, если он публикуется в статье.
    Про декларацию типов товарищ AotD уже написал — почему бы не сделать всё более формально для статьи?


  1. divanus
    03.07.2018 10:28

    Кто-то пользуется вконтакте?!!!