Страница 1 из 2

Приложение для повышения рейтинга

Добавлено: 21 мар 2011, 23:57
Александр
Приложение для повышения рейтинга
IFrame, jQuery, ВКонтакте API 3.0


В этом уроке вы узнаете как создать IFrame приложение для повышения рейтинга (метод secure.addRating).

Такое приложение не будет одобрено или проверено. Но вы можете встроить функцию повышения рейтинга в своё IFrame приложение.
У вашего приложения может быть свой уникальный дизайн, поэтому я не оформлял приложение из этого урока. Используются стандартные поля ввода и кнопки.


В уроке показано как:
- получить параметры viewer_id и auth_key
- вызвать действие при нажатии на кнопку (jQuery)
- вытащить данные из input и textarea (jQuery)
- выполнить запрос к api (метод getProfiles)
- отправить post запрос php скрипту (jQuery)
- правильно обрабатывать ответы от api сервера в php скрипте
- использовать json формат


Если вы ещё никогда не делали IFrame приложения вконтакте, советую сначала прочитать урок IFrame-приложение ВКонтакте. Вывод информации о пользователе.
Если вы не знаете какой нужен хостинг и как использовать класс APIServerPHPClass - прочтите урок Вызов серверных методов.
Если не работали с jQuery, то загляните в раздел Уроки jQuery.


Код файла index.html

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

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>http://flapps.ru</title><script src="js/jquery-1.5.1.min.js" type="text/javascript"></script><script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script><script type="text/javascript" charset="cp1251" >$(document).ready(function(){ // когда страница загрузится    VK.init(function() {        // получаем flashVars        VK.loadParams(document.location.href);        // вытаскиваем viewer_id и auth_key из полученных переменных        var viewer_id = VK.params.viewer_id;        var auth_key = VK.params.auth_key;                 // проверка uid        $('#check_uid').click(function(){            // вытаскиваем uid из поля uid_to            var uid_to = $('#uid_to').val();            // выполняем запрос получения профиля            VK.api("getProfiles", {uids:uid_to,fields:"photo_big"}, function(data) {                 // обрабатываем полученные данные                // выводим имя и фамилию в блок user_info                $('#user_info').html('<a href="http://vkontakte.ru/id' + data.response[0].uid + '">' + data.response[0].first_name + ' ' + data.response[0].last_name + '</a>' + '<br /><img src="' + data.response[0].photo_big + '" />');            });        });                      $('#add_rate').click(function(){            // вытаскиваем uid, rate и message из полей            var uid_to = $('#uid_to').val();            var rate = $('#rate').val();            var message = $('#message').val();                // отправляем post запрос, передаём данные скрипту            $.post('http://flapps.ru/apps/addrating/addrating.php', { "viewer_id": viewer_id, "auth_key": auth_key, "uid": uid_to, "rate": rate, "message": message },                function(data){ // функция после выполнения передачи данных скрипту                    // success и error нужны для того чтобы оформить вывод сообщения. Например, чтобы выводить сообщения в разные блоки.                    if (data.success) { // если скрипт вернул success                        $('#result_flapps').html(data.success.msg);                    } else { // если скрипт вернул error                        $('#result_flapps').html(data.error.msg);                    }                }, "json");                    });          // запустим функцию "клик по кнопке проверить", чтобы сразу загрузить информацио о введенном uid. Можно её убрать.        $('#check_uid').click();    });            // подсчет необходимого количества голосов    // до 100 - по 0,6. от 100 - по 0,5.     $('#rate').keyup(function() {        var rate = parseInt($('#rate').val());        if (rate>0) {            if (rate<100) {                $('#votes').html((rate * 6*100)/1000);            } else {                $('#votes').html((rate * 5*100)/1000);            }        } else {            $('#votes').html('Ошибка');        }    }); });</script></head><body> Кому: id<input type="text" id="uid_to" value="1306422"><input type="button" id="check_uid" value="Проверить"><div id="user_info"></div><br /> На сколько: <input type="text" id="rate" value="1"> Необходимо голосов <span id="votes">0.6</span><br />Сообщение:<br /><textarea id="message" rows="3" cols="40">Рейтинг</textarea><br /><input type="button" id="add_rate" value="Повысить"> <p id="result_flapps">http://flapps.ru</div> </body></html>
Код файла addrating.php

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

<?/*     http://flapps.ru/forum/ - форум о создании приложений */header('Content-Type: text/javascript; charset=utf-8');require 'vkapi.class.php'; $api_id = '1728947';            // id приложения$secret_key = 'qwerty12345asdfgh678'; // Защищенный ключ  $auth_key  = $_POST['auth_key'];  // auth_key из FlashVars приложения$viewer_id = $_POST['viewer_id']; // id просматривающего приложение // рассчитывается ключ авторизации$real_key = md5($api_id."_".$viewer_id."_".$secret_key); if ($auth_key == $real_key){    $uid = $_POST['uid'];    $rate = $_POST['rate'];    $message = $_POST['message'];     // если uid указан верно    if (is_numeric($uid)) {            // снимаем со счета пользователя голоса        if ($rate<100) {            $votes = $rate*60;        } else {                $votes = $rate*50;            }                $VK = new vkapi($api_id, $secret_key);        $resp = $VK->api('secure.withdrawVotes', array('uid'=>$viewer_id, 'votes'=>$votes));            if ($resp['response']>0) { // голоса успешно списаны            // повышаем рейтинг            $resp = $VK->api('secure.addRating', array('uid'=>$uid, 'rate'=>$rate, 'message'=>$message));             if ($resp['response']>0) {                echo '{"success":                {                "msg":"Рейтинг повышен!"                }                }';            } else {                switch($resp[error]['error_code']) {                    case 113:                        echo '{"error":                        {                        "msg":"Неверный id пользователя!"                        }                        }';                        break;                    case 147:                        echo '{"error":                        {                        "msg":"На балансе приложения недостаточно голосов!"                        }                        }';                        break;                    default:                              echo '{"error":                        {                        "msg":"Произошла ошибка!"                        }                        }';                }            }        }        else { // голоса не списаны            switch($resp[error][error_code]) {                case 502:                    echo '{"error":                        {                        "msg":"На вашем балансе недостаточно голосов!"                        }                        }';                    break;                default:                          echo '{"error":                        {                        "msg":"Произошла ошибка! Голоса не списаны."                        }                        }';            }        }    } else { // в поле "Кому" - не число         echo '{"error":            {            "msg":"В поле «Кому» должен быть введен корректный ID!"            }            }';    }        } else    echo 'Ошибка безопасности.';?>

Несмотря на описание метода в документации
Пример ответа в формате JSON
{"response":{"rating_added":2}}
на деле, при успешном повышении рейтинга сервер api возвращает ответ:
{"response":1}


Загружаем файлы на сервер и тестируем.

Исходник http://flapps.ru/example/iframe_addrating.rar

Re: Приложение для повышения рейтинга

Добавлено: 22 мар 2011, 08:25
punkpa
Спасибо)

Re: Приложение для повышения рейтинга

Добавлено: 22 мар 2011, 08:28
shrek
=)

Re: Приложение для повышения рейтинга

Добавлено: 22 мар 2011, 11:16
azzzi
# else
# echo 'Ошибка безопасности.';

это пользователю не выведется, так как ни в success ни в error этот текст не попадает

Re: Приложение для повышения рейтинга

Добавлено: 22 мар 2011, 23:36
Александр
azzzi
Да, эту часть кода можно убрать. Пользователю её выводить нет смысла, а для разработчика смысл есть. Начинающие могут пробовать это приложение и ошибиться, задав не тот защищенный ключ или вовсе не указав id своего приложения. Тогда на их вопрос "почему выводит Ошибка безопасности", будет проще ответить, чем на вопрос "почему ничего не выводит". Это же сообщение увидит человек, который попытается совершить запрос подменив id пользователя.

Re: Приложение для повышения рейтинга

Добавлено: 23 мар 2011, 13:56
MDNdemon
У меня почему-то вообще кнопка "Повысить" не пашет

Re: Приложение для повышения рейтинга

Добавлено: 23 мар 2011, 17:11
Pavlo0a
Я так понял что бы работало нужно с предыдущих страниц переменные передавать?

Re: Приложение для повышения рейтинга

Добавлено: 23 мар 2011, 21:05
Александр
MDNdemon
Смотри что отправляет приложение и что получает. Используй Charles.

Pavlo0a
Если будешь использовать код на какой-то вложенной странице своего приложения, то нужно передать viewer_id и auth_key.

Re: Приложение для повышения рейтинга

Добавлено: 15 апр 2011, 22:26
Serge
А можно ли сделать что бы поднимало рейтинг автоматически? К примеру раз в сутки (понимаю, что это крон, но сам скрипт не вышел) поднимало рейтинг определенному пользователю?
И запускать не из контакта, а с сервера...
Делал так, но пишет ошибку:

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

<?php$app_id = id;$api_secret = secret; require('VkApi.class.php'); function get_url($query){    $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);};    $uid = 1;    $rate = 1;    $message = "+1 рейтинга";    $query = $api->addRating($uid, $rate, $message);        $result = new SimpleXMLElement(get_url($query));?> 
Fatal error: Call to a member function addRating() on a non-object in /home/site/site.org.ua/www/php/rating.php on line 19

Re: Приложение для повышения рейтинга

Добавлено: 15 апр 2011, 22:49
Александр
Serge
Весь скрипт, без вывода результата. На основе этого урока, а не другого кода, о котором ты почему-то решил спросить в этой теме.

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

<?require 'vkapi.class.php';$api_id = '1728947';            // id приложения$secret_key = 'qwerty12345asdfgh678';$uid = '1';$rate = '1';$message = 'http://flapps.ru';$VK = new vkapi($api_id, $secret_key);$resp = $VK->api('secure.addRating', array('uid'=>$uid, 'rate'=>$rate, 'message'=>$message));?>