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

Готовые уроки IFrame + ВКонтакте API
Ответить
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

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

Сообщение sasha^ »

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

Итак.. вот мой код(часть админки):
config.php (настройки)

Код: Выделить всё

<?php define("DB_HOST","*");define("DB_USER","*");define("DB_PASS","*");define("DB_NAME","*"); define("APP_ID","*");define("APP_SECRET","*"); define("TIME_ZONE",3*3600); // часовой пояс от UTCdefine("TIME",time() + TIME_ZONE); // время... define("ADMIN", "*"); // логин админаdefine("ADMIN_PASS", "*"); // пароль админа define("USERS_TABLE_NAME", "users"); // имя таблицы с пользователямиdefine("USERS_TABLE_COLLUMN_UID", "uid"); // имя столбца с айди юзеров?>
вспомогательные классы:
user.class.php

Код: Выделить всё

<?phpclass user {        static function checkVar($var) { // проверка переменной        $var = str_replace(chr(0),'',$var);        return mysql_escape_string($var);    }        static function checkAuth($auth,$viewer) { // проверяем auth_key        $real = md5(APP_ID.'_'.$viewer.'_'.APP_SECRET);        return $real == $auth;    }}?>
vkapi.class.php (1 моя правка для работы с последней версией vkapi)

Код: Выделить всё

<?php /** * VKAPI class for vk.com social network * * @package server API methods * @link http://vk.com/developers.php * @autor Oleg Illarionov * @version 1.0 */ class vkapi {    var $api_secret;    var $app_id;    var $api_url;        function vkapi($app_id, $api_secret, $api_url = 'api.vk.com/api.php') {        $this->app_id = $app_id;        $this->api_secret = $api_secret;        if (!strstr($api_url, 'http://')) $api_url = 'http://'.$api_url;        $this->api_url = $api_url;    }        function api($method,$params=false) {        if (!$params) $params = array();         $params['api_id'] = $this->app_id;        $params['v'] = '5.5'; // изменено на 5.5 - последнюю версию...        $params['method'] = $method;        $params['timestamp'] = time();        $params['format'] = 'json';        $params['random'] = rand(0,10000);        ksort($params);        $sig = '';        foreach($params as $k=>$v) {            $sig .= $k.'='.$v;        }        $sig .= $this->api_secret;        $params['sig'] = md5($sig);        $query = $this->api_url.'?'.$this->params($params);        $res = file_get_contents($query);        return json_decode($res, true);    }        function params($params) {        $pice = array();        foreach($params as $k=>$v) {            $pice[] = $k.'='.urlencode($v);        }        return implode('&',$pice);    }}?>
создаем папку admin...

admin/index.php главный файл админки - вход...

Код: Выделить всё

<?phpheader("Content-Type: text/html; charset=utf-8");date_default_timezone_set("Europe/London"); if(isset($_COOKIE['login'])) {    header("Location: main.php");}?><form action="main.php" method="get">  <p><b>Вход</b></p>  <p><input type="text" name="login"> - логин</p>  <p><input type="password" name="pass"> - пароль</p>  <p><input type="submit"></p></form>
admin/links.html - вспомогательный файл... со ссылками на все страницы админки(у меня их много..)

Код: Выделить всё

<ul><li><a href="index.php">Войти</a></li><li><a href="main.php">Главная</a></li><li><a href="notif.php">Уведомления</a></li><li><a href="exit.php">Выйти</a></li></ul>
admin/exit.php - файл выхода с админки

Код: Выделить всё

<?phpheader("Content-Type: text/html; charset=utf-8");setcookie("login","");setcookie("pass","");include("links.html");?>
admin/notif.php - страница с которой отсылаем уведомления...

Код: Выделить всё

<?phpheader("Content-Type: text/html; charset=utf-8"); date_default_timezone_set("Europe/London");require_once("../config.php"); $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);$db->set_charset("utf8"); $resp = $db->query('SELECT COUNT(`'.USERS_TABLE_COLLUMN_UID.'`) as count FROM `'.USERS_TABLE_NAME.'`');$row = $resp->fetch_assoc();$max = floor($row['count']/100)+1;?><!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Уведомления</title>    <script type="text/javascript" src="jquery.min.js"></script>    <style>    #mess {    width:400px;    height:200px;    }    #log {    background:black;    color:white;    padding:30px;    }    </style>    <script type="text/javascript">    function send(text,counter,max) {        $.ajax({        url: 'send.php',        type: 'POST',        data: {'text':text,'offset':counter*100},        success: function(data) {            $('#log').append(data+'</br>');            if(counter < max-1) send(text,counter+1,max);        }        });    }    </script></head><body><? include("links.html"); ?><h1>ОТПРАВКА УВЕДОМЛЕНИЙ!</h1><input type='textarea' id="mess"><a href="#" onclick="send($('#mess').val(),0,<?php echo $max; ?>);"><h3>ОТПРАВИТЬ!</h3></a></br></br></br></br><h4>ЛОГ...</h4><div id="log"></div></body></html>
admin/send.php - скрипт, отсылающий уведомления...

Код: Выделить всё

<?phpheader("Content-Type: text/html; charset=utf-8");date_default_timezone_set("Europe/London"); require_once("../config.php");require_once("../vkapi.class.php");require_once("../user.class.php"); $log = user::checkVar( $_COOKIE['login'] );$pass = user::checkVar( $_COOKIE['pass'] ); if($log != ADMIN || $pass != ADMIN_PASS) {    exit("не туда попал:)");} if(!isset($_POST['offset'])) exit('Что-то не так...');if(!isset($_POST['text'])) exit('Нет сообщения'); $offset = intval($_POST['offset']);$text = $_POST['text'];  $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);$db->set_charset("utf8"); $resp = $db->query('SELECT `'.USERS_TABLE_COLLUMN_UID.'` FROM `'.USERS_TABLE_NAME.'` LIMIT '.$offset.',100'); $need = $resp->num_rows < 100 ? $resp->num_rows-1 : 99; $ids = "";$count = 0;while($row = $resp->fetch_assoc()) {    $ids .= $row[USERS_TABLE_COLLUMN_UID];    if($count !== $need) $ids .= ',';    $count++;} $VK = new vkapi(APP_ID, APP_SECRET);$res = $VK->api('secure.sendNotification', array('user_ids' => $ids, 'message' => $text)); exit('В позиции от '.$offset.' к '.($offset+100).' отправлено им: '.$res['response']);?>
admin/main.php - главный файл админки...:) в нем у меня много чего.. но в уроке я только об уведомлениях

Код: Выделить всё

<?phpheader("Content-Type: text/html; charset=utf-8");date_default_timezone_set("Europe/London");require_once("../user.class.php"); if(!isset($_COOKIE['login'])) {    setcookie("login", user::checkVar($_GET['login']) );    setcookie("pass", user::checkVar($_GET['pass']) );}include("links.html"); echo "Привет, ".$_COOKIE['login'];?>
admin/jquery.min.js - библиотека для js...качаем по ссылке ниже, располагаем в папке admin!
https://ajax.googleapis.com/ajax/libs/j ... ery.min.js

итог...
если вы все сделали как в уроке(скопировали код, разместили правильно файлы), правильно поменяли данные в файле настроек - config.php, то все будет работать...
если есть вопросы - задавайте)
Удачи ;)
stepan05
Сообщения: 146
Зарегистрирован: 15 авг 2012, 09:43

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

