Рабочие уведомления от 5.12.2013

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

Рабочие уведомления от 5.12.2013

Сообщение sasha^ » 05 дек 2013, 13:45

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

Итак.. вот мой код(часть админки):
config.php (настройки)
  1. <?php
  2.  
  3. define("DB_HOST","*");
  4. define("DB_USER","*");
  5. define("DB_PASS","*");
  6. define("DB_NAME","*");
  7.  
  8. define("APP_ID","*");
  9. define("APP_SECRET","*");
  10.  
  11. define("TIME_ZONE",3*3600); // часовой пояс от UTC
  12. define("TIME",time() + TIME_ZONE); // время...
  13.  
  14. define("ADMIN", "*"); // логин админа
  15. define("ADMIN_PASS", "*"); // пароль админа
  16.  
  17. define("USERS_TABLE_NAME", "users"); // имя таблицы с пользователями
  18. define("USERS_TABLE_COLLUMN_UID", "uid"); // имя столбца с айди юзеров
  19. ?>


вспомогательные классы:
user.class.php
  1. <?php
  2. class user {   
  3.     static function checkVar($var) { // проверка переменной
  4.         $var = str_replace(chr(0),'',$var);
  5.         return mysql_escape_string($var);
  6.     }
  7.    
  8.     static function checkAuth($auth,$viewer) { // проверяем auth_key
  9.         $real = md5(APP_ID.'_'.$viewer.'_'.APP_SECRET);
  10.         return $real == $auth;
  11.     }
  12. }
  13. ?>


vkapi.class.php (1 моя правка для работы с последней версией vkapi)
  1. <?php
  2.  
  3. /**
  4.  * VKAPI class for vk.com social network
  5.  *
  6.  * @package server API methods
  7.  * @link http://vk.com/developers.php
  8.  * @autor Oleg Illarionov
  9.  * @version 1.0
  10.  */
  11.  
  12. class vkapi {
  13.     var $api_secret;
  14.     var $app_id;
  15.     var $api_url;
  16.    
  17.     function vkapi($app_id, $api_secret, $api_url = 'api.vk.com/api.php') {
  18.         $this->app_id = $app_id;
  19.         $this->api_secret = $api_secret;
  20.         if (!strstr($api_url, 'http://')) $api_url = 'http://'.$api_url;
  21.         $this->api_url = $api_url;
  22.     }
  23.    
  24.     function api($method,$params=false) {
  25.         if (!$params) $params = array();
  26.         $params['api_id'] = $this->app_id;
  27.         $params['v'] = '5.5'; // изменено на 5.5 - последнюю версию...
  28.         $params['method'] = $method;
  29.         $params['timestamp'] = time();
  30.         $params['format'] = 'json';
  31.         $params['random'] = rand(0,10000);
  32.         ksort($params);
  33.         $sig = '';
  34.         foreach($params as $k=>$v) {
  35.             $sig .= $k.'='.$v;
  36.         }
  37.         $sig .= $this->api_secret;
  38.         $params['sig'] = md5($sig);
  39.         $query = $this->api_url.'?'.$this->params($params);
  40.         $res = file_get_contents($query);
  41.         return json_decode($res, true);
  42.     }
  43.    
  44.     function params($params) {
  45.         $pice = array();
  46.         foreach($params as $k=>$v) {
  47.             $pice[] = $k.'='.urlencode($v);
  48.         }
  49.         return implode('&',$pice);
  50.     }
  51. }
  52. ?>


создаем папку admin...

admin/index.php главный файл админки - вход...
  1. <?php
  2. header("Content-Type: text/html; charset=utf-8");
  3. date_default_timezone_set("Europe/London");
  4.  
  5. if(isset($_COOKIE['login'])) {
  6.     header("Location: main.php");
  7. }
  8. ?>
  9. <form action="main.php" method="get">
  10.   <p><b>Вход</b></p>
  11.   <p><input type="text" name="login"> - логин</p>
  12.   <p><input type="password" name="pass"> - пароль</p>
  13.   <p><input type="submit"></p>
  14. </form>


