Идея для рассылки уведомлений в приложениях VK методом secure.sendNotification

в 7:46, , рубрики: JS, json, Песочница, метки: ,

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

Недавно сделал свое первое приложение для VK; исключительно для тренировки своих навыков в JavaScript, который изучаю всего несколько месяцев, да и не очень усердно. Разумеется, после нескольких недель захотелось оповестить своих 500 пользователей.

image
Конечный вариант работы с оформлением. В статье приводятся лишь малые части кода для наглядности… Пока еще не выложил на GitHub.

1. Сначала немного о самом методе:

Открываем документацию VK API, находим secure.sendNotification и видим ряд ограничений:

  • метод доступен только с серверной стороны(вызывается с сервера по определенной схеме)
  • за один раз можно отправить до 100 уведомлений
  • текст сообщения передаем в UTF-8, иначе не видать успеха :)
  • каждому пользователю можно отправлять одно уведомление в час, что затрудняет тестирование. Кстати, неважно дошло уведомление или нет, а отсчет начинается снова.

Не следует увлекаться со скоростью рассылки, так как возникает ошибка «Too many requests per second». Вроде бы не больше 10 запросов в секунду к VK API. Касается всех методов, конечно.

Часто возникает вопрос: где брать пользователей, установивших приложение. Такого метода не существует — придется «строить» свою базу данных пользователей приложения.

2. Подготовим всё необходимое:

  • Сначала я сохранил пользователей из БД как упорядоченный список значений в файл с расширением .json На мой взгляд, использование формата json удобно тем, что информация в данном формате представлена js-массивами и объектами, к которым легко можно получить доступ с клиентской части. Для многомиллионных приложений, конечно, лучше реляционная БД, с ростом информации файловая система для хранения теряет свой смысл, и тут уже тяжело превзойти сервер баз данных. Мой пример основывается именно на клиентской части для средних приложений, хотя переделать под любую БД труда уже не составит.

Для наглядности запишем часть id пользователей в переменную(естественно, считывание информации с файлов лучше организовать более оптимальными методами):

var uids =[103159854,104090146,104690277,108144066,109310141,109715505,110030591,110395187,121473119,125470566,125872556,127818715,133862608,133935838,134311669,134806068,134939955,13504842,135367864,137027949,137261451,137677177,138285240,140106401,142391040,144399513,144645435,146632210]
  • Теперь серверная часть, к которой обращаюсь на AJAX. Тут уж у каждого свои соображение на этот счет. Все-таки элементарный пример рассмотрим, используя классы для VK API на PHP(на GitHub):

$id_user= (int) $_REQUEST['id']; 

	require 'vkapi.class.php';

    $api_id = 1234567; // id приложения 
    $secret_key = 'XMZЕL15fAyАYZiВUNx42'; // защищенный ключ

    $VK = new vkapi($api_id, $secret_key);

    $resp = $VK->api('secure.sendNotification', array('uids'=>$id_user,'message'=>$_REQUEST['msg'])); // в примере передаем по одному id, однако лучше по 100 - это должны быть перечисленные через запятую идентификаторы пользователей, которым отправляется уведомление 

3. База готова, на сервере порядок: пора рассылать уведомления:

Прежде чем начнем рассылку нужно объявить функцию отправки уведомлений(для быстроты используем JQuery, но нативный код лучше, например, перебрать элементы массива можно гораздо быстрее циклом, чем юзать .each() в JQuery):

var done = {
	 sendNotification: function(user, message) {
	  $.post("api.php?id=" + user + '&msg=' + message + '&key_new=' + appVK.key, function(response) { // передаем параметры на сервер. Рекомендую на сервере проверять, не пустая ли строка с сообщением или id и т.д. appVK.key - в моем приложение это ключ для защиты в AJAX
		  if(response) {  alert('Отправлено')  // secure.sendNotification  возвращает перечисленные через запятую ID пользователей, которым было успешно отправлено уведомление. Целесообразно на сервере определить функцию, которая бы возвращала значения true или false для регистрации не успешно отправленных уведомлений.
		  }else {  alert('Ошибка!');  }
	  });
     }
};

Замечание: если будете использовать объекты как ассоциативные массивы — нужно применить JSON.stringify() для отправки данных на сервер, чтоб там успешно преобразовать их.

Что ж, теперь заключительный этап:

// наши пользователи 
var uids =[103159854,104090146,104690277,108144066,109310141,109715505,110030591,110395187,121473119,125470566,125872556,127818715,133862608,133935838,134311669,134806068,134939955,13504842,135367864,137027949,137261451,137677177,138285240,140106401,142391040,144399513,144645435,146632210]
var done = {
//предыдущая функция для отправки уведомлений
	 sendNotification: function(user, message) {
	  $.post("api.php?id=" + user + '&msg=' + message + '&key_new=' + appVK.key, function(response) {
		  if(response) {  alert('Отправлено')   }else {  alert('Ошибка!');  }
	  });
     },
  sendToAll: function() {
	var msg = $('#id_notify_all').val(); // сохраняем сообщение в переменную
	var counter = uids.length; // количество пользователей в массиве
	var result = 400 / counter; // используется для строки состояния 
   		var g = 0;
		var i = 0;
		var percent = 0;
		var j = 100 / counter;
		var send = function() {
			i += 1; // id пользователя в данном случае начнем в первого, можно сделать смещения
			 percent += j;
		         this.sendNotification(uids[i - 1],  msg);
	// здесь много кода для строки состояния 
				 
			if( i === counter ) { // сравниваем количество отправленных уведомлений с заявленным количеством.
			   clearInterval(executing); // если равенство выполнилось прекращаем отправку.
			   alert('Отправка успешно завершена!');}
		 };
		 var executing = setInterval(send, 500); // отправляем каждые полсекунды. Можно установить другой интервал, но помним не больше 10 запросов в секунду
}

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

Спасибо за внимание!

Автор: zhak55

Источник

  1. Простите нуба:

    Простите нуба, как можно получить список uids (через апи) если база накрылась, а там 3600 пользователей, гугл как то не помог.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js