Сообщение stepan05 »

Все нормально, спасибо!
Аватара пользователя
Komsomolez
Сообщения: 12
Зарегистрирован: 12 ноя 2013, 14:33

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

Сообщение Komsomolez »

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

файл vk_msg_test.php

Код: Выделить всё

<?php header              ( "Content-Type: text/html; charset=utf-8" );date_default_timezone_set("Europe/London");require_once        ( "vkapi.class.php" ); $vk_app_key         = "AAA";$vk_app_id          = "BBB"; $vk_ids             = $_POST["vk_ids"];$vk_msg             = $_POST["vk_msg"];echo                "<form id='form1' name='form1' method='post' action='vk_msg_test.php'>";echo                "<table width='0%' border='0' cellpadding='2'>";echo                "<tr><td align='right'>VK Id(s) </td><td><input type='text' name='vk_ids' value='$vk_ids'/></td></tr>";echo                "<tr><td align='right'>Message</td><td><textarea name='vk_msg' cols='50' rows='4'>$vk_msg</textarea></td></tr>";echo                "<tr><td> </td><td><input type='submit' name='vk_send' value='Submit' /></td></tr>";echo                "</table></form>";  if( $_POST["vk_send"]!="" ){    if( $vk_ids=="" || $vk_msg=="" ){        echo        "*** complete all fields";    }else{              $VK         = new vkapi ( $vk_app_id, $vk_app_key );        if( strpos($vk_ids,",")!==FALSE ) $params = array ( "user_ids"=>$vk_ids, "message"=>$vk_msg );                                     else $params = array ( "user_id"=>$vk_ids, "message"=>$vk_msg );        $reply      = $VK->api  ( 'secure.sendNotification', $params );        echo        "<br>params = <br>";        print_r     ( $params );        echo        "<br><br>reply = <br>";        print_r     ( $reply );    }}?>
У меня если ввожу один идентификатор пользователя -- выдает
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] => )
Сообщение при этом не отправляет

Спасибо
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

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

Сообщение sasha^ »

код во истину тупой :) но ладно....
попробывал.. работает.. ток не у всех.. просто некоторые могли запретить уведомления..
Permission to perform this action is denied - чел не разрешил уведомления :)
Аватара пользователя
Komsomolez
Сообщения: 12
Зарегистрирован: 12 ноя 2013, 14:33

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

Сообщение Komsomolez »

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

Да, уже разобрался. Здесь подробнее http://flapps.ru/forum/topic7288.html#p47839

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

Вопрос как теперь централизовано предложить пользователям его включить ?
madvk
Сообщения: 49
Зарегистрирован: 23 сен 2013, 15:08

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

Сообщение madvk »

чтобы сделать через cron что автомачически отправляло)
cibersant
Сообщения: 199
Зарегистрирован: 23 окт 2011, 18:34

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

Сообщение cibersant »

Всё отлчно,всё работает.Спасибо огромное,так бы пришлось день на это убить.Ещё раз спасибо.
alanq
Сообщения: 5
Зарегистрирован: 04 ноя 2014, 08:25

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

Сообщение alanq »

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

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

Сообщение sasha^ »

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

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

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

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

удачи=)
Ответить