VIP В iframe приложении

Темы только для ознакомления. Уроки по использованию старой версии ВКонтакте API и устаревших методов.
Alexander
FL Team
FL Team
Сообщения: 186
Зарегистрирован: 15 окт 2009, 20:08

VIP В iframe приложении

Сообщение Alexander »

Собственно я давно тут не был, может кому надо было, а может кто-то уже и выкладывал.

Вступление
В целом данный скрипт прекрасен, но у него есть огромный минус. Мы просто ОБЯЗАНЫ носить с собой auth_key и viewer_id.
Поскольку я в основном пишу именно iframe приложения для ВКонтакте, я перепробывал уже кучу способов переноса параметров, но по прежнему самым удобным остаётся - носить с собой гетом.
Главный конкурирующий вариант - это сессии, но наши прекрасные браузеры как IE и вроде Safari ( не помню точно ) не дают юзать нам этот чудесный и удобный метод.

Конфиг
Вам крупно повезло, если вы юзаете аякс, и дёргаете все страницы именно им, но я не думаю что пользователям таких методов понадобился бы данный урок, поэтому придётся использовать анальные методы, да простят меня все разрабы.

Возможно вы уже используете config файл, тогда вам просто в него необходимо будет дописать указанный мною код.

Код config.php

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

 <?$secret=''; //Это вам придётся заменить на свой секретный ключ ;)if ($_GET['auth_key']!==md5($_GET['api_id'].'_'.$_GET['viewer_id'].'_'.$secret)){ exit(); } //Проверяем достоверность данных$url='?auth_key='.$_GET['auth_key'].'&viewer_id='.$_GET['viewer_id'].'&api_id='.$_GET['api_id']; //Формируем ссылку$lider_id=file_get_contents('lider.txt'); //Получаем id текущего лидера.?> 
Не забываем создать файлик lider.txt и поместить туда id лидера, только цифры.

