SULI COMPANY | Научно-технический сайт Сулико Асабашвили » Программирование » jQuery » Автоматическая отправка уведомлений с использованием JQuery
Информация к новости
  • Просмотров: 718
  • Автор: sulicompany
  • Дата: 16-07-2012, 00:43
 (голосов: 0)
16-07-2012, 00:43

Автоматическая отправка уведомлений с использованием JQuery

Категория: Программирование » jQuery



Возможности скрипта:
1. Отправка, хоть до 100 000 и более пользователей.
2. Есть форма для ввода текста уведомления.
3. Есть возможность в любой момент остановить рассылку уведомлений.
4. Есть возможность указать позицию, с которой нужно начать рассылать (по умолчанию - 0, это первый пользователь в базе).
5. Введется лог рассылки с указанием минут и секунд
6. Очистка лога рассылки
7. Автоматическая рассылка (указали текст, нажали "Отправить" и ушли пить чай. Отправка 40 000 пользователям заняла у меня около 25 минут)
8. Минимальная нагрузка на сервер (в моём случае, нагрузки вообще никакой не оказалось)
9. Подсчет общего количества пользователей в базе

Требования для скрипта:
1. База пользователей должна быть в MySQL.
2. Поддержка CURL на хостинге.
3. Ссылка на библиотеку JQuery (уже добавлена в скрипт)

Поехали:

1. Файл "config.php" - изменять название НЕЛЬЗЯ.

  1.  
  2. <?php
  3. $dbhost = "localhost"// Хостинг
  4. $dbname = "base_TEST"// Название базы данных MySQL
  5. $dbuser = "user_TEST"// Имя пользователя базы данных MySQL
  6. $dbpass = "pass_TEST"// Пароль к базе данных MySQL
  7.  
  8. $dbtable = "table_TEST"// Название таблицы базы пользователей ВКонтакте
  9. $idcolumn = "ID"// Название колонки с пользовательскими ID
  10.  
  11. $api_id="1234567890";  // ID приложения
  12. $api_key="QWERTYUIOPASDFGHJKLZXCVBNM"// Защищенный ключ
  13.  
  14.  
  15. // Набор PHP функций (НЕ ИЗМЕНЯТЬ!)
  16. function db_connect($dbhost, $dbuser, $dbpass, $dbname)
  17. {
  18. mysql_connect($dbhost, $dbuser, $dbpass)
  19. or die('Невозможно подключиться к базе данных: ' . mysql_error());
  20. mysql_select_db($dbname);
  21. }
  22.  
  23. function do_query($query)
  24. {
  25.  global $res;
  26.  $res = mysql_query($query)
  27.     or die("Неверный запрос: " . mysql_error());
  28. }
  29. ?> 
  30.  


Теперь описание файла "config.php":
В данном файле есть всё необходимое, чтобы настроить скрипт уведомления под Ваше приложение и Ваш хостинг.
Во-первых, меняем данные для подключения к базе MySQL (название базы, пользователь, пароль и т.п.).
Во-вторых, самое главное это указать название колонки с ID пользователей (в других уроках это было "uid", у меня просто "ID"), а также название таблицы (у меня это "table_TEST").
В-третьих, указываем app_id и защищенный ключ.

2. Файл "z_sender.php" - изменять название НЕЛЬЗЯ.

  1.  
  2. <?
  3. include_once("config.php");
  4.  
  5. if ($_POST) {
  6. $first = $_POST['fromid'];
  7. $tbname = $_POST['fromtb'];
  8.  
  9. if (trim($first) == '') {$first = "0";}
  10. $userids = "";
  11. $symbol = "";
  12.  
  13. db_connect($dbhost, $dbuser, $dbpass, $dbname);
  14. mysql_query("SET NAMES 'cp1251'");
  15. $result = mysql_query("SELECT * FROM $tbname LIMIT $first, 100");
  16. while ($row =  mysql_fetch_array($result)) {
  17. if ($userids !== "") {$symbol = ",";}
  18. $userids = $userids.$symbol.$row[$idcolumn];
  19. }
  20.  
  21. $mesage= $_POST['yourtext'];
  22.  
  23. $rand = rand();
  24. $timestamp = time()+300;
  25.  
  26. $sig = md5("api_id=".$api_id."message=".$mesage."method=secure.sendNotificationrandom=".$rand."timestamp=".$timestamp."uids=".$userids."v=2.0".$api_key);
  27. $postvars="api_id=".$api_id."&message=".$mesage."&method=secure.sendNotification&random=".$rand."&timestamp=".$timestamp."&uids=".$userids."&v=2.0&sig=".$sig;
  28.  
  29.  
  30. $chp = curl_init('http://api.vkontakte.ru/api.php');
  31. curl_setopt($chp, CURLOPT_HEADER,0);
  32. curl_setopt($chp, CURLOPT_RETURNTRANSFER ,1);
  33. curl_setopt($chp, CURLOPT_POST, 1);
  34. curl_setopt($chp, CURLOPT_POSTFIELDS,  $postvars);
  35. $res = curl_exec($chp);
  36. curl_close($chp);
  37.  
  38. $datetime = date("[H:i:s] ");
  39. $len = strlen($res);
  40. if ($len !== 51) {
  41. $check = strpos($res, 'Invalid');
  42. if ($check == false) {echo "$datetime Отправились уведомления до: $res";} else{echo "$datetime В данной позиции ID не найдены.";}
  43. } else
  44. {echo "$datetime Ни одного уведомления не доставлено.";}
  45. } else echo "ERROR.";
  46. ?>
  47.  