admin/links.html - вспомогательный файл... со ссылками на все страницы админки(у меня их много..)

  1. <ul>
  2. <li><a href="index.php">Войти</a></li>
  3. <li><a href="main.php">Главная</a></li>
  4. <li><a href="notif.php">Уведомления</a></li>
  5. <li><a href="exit.php">Выйти</a></li>
  6. </ul>


admin/exit.php - файл выхода с админки
  1. <?php
  2. header("Content-Type: text/html; charset=utf-8");
  3. setcookie("login","");
  4. setcookie("pass","");
  5. include("links.html");
  6. ?>


admin/notif.php - страница с которой отсылаем уведомления...
  1. <?php
  2. header("Content-Type: text/html; charset=utf-8");
  3. date_default_timezone_set("Europe/London");
  4. require_once("../config.php");
  5.  
  6. $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  7. $db->set_charset("utf8");
  8.  
  9. $resp = $db->query('SELECT COUNT(`'.USERS_TABLE_COLLUMN_UID.'`) as count FROM `'.USERS_TABLE_NAME.'`');
  10. $row = $resp->fetch_assoc();
  11. $max = floor($row['count']/100)+1;
  12. ?>
  13. <!DOCTYPE html>
  14. <html>
  15. <head>
  16.     <meta charset="UTF-8">
  17.     <title>Уведомления</title>
  18.     <script type="text/javascript" src="jquery.min.js"></script>
  19.     <style>
  20.     #mess {
  21.     width:400px;
  22.     height:200px;
  23.     }
  24.     #log {
  25.     background:black;
  26.     color:white;
  27.     padding:30px;
  28.     }
  29.     </style>
  30.     <script type="text/javascript">
  31.     function send(text,counter,max) {
  32.         $.ajax({
  33.         url: 'send.php',
  34.         type: 'POST',
  35.         data: {'text':text,'offset':counter*100},
  36.         success: function(data) {
  37.             $('#log').append(data+'</br>');
  38.             if(counter < max-1) send(text,counter+1,max);
  39.         }
  40.         });
  41.     }
  42.     </script>
  43. </head>
  44. <body>
  45. <? include("links.html"); ?>
  46. <h1>ОТПРАВКА УВЕДОМЛЕНИЙ!</h1>
  47. <input type='textarea' id="mess">
  48. <a href="#" onclick="send($('#mess').val(),0,<?php echo $max; ?>);"><h3>ОТПРАВИТЬ!</h3></a>
  49. </br></br></br></br>
  50. <h4>ЛОГ...</h4>
  51. <div id="log"></div>
  52. </body>
  53. </html>


admin/send.php - скрипт, отсылающий уведомления...
  1. <?php
  2. header("Content-Type: text/html; charset=utf-8");
  3. date_default_timezone_set("Europe/London");
  4. require_once("../config.php");
  5. require_once("../vkapi.class.php");
  6. require_once("../user.class.php");
  7.  
  8. $log = user::checkVar( $_COOKIE['login'] );
  9. $pass = user::checkVar( $_COOKIE['pass'] );
  10.  
  11. if($log != ADMIN || $pass != ADMIN_PASS) {
  12.     exit("не туда попал:)");
  13. }
  14.  
  15. if(!isset($_POST['offset'])) exit('Что-то не так...');
  16. if(!isset($_POST['text'])) exit('Нет сообщения');
  17.  
  18. $offset = intval($_POST['offset']);
  19. $text = $_POST['text'];
  20.  
  21. $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  22. $db->set_charset("utf8");
  23.  
  24. $resp = $db->query('SELECT `'.USERS_TABLE_COLLUMN_UID.'` FROM `'.USERS_TABLE_NAME.'` LIMIT '.$offset.',100');
  25.  
  26. $need = $resp->num_rows < 100 ? $resp->num_rows-1 : 99;
  27.  
  28. $ids = "";
  29. $count = 0;
  30. while($row = $resp->fetch_assoc()) {
  31.     $ids .= $row[USERS_TABLE_COLLUMN_UID];
  32.     if($count !== $need) $ids .= ',';
  33.     $count++;
  34. }
  35.  
  36. $VK = new vkapi(APP_ID, APP_SECRET);
  37. $res = $VK->api('secure.sendNotification', array('user_ids' => $ids, 'message' => $text));
  38.  
  39. exit('В позиции от '.$offset.' к '.($offset+100).' отправлено им: '.$res['response']);
  40. ?>


admin/main.php - главный файл админки...:) в нем у меня много чего.. но в уроке я только об уведомлениях
  1. <?php
  2. header("Content-Type: text/html; charset=utf-8");
  3. date_default_timezone_set("Europe/London");
  4. require_once("../user.class.php");
  5.  
  6. if(!isset($_COOKIE['login'])) {
  7.     setcookie("login", user::checkVar($_GET['login']) );
  8.     setcookie("pass", user::checkVar($_GET['pass']) );
  9. }
  10. include("links.html");
  11.  
  12. echo "Привет, ".$_COOKIE['login'];
  13. ?>


admin/jquery.min.js - библиотека для js...качаем по ссылке ниже, располагаем в папке admin!
https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js

итог...
если вы все сделали как в уроке(скопировали код, разместили правильно файлы), правильно поменяли данные в файле настроек - config.php, то все будет работать...
если есть вопросы - задавайте)
Удачи ;)
sasha^

 
Автор темы
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

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

Google
 



Re: Рабочие уведомления от 5.12.2013

Сообщение stepan05 » 05 дек 2013, 15:33

Все нормально, спасибо!
stepan05

 
Сообщения: 146
Зарегистрирован: 15 авг 2012, 09:43
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.

Re: Рабочие уведомления от 5.12.2013

Сообщение Komsomolez » 05 дек 2013, 15:50

Урок хороший, спасибо. Но там большая часть -- фреймворк для админки. В конце всё упирается в
$res = $VK->api('secure.sendNotification', array('user_ids' => $ids, 'message' => $text));

У меня админка уже есть -- хотел-бы взять только сам код отправки нотификации.
Сделал точто так-же. Взял твой vkapi.class.php. Всё равно нихрена не работает. Уже голову сломал -- то-ли я мудак то-ли сервер у меня кривой то-ли в приложении настроек каких-то не хватает
Если не трудно -- попробуй через такой скрипт отправить у себя тестовое сообщение одному-двум пользователям. Буду хоть знать скрипт рабочий или нет

файл vk_msg_test.php
  1. <?php
  2.  
  3. header              ( "Content-Type: text/html; charset=utf-8" );
  4. date_default_timezone_set("Europe/London");
  5. require_once        ( "vkapi.class.php" );
  6.  
  7. $vk_app_key         = "AAA";
  8. $vk_app_id          = "BBB";
  9.  
  10. $vk_ids             = $_POST["vk_ids"];
  11. $vk_msg             = $_POST["vk_msg"];
  12. echo                "<form id='form1' name='form1' method='post' action='vk_msg_test.php'>";
  13. echo                "<table width='0%' border='0' cellpadding='2'>";
  14. echo                "<tr><td align='right'>VK Id(s) </td><td><input type='text' name='vk_ids' value='$vk_ids'/></td></tr>";
  15. echo                "<tr><td align='right'>Message</td><td><textarea name='vk_msg' cols='50' rows='4'>$vk_msg</textarea></td></tr>";
  16. echo                "<tr><td>&nbsp;</td><td><input type='submit' name='vk_send' value='Submit' /></td></tr>";
  17. echo                "</table></form>"
  18. if( $_POST["vk_send"]!="" ){
  19.     if( $vk_ids=="" || $vk_msg=="" ){
  20.         echo        "*** complete all fields";
  21.     }else{     
  22.         $VK         = new vkapi ( $vk_app_id, $vk_app_key );
  23.         if( strpos($vk_ids,",")!==FALSE ) $params = array ( "user_ids"=>$vk_ids, "message"=>$vk_msg );
  24.                                      else $params = array ( "user_id"=>$vk_ids, "message"=>$vk_msg );
  25.         $reply      = $VK->api  ( 'secure.sendNotification', $params );
  26.         echo        "<br>params = <br>";
  27.         print_r     ( $params );
  28.         echo        "<br><br>reply = <br>";
  29.         print_r     ( $reply );
  30.     }
  31. }
  32. ?>

У меня если ввожу один идентификатор пользователя -- выдает
reply =
Array ( [error] => Array ( [error_code] => 7 [error_msg] => Permission to perform this action is denied [request_params] => Array ( [0] => Array ( [key] => api_id [value] => 3968569 ) [1] => Array ( [key] => format [value] => json ) [2] => Array ( [key] => message [value] => Hello! ) [3] => Array ( [key] => method [value] => secure.sendNotification ) [4] => Array ( [key] => random [value] => 2992 ) [5] => Array ( [key] => timestamp [value] => 1386247654 ) [6] => Array ( [key] => user_id [value] => 229973359 ) [7] => Array ( [key] => v [value] => 5.5 ) [8] => Array ( [key] => sig [value] => 10e847aee208fc6493e4ce81d32a56e7 ) ) ) )

Если несколько --
Array ( [response] => )
Сообщение при этом не отправляет

Спасибо
Аватара пользователя
Komsomolez

 
Сообщения: 12
Зарегистрирован: 12 ноя 2013, 14:33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Рабочие уведомления от 5.12.2013

Сообщение sasha^ » 05 дек 2013, 16:52

код во истину тупой :) но ладно....
попробывал.. работает.. ток не у всех.. просто некоторые могли запретить уведомления..
Permission to perform this action is denied - чел не разрешил уведомления :)
sasha^

 
Автор темы
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Re: Рабочие уведомления от 5.12.2013

Сообщение Komsomolez » 05 дек 2013, 17:11

Сорри -- я вообще не программист. Как умел так и накодил.

Да, уже разобрался. Здесь подробнее topic7288.html#p47839

Надо было сразу при регистрации приложения включить флаг рассылок. Сейчас он у всех выключен.

Вопрос как теперь централизовано предложить пользователям его включить ?
Аватара пользователя
Komsomolez

 
Сообщения: 12
Зарегистрирован: 12 ноя 2013, 14:33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Рабочие уведомления от 5.12.2013

Сообщение madvk » 17 дек 2013, 20:05

чтобы сделать через cron что автомачически отправляло)
madvk

 
Сообщения: 49
Зарегистрирован: 23 сен 2013, 15:08
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.

Re: Рабочие уведомления от 5.12.2013

Сообщение cibersant » 04 фев 2014, 16:44

Всё отлчно,всё работает.Спасибо огромное,так бы пришлось день на это убить.Ещё раз спасибо.
cibersant

 
Сообщения: 199
Зарегистрирован: 23 окт 2011, 18:34
Благодарил (а): 3 раз.
Поблагодарили: 5 раз.

Re: Рабочие уведомления от 5.12.2013

Сообщение alanq » 11 мар 2015, 11:35

Все сделал как в примере 100 раз перепроверил, но вот при отправке пишет - "Notice: Undefined index: response in ...admin\send.php on line 39
В позиции от 0 к 100 отправлено им: " и естественно ничего не приходит. ЗЫ. в бд одна запись uid и номер. Как быть куда тыкать? Спасибо.
alanq

 
Сообщения: 5
Зарегистрирован: 04 ноя 2014, 08:25
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Рабочие уведомления от 5.12.2013

Сообщение sasha^ » 12 мар 2015, 22:03

Все сделал как в примере 100 раз перепроверил, но вот при отправке пишет - "Notice: Undefined index: response in ...admin\send.php on line 39
В позиции от 0 к 100 отправлено им: " и естественно ничего не приходит. ЗЫ. в бд одна запись uid и номер. Как быть куда тыкать? Спасибо.


ошибка означает что пришел не response, а error..

проверить правильность id.

Обратите внимание, нельзя отправлять более 1 уведомления в час (3 в сутки). Кроме того, нельзя отправить одному пользователю два уведомления с одинаковым текстом подряд. - и соблюдение этого условия.
ну и заодно приложение должно быть установлено юзером.

если не поможет - сделать var_dump($res); и выложить на форум.

удачи=)
sasha^

 
Автор темы
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.


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



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

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

cron