Далее нам необходимо создать скрипт, который будет отвечать за главную часть, установку лидера.
Он использует давно нам всем известную библиотеку VkApi.class.php для удобного доступа к серверным методам апи.
 Либа VkApi.class.php

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

 <?/** * Класс обертка, для VkApi. Здесь описываются методы для запросов. * * @package VkApi * @author  Michael Elovskih <wronglink@gmail.com> */class VkApiNode{    /**     * Конструктор класса. Принимает обязательные $api_id (Id приложения) и     * $secret (секретный код приложения).      *      * @param   integer $api_id     Id приложения.     * @param   string  $secret     Секретный код приложения.     * @param   string  $format     Формат ответа (XML или JSON). По умолчанию, 'XML'.     * @param   string  $version    Версия API. По умолчанию, '2.0'.     * @param   string  $server_url Адрес сервера API. По умолчанию 'http://api.vkontakte.ru/api.php?'.     * @param   mixed   $timestamp  Timestamp сервера. Если не задано - берется системное.     * @param   mixed   $random     Случайное значение. Если не задано - задается через rand().     */    public function __construct ($api_id,                                    $secret,                                     $format = 'XML',                                    $version = '2.0',                                    $server_url = 'http://api.vkontakte.ru/api.php?',                                    $timestamp = false,                                    $random = false)    {        $this->api_id = $api_id;        $this->method = $method;        $this->secret = $secret;        $this->format = $format;        $this->version = $version;        $this->server_url = $server_url;        $this->timestamp = $timestamp ? $timestamp : time();        $this->random = $random ? $random : rand();    }        /**     * Отправляет уведомления пользователям. Для того, чтобы пользователь получил уведомление     * необходимо, чтобы у него было разрешено получение уведомлений в настройках.     * @see http://vkontakte.ru/pages.php?o=-1&p=secure.sendNotification         *      * @param   mixed   $uids       Id пользователей (массив до 100 чисел или число).     * @param   string  $message    Текст сообщения.     *     * @return  string  Строка запроса.         */    public function sendNotification ($uids, $message)    {        $api = new VkApi($this->api_id,                            'secure.sendNotification',                            $this->secret,                            $this->format,                            $this->version,                            $this->server_url,                            $this->timestamp,                            $this->random);        $api->addParameter('uids', join(',', $uids));        $api->addParameter('message', $message);        return $api->getQuery();    }        /**     * Сохраняет строку статуса приложения для последующего вывода в     * общем списке приложений на странице пользоваетеля.     * @see http://vkontakte.ru/pages.php?o=-1&p=secure.saveAppStatus     *      * @param   integer $uid    Id пользователя.     * @param   string  $status Текст статуса. Строка до 32 символов.     *     * @return  string  Строка запроса.         */    public function saveAppStatus ($uid, $status)    {        $api = new VkApi($this->api_id,                            'secure.saveAppStatus',                            $this->secret,                            $this->format,                            $this->version,                            $this->server_url,                            $this->timestamp,                            $this->random);        $api->addParameter('uid', $uid);        $api->addParameter('status', $status);        return $api->getQuery();    }     /**     * Возвращает платежный баланс приложения.     * @see http://vkontakte.ru/pages.php?o=-1&p=secure.getAppBalance     *     * @return  string  Строка запроса.         */    public function getAppBalance ()    {        $api = new VkApi($this->api_id,                            'secure.getAppBalance',                            $this->secret,                            $this->format,                            $this->version,                            $this->server_url,                            $this->timestamp,                            $this->random);        return $api->getQuery();    }     /**     * Возвращает баланс пользователя на счету приложения.     * @see http://vkontakte.ru/pages.php?o=-1&p=secure.getBalance     *      * @param   integer $uid    Id пользователя.     *     * @return  string  Строка запроса.         */    public function getBalance ($uid)    {        $api = new VkApi($this->api_id,                            'secure.getBalance',                            $this->secret,                            $this->format,                            $this->version,                            $this->server_url,                            $this->timestamp,                            $this->random);        $api->addParameter('uid', $uid);        return $api->getQuery();    }     /**     * Переводит голоса со счета приложения на счет пользователя.     * @see http://vkontakte.ru/pages.php?o=-1&p=secure.addVotes     *      * @param   integer $uid    Id пользователя.     * @param   integer $votes  Количество голосов (в 100 долях).     *     * @return  string  Строка запроса.         */    public function addVotes ($uid, $votes)    {        $api = new VkApi($this->api_id,                            'secure.addVotes',                            $this->secret,                            $this->format,                            $this->version,                            $this->server_url,                            $this->timestamp,                            $this->random);        $api->addParameter('uid', $uid);        $api->addParameter('votes', $votes);        return $api->getQuery();    }     /**     * Списывает голоса со счета пользователя на счет приложения.     * @see http://vkontakte.ru/pages.php?o=-1&p=secure.withdrawVotes     *      * @param   integer $uid    Id пользователя.     * @param   integer $votes  Количество голосов (в 100 долях).     *     * @return  string  Строка запроса.         */    public function withdrawVotes ($uid, $votes)    {        $api = new VkApi($this->api_id,                            'secure.withdrawVotes',                            $this->secret,                            $this->format,                            $this->version,                            $this->server_url,                            $this->timestamp,                            $this->random);        $api->addParameter('uid', $uid);        $api->addParameter('votes', $votes);        return $api->getQuery();    }     /**     * Переводит голоса со счета одного пользователя на счет другого в рамках приложения.     * @see http://vkontakte.ru/pages.php?o=-1&p=secure.transferVotes     *      * @param   integer $uid_from   Id пользователя, от которого переводятся голоса.     * @param   integer $uid_to     Id пользователя, которому переводятся голоса.     * @param   integer $votes      Количество голосов (в 100 долях).     *      * @return  string  Строка запроса.         */    public function transferVotes ($uid_from, $uid_to, $votes)    {        $api = new VkApi($this->api_id,                            'secure.transferVotes',                            $this->secret,                            $this->format,                            $this->version,                            $this->server_url,                            $this->timestamp,                            $this->random);        $api->addParameter('uid_from', $uid_from);        $api->addParameter('uid_to', $uid_to);        $api->addParameter('votes', $votes);        return $api->getQuery();    }     /**     * Возвращает историю транзакций внутри приложения.     * @see http://vkontakte.ru/pages.php?o=-1&p=secure.getTransactionsHistory     *      * @param   integer $type   Тип возвращаемых транзакций.      * 0 – все транзакции, 1 – транзакции типа "пользователь → приложение",     * 2 – транзакции типа "приложение → пользователь", 3 – транзакции типа "пользователь → пользователь"      * @param   integer $uid_from   Фильтр по Id пользователя, с баланса которого снимались голоса.     * @param   integer $uid_to     Фильтр по Id пользователя, на баланс которого начислялись голоса.     * @param   integer $date_from  Фильтр по дате начала. Задается в виде UNIX-time.     * @param   integer $date_to    фильтр по дате конца. Задается в виде UNIX-time.     * @param   integer $limit      Количество возвращаемых записей. По умолчанию 1000.     *     * @return  string  Строка запроса.         */    public function getTransactionsHistory ($type = 0, $uid_from = null, $uid_to = null, $date_from = null, $date_to = null, $limit = 1000)    {        $api = new VkApi($this->api_id,                            'secure.getTransactionsHistory',                            $this->secret,                            $this->format,                            $this->version,                            $this->server_url,                            $this->timestamp,                            $this->random);        if($type)            $api->addParameter('type', $type);        if($uid_from)            $api->addParameter('uid_from', $uid_from);        if($uid_to)            $api->addParameter('uid_to', $uid_to);        if($date_from)            $api->addParameter('date_from', $date_from);        if($date_to)            $api->addParameter('date_to', $date_to);        if($limit)            $api->addParameter('limit', $limit);        return $api->getQuery();    }    } /** * Класс VkApi. Для каждого запроса создается экземпляр данного класса, * задаются метод API и параметры запроса и вызывается getQuery метод.   * * @package VkApi * @author  Michael Elovskih <wronglink@gmail.com> */class VkApi{       /**     * Конструктор класса.     *      * @param   integer $api_id     Id приложения.     * @param   string  $method     Название метода API.     * @param   string  $secret     Секретный код приложения.     * @param   string  $format     Формат ответа (XML или JSON).     * @param   string  $version    Версия API.     * @param   string  $server_url Адрес сервера API.     * @param   mixed   $timestamp  Timestamp сервера.     * @param   mixed   $random     Случайное значение.     */    public function __construct ($api_id,                                    $method,                                    $secret,                                     $format,                                    $version,                                    $server_url,                                    $timestamp,                                    $random)    {        $this->api_id = $api_id;        $this->method = $method;        $this->secret = $secret;        $this->format = $format;        $this->version = $version;        $this->server_url = $server_url;        $this->timestamp = $timestamp;        $this->random = $random;          $this->parameters = array();         $this->parameters[] = array('name' => 'api_id', 'value' => $this->api_id);        $this->parameters[] = array('name' => 'method', 'value' => $this->method);        $this->parameters[] = array('name' => 'format', 'value' => $this->format);        $this->parameters[] = array('name' => 'v', 'value' => $this->version);        $this->parameters[] = array('name' => 'timestamp', 'value' => $this->timestamp);        $this->parameters[] = array('name' => 'random', 'value' => $this->random);    }     /**     * __toString метод класса.     *     * @return  string  Строка запроса.         */    public function __toString ()    {        $this->parameters[] = array('name' => 'sig', 'value' => $this->getSig());         foreach($this->parameters as $p)             $query[] = $p['name'].'='.rawurlencode($p['value']);          return $this->server_url . join('&', $query);    }     /**     * Добавляет параметр запроса.     *      * @param   string  $p_name     Название параметра     * @param   string  $p_value    Значение параметра     */    public function addParameter ($p_name, $p_value)    {        $this->parameters[] = array('name' => $p_name, 'value' => $p_value);    }        /**     * Возвращает строку запроса.     *     * @return  string  Строка запроса.         */    public function getQuery ()    {        return $this->__toString();    }        /**     * Считает Sig-подпись приложения.     *      * @return  string  Sig-подпись приложения.     */    private function getSig ()    {        sort($this->parameters);                foreach($this->parameters as $p)            $sigStr .= join('=',$p);        return md5($sigStr . $this->secret);    }} ?> 
Код king.php

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

 <?include('config.php');require('VkApi.class.php'); function get_url($query) { //AФункция для отправки запроса $ch = curl_init();curl_setopt($ch, CURLOPT_URL, $query);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 10);return curl_exec($ch);curl_close($ch);}$api = new VkApiNode($_GET['api_id'], $secret);  // Инициализируемся$query = $api->getBalance($_GET['viewer_id']); //формируем ссылку для получения баланса пользователя$balance = new SimpleXMLElement(get_url($query)); //отправляем запросif ($balance->balance >=100) { // Если на балансе есть голос$query = $api->withdrawVotes($_GET['viewer_id'], 100); //формируем ссылку для списыванияget_url($query); // списываем голос$qwe = fopen('lider.txt', w); //  Открываем файл lider.txt для перезаписиfwrite($qwe, $_GET['viewer_id']); // Пишем туда id текущего юзераfclose($qwe); // Закрываем файлecho '1'; // Пишем 1 что-бы скрипт понял что всё успешно} else { echo '2'; } //Если баланс меньше голоса пишем 2, опять же что-бы скрипт понял что надо предложить пополнить баланс?> 
Ну а дальше дело за малым.
Сразу предупреждаю:
1. Нужен хостинг с curl'ом.
2. Вам придётся к каждой ссылке добавить <? echo $url ?> и в каждом файле, в самом верху добавить <? include('config.php'); ?>

Всё что нам осталось - показать пользователю лидера.

Пример страницы index.php

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

 <?include('config.php');?><html><head><script src="http://vkontakte.ru/js/api/share.js?5"></script><script src="http://vkontakte.ru/js/api/xd_connection.js?2"></script><script src="http://code.jquery.com/jquery-1.4.3.min.js"></script></head><body><center><div id="lider"></div><a href="javascript://" onclick="king();">Стать королём</a></center> <script type="text/javascript">VK.init(function(){ });VK.api('getProfiles', { uids:"<? echo $lider_id; ?>", fields:"first_name, uid, photo_medium" }, function(data){ document.getElementById('lider').innerHTML='<br/><a href="http://vkontakte.ru/id'+data.response[0].uid+'" target="_blank"><img src="'+data.response[0].photo_medium+'"><center>'+data.response[0].first_name+'</center>';});VK.addCallback('onBalanceChanged', function(){ king(); });function king(){$.get('king.php<? echo $url; ?>', function(data){if (data=='1'){ window.location.href=window.location.href;  }if (data=='2'){ VK.callMethod('showPaymentBox', 1);  }});}</script></body></html> 

Большую часть кода сейчас писал на коленке, не проверяя, поэтому не совсем уверен в правильности.
Если что - задавайте вопросы в топике. :)

UPD: ИСХОДНИК http://drbrain.in/test/test.zip
Последний раз редактировалось Deniska 09 янв 2011, 19:23, всего редактировалось 3 раза.
Причина: Поправил по просьбе автора.
Аватара пользователя
Влад
Модератор
Модератор
Сообщения: 654
Зарегистрирован: 29 апр 2010, 22:24

Re: VIP В iframe приложении

Сообщение Влад »

Супер урок, жаль я реализовал такую функцию немного по другому, понравилось про "анальные методы" в общем суть моего метода в том что в отдельную таблицу записывается дата нажатия, тут же вывод по последней дате 1 юзера и всё, ещё я реализовал автообновление страницы meta тегами.
Побольше бы таких красочных и подробных уроков, одним словом RESPECT...
Alexander
FL Team
FL Team
Сообщения: 186
Зарегистрирован: 15 окт 2009, 20:08

Re: VIP В iframe приложении

Сообщение Alexander »

У меня самого бд юзается, но большинство не любит такие вещи.
Поэтому переписал под файлик.
NESER
Сообщения: 49
Зарегистрирован: 16 ноя 2010, 19:29

Re: VIP В iframe приложении

Сообщение NESER »

Я нуб! Устанавливаю скрипт на denwer, туда curl установил, запускаю сайт со скриптом через приложение - пусто, не чего не появилось, искал ошибки в коде, нашел 2 ошибки, то что не правильно кавычки расставлены. Не понимаю, что там должно отображаться на главной странице? Должна быть там ссылка с текстом "стать королем", а где она? В чем проблема? Почему не работает?
NESER
Сообщения: 49
Зарегистрирован: 16 ноя 2010, 19:29

Re: VIP В iframe приложении

Сообщение NESER »

Еще не понял это - "2. Вам придётся к каждой ссылке добавить <? echo $url ?> и в каждом файле, в самом верху добавить <? include('config.php'); ?>". К какой ссылке?
NESER
Сообщения: 49
Зарегистрирован: 16 ноя 2010, 19:29

Re: VIP В iframe приложении

Сообщение NESER »

Александр, не могли бы посмотреть код в действии, а потом выложить код?:) А то хрен разобраться в чем проблема.
Alexander
FL Team
FL Team
Сообщения: 186
Зарегистрирован: 15 окт 2009, 20:08

Re: VIP В iframe приложении

Сообщение Alexander »

NESER писал(а):Еще не понял это - "2. Вам придётся к каждой ссылке добавить <? echo $url ?> и в каждом файле, в самом верху добавить <? include('config.php'); ?>". К какой ссылке?

Ну предположим у вас есть меню :

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

 <a href="index1.php">Страница1</a><br/><a href="index2.php">Страница2</a><br/><a href="index3.php">Страница3</a><br/><a href="index4.php">Страница4</a><br/><a href="index5.php">Страница5</a><br/> 
После несложной процедуры это меню будет выглядеть так;

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

 <a href="index1.php<? echo $url; ?>">Страница1</a><br/><a href="index2.php<? echo $url; ?>">Страница2</a><br/><a href="index3.php<? echo $url; ?>">Страница3</a><br/><a href="index4.php<? echo $url; ?>">Страница4</a><br/><a href="index5.php<? echo $url; ?>">Страница5</a><br/> 
Alexander
FL Team
FL Team
Сообщения: 186
Зарегистрирован: 15 окт 2009, 20:08

Re: VIP В iframe приложении

Сообщение Alexander »

Таки да.
Админы. модеры.

king.php

поправьте
fwrite($qwe, $_GET[''viewer_id]); // Пишем туда id текущего юзера
на
fwrite($qwe, $_GET['viewer_id']); // Пишем туда id текущего юзера

и

$query = $api->withdrawVotes($viewer_id, 100); //формируем ссылку для списывания
на
$query = $api->withdrawVotes($_GET['viewer_id'], 100); //формируем ссылку для списывания

не надо было в час ночи что-то писать :D
Аватара пользователя
Deniska
Сообщения: 653
Зарегистрирован: 30 окт 2009, 00:07

Re: VIP В iframe приложении

Сообщение Deniska »

Поправил.

... и еще поправил.
NESER
Сообщения: 49
Зарегистрирован: 16 ноя 2010, 19:29

Re: VIP В iframe приложении

Сообщение NESER »

Разобрался в одном, что не показывает из-за где-то имеющегося косяка в config.php , если в index.php убрать Инклюд конфига, то все показывается, но не черта не работает, не пойму, где там может быть ошибка.
Ответить