Описание файла "z_sender.php":
Собственно главный обработчик, который принимает с помощью AJAX запроса (методом POST) позицию ID (с которого начинается рассылка), а также текст уведомления. Есть защита от прямого обращения к файлу. Никаких изменений вносить в этот файл не нужно (если только поменять тексты ответов после команды "echo"). Далее происходит рассылка (за раз не больше 100 пользователям, по правилам ВКонтакте). Успешный\не успешный ответ передаёт обратно следующему файлу.

3. Файлу "sendnotify.php" - Вы можете изменить название файла на любое другое. Рекомендуется это сделать сразу, чтобы никто кроме Вас не смог разослать уведомления Вашим пользователям.

  1.  
  2. <?php
  3. include_once("config.php");
  4. db_connect($dbhost, $dbuser, $dbpass, $dbname);
  5. mysql_query("SET NAMES 'cp1251'");
  6. $result = mysql_query("SELECT * FROM $dbtable");
  7. $all = (mysql_num_rows($result)) - 100;
  8. ?>
  9.  
  10. <html>
  11. <head>
  12. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  13. <title>Отправка уведомлений</title>
  14. <script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
  15. </head>
  16. <body>
  17.  
  18. <script type="text/javascript">
  19. function ClearLog() {
  20. document.getElementById('z_status').innerHTML = "<br /><br /><B>Лог процесса рассылки очищен!</B>";
  21. }
  22.  
  23. function SendMsg() {
  24. var sOldText = document.getElementById('z_status').innerHTML;
  25. var sSendText = document.getElementById('z_sendtext').value;
  26. var sPosition = document.getElementById('z_position').value;
  27. var sFinish = parseInt("<? echo $all;?>");
  28. var sCurrent = parseInt(sPosition);
  29.  
  30. if (sSendText == '') {
  31.  
  32. document.getElementById('z_status').innerHTML = sOldText+ "<br /><br /><B>Пожалуйста, введите текст уведомления!</B>";
  33. } else {
  34.  
  35. if(document.getElementById('s_box').checked) {
  36.  
  37.  
  38. if (sFinish < sCurrent) {
  39. document.getElementById('z_status').innerHTML = sOldText+ "<br /><br /><B>Отправка уведомлений завершена, либо превышен диапазон ID.</B>"+'<span id="s_finish"></span>';
  40. document.getElementById('s_finish').scrollIntoView();
  41.  
  42. } else {
  43. document.getElementById('z_status').innerHTML = sOldText+ "<br /><br />Отправка уведомлений от позиции <b>" + sPosition + "</b> из <b><? echo $all;?></b> ...";
  44. $.post("/z_sender.php",{fromid: sPosition, fromtb: '<? echo $dbtable;?>', yourtext: sSendText},onAjaxSuccess);}
  45.  
  46. } else {
  47. document.getElementById('z_status').innerHTML = sOldText+ "<br /><br /><B>Отправка уведомлений приостановлена, либо не включена!</B>"+'<span id="s_finish"></span>';
  48. document.getElementById('s_finish').scrollIntoView();
  49. }
  50. }
  51. }
  52.  
  53. function onAjaxSuccess(data)
  54. {
  55. var sOldText = document.getElementById('z_status').innerHTML;
  56. var sPosition = parseInt(document.getElementById('z_position').value) + 100;
  57. document.getElementById('z_position').value = sPosition;
  58. document.getElementById('z_status').innerHTML = sOldText + "<br />" + data +'<span id="yak' + sPosition + '"></span>';
  59. document.getElementById('yak'+sPosition).scrollIntoView();
  60.  
  61. SendMsg();
  62. }
  63.  
  64.  
  65. </script>
  66.  
  67. <h1>Отправка уведомлений</h1>
  68. Начать отправку с позиции (от 0 до <?=$all?>):<br />
  69. <input type="text" id="z_position" style="width:100px;" value="0">
  70. <input type="checkbox" id="s_box" checked> Включить\выключить отправку
  71. <br />
  72. Текст уведомления (максимум 1024 символа):<br />
  73. <textarea id="z_sendtext" cols="50" rows="5"></textarea><br /><br />
  74. <input type="button" value="Отправить" onclick="SendMsg()"> <inputtype="button" value="Очистить" onclick="ClearLog()"><br />
  75. <div style="margin-top: 6px; border: 0px solid #E0E0E0; width: 800px; height: 250px; overflow: auto;">
  76. <span id="z_status"></span>
  77. </div>
  78. </body>
  79. </html>
  80.  


Описание файла "sendnotify.php":
Это Файл-форма для ввода текста уведомления. Вводим свой текст, ставим галочку "Включить\выключить отправку" (по умолчанию, поставлена). Выбираем позицию (по умолчанию, 0, значит рассылка будет начинаться от 1 пользователя в базе). Ниже наблюдаем лог рассылки.
В любой момент Вы можете убрать галочку "Включить\выключить отправку" и процесс рассылки остановится, а позиция сохранится.

Вот и всё! А вот результат:
Изображение

Пару слов от себя:
Скрипт сделан на совесть. Не так, чтобы полностью идеален. Переписывая уроки, возможно в коде остались лишние (не нужные строчки). Также добавил пару защит на пустой текст уведомления, и не существование позиций ID в базе.

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

2. В процессе рассылки, время от времени, делайте очистку лога
Если у Вас большое количество пользователей, то размер лога может увеличиваться до 1 и более МБ. Как результат - увеличение нагрузки на сервер.