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

Готовые уроки IFrame + ВКонтакте API

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

Сообщение Альберт_Уфа » 19 июн 2011, 18:55

Всем добрый вечер.

Итак, благодаря azzzi и его уроку http://flapps.ru/forum/topic1317.html, а также Александру с http://flapps.ru/forum/topic2052-20.html был переписан последний урок с использованием первого, на основе JQuery.

Причина:
Первый урок от azzzi простой и полностью подходит, однако его исходник не позволяет зациклить по 100, также нет формы для ввода текста уведомления, а значит всё это придется дополнять.
Второй урок от Александра я так и не смог оценить. Дело в том, что в отличие от желаемого отображения пошаговой отправки я получил зависание скрипта (при попытке отправить 40 000 пользователям). Но, как говорит Александр, он работает. Однако, не знаю, поэтому написал еще и свой урок.

Мой урок - это банальное соединение двух уроков в один с пошаговым отображением хода отправки + несколько приятных мелочей.

Возможности скрипта:
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=windows-1251" />
  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()"> <input type="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 и более МБ. Как результат - увеличение нагрузки на сервер.

За это сообщение автора Альберт_Уфа поблагодарили - 14:
apiboss, Александр, boombast1k, Feniks000, Fix, igrok0075, jdbc_example, maksimn, РоманНамазов, PUNISHER, S2T2A2S2, site-eks, Tairesh, ukhov
Альберт_Уфа

 
Автор темы
Сообщения: 31
Зарегистрирован: 02 апр 2011, 00:02
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



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

Сообщение Альберт_Уфа » 19 июн 2011, 19:29

Забыл добавить. Все 3 файла скрипта должны быть расположены в одном каталоге на хостинге.
Альберт_Уфа

 
Автор темы
Сообщения: 31
Зарегистрирован: 02 апр 2011, 00:02
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.

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

Сообщение Александр » 21 июн 2011, 20:44

Если подключать jQuery, то можно писать так:
  1. //var sOldText = document.getElementById('z_status').innerHTML;
  2. var sOldText = $('#z_status').html();
  3.  
  4. //var sSendText = document.getElementById('z_sendtext').value;
  5. var sSendText = $('#z_sendtext').val();
  6.  
  7. //document.getElementById('z_status').innerHTML = sOldText+ "<br /><br /><B>Пожалуйста, введите текст уведомления!</B>";
  8. $('#z_status').html(sOldText+ "<br /><br /><B>Пожалуйста, введите текст уведомления!</B>");

За это сообщение автора Александр поблагодарил:
myvzar
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Сообщение boombast1k » 24 июн 2011, 11:28

Отправка уведомлений завершена, либо превышен диапазон ID.

Это ошибка или что? У меня в базе вего 2 id правда...
Аватара пользователя
boombast1k

 
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31
Благодарил (а): 14 раз.
Поблагодарили: 14 раз.

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

Сообщение maksimn » 24 июн 2011, 16:39

boombast1k, это типа "Отправка успешно завершена".

Спасибо автору.
maksimn

 
Сообщения: 59
Зарегистрирован: 26 мар 2011, 10:46
Благодарил (а): 4 раз.
Поблагодарили: 2 раз.

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

Сообщение boombast1k » 25 июн 2011, 09:35

maksimn

так я только нажимаю, сразу всплывает
Аватара пользователя
boombast1k

 
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31
Благодарил (а): 14 раз.
Поблагодарили: 14 раз.

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

Сообщение boombast1k » 26 июн 2011, 07:29

$idcolumn = "ID";

а у меня походу должно быть uid? это там где все id написаны ведь, а у меня в id номера строк
Аватара пользователя
boombast1k

 
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31
Благодарил (а): 14 раз.
Поблагодарили: 14 раз.

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

Сообщение Влад » 26 июн 2011, 13:16

у меня ступор на данном этапе "Отправка уведомлений от позиции 0 из 961604 ..."
https://hrefs.ru - сервис крауд маркетинга №1 в 2019 году
Аватара пользователя
Влад
Модератор
Модератор
 
Сообщения: 654
Зарегистрирован: 29 апр 2010, 22:24
Благодарил (а): 26 раз.
Поблагодарили: 58 раз.

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

Сообщение boombast1k » 26 июн 2011, 17:49

О все ,я исправил)
ехууу... руботает!Только вот почему на руском кракозябры приходят?
Аватара пользователя
boombast1k

 
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31
Благодарил (а): 14 раз.
Поблагодарили: 14 раз.

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

Сообщение Fix » 28 июн 2011, 08:11

Эм.. У меня после отправки высвечивается эта строчка:
Отправка уведомлений завершена, либо превышен диапазон ID

Вроде как отправилось, но мне уведомление не пришло 0_о
Fix

 
Сообщения: 1
Зарегистрирован: 28 июн 2011, 08:08
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.

След.

Вернуться в Уроки IFrame ВКонтакте



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron