IFRAME Статистика. Использование getProfile

Тут показано:
1) Получение данных с сервера в IFRAME.
2) Обработка ошибки.
3) Хранение данных на страницы.
4) Определение адреса авторизированного контакта и генерация ссылки.
5) Арифметические операции
6) Работа со строками.
7) Работа с удаленными пользователями.
Насчет последнего, удаленные пользователи не отображаются методами API, из-за этого часто бывают ошибки.

Прокомментировал основные моменты. Возможны ошибки, код не проверял, но должен работать правильно.

Все вопросы задавайте.

Пример работающего приложения: http://vkontakte.ru/app1865531#stats

Сервер возвращает статистику вида:

Код
{"response":[{"uid":"29730325","allnames":"27502","falsenames":"4009"},{"uid":"18308721","allnames":"17777","falsenames":"641"},{"uid":"7562680","allnames":"17111","falsenames":"1511"},{"uid":"5057680","allnames":"8504","falsenames":"39"},{"uid":"11590665","allnames":"7700","falsenames":"191"},{"uid":"59303225","allnames":"7031","falsenames":"178"}, ... ,{"uid":"55904731","allnames":"1212","falsenames":"152"}],"answer":"100"}

Подобное реализуется без проблем. На PHP я на пишу, если будет желание дам код на ASP.net.

HTML страницы

Код
<head>
    <title></title>
    <link href="http://vkontakte.ru/css/admin2.css?7" rel="stylesheet" type="text/css" />
    <link href="http://vkontakte.ru/css/rustyle.css?75" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" href="http://vkontakte.ru/css/wiki.css?15" type="text/css" />
    <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="http://vkontakte.ru/js/common.js"></script>
    <script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script>
     <script type="text/javascript" charset="cp1251">
        var progressLine = '<div style="padding:5px;text-align: center"><img valign="middle" src="/images/upload.gif"></div>';
        $(document).ready(function () {
            VK.init(function () {
                var parts = document.location.search.substr(1).split("&");
                var flashVars = {}, curr;
                for (i = 0; i < parts.length; i++) {
                    curr = parts[i].split('=');
                    flashVars[curr[0]] = curr[1];
                }
                $("#viewerid").val(flashVars['viewer_id']); //хранение данных
                $("#authkey").val(flashVars['auth_key']);
                $("#apiurl").val(flashVars['api_url']);
                Stats();
            });
        });
         function Stats() {
            var uid = new Array(100);
            var viewerid = $("#viewerid").val(); //получение сохраненных данных
            var authkey = $("#authkey").val();
            if ($("#apiurl").val().indexOf('vk.com') > -1) { //определения адреса ВКонтакте
                var apiurl = 'http://vk.com/'; 
            }
            else {
                var apiurl = 'http://vkontakte.ru/';
            }
            $.get("http://..../Stats.aspx", { id: viewerid, authkey: authkey, action: 'all' }, function (data) {
                json = JSON.parse(data); //получение статистики GET запросом, JSON
                if (json.response.answer == -1) { //проверка на наличие ошибок
                    Error(json.response.error)
                    return;
                }
                for (var i = 0; i < json.answer; i++) { //сохранение всех айди в массив
                    uid[i] = json.response[i].uid;
                }
                VK.api("getProfiles", { uids: uid.join(","), fields: "nickname,domain" }, function (data) { //склеивание и подготовка запроса
                    var j = 0; 
                    for (var i = 0; i < json.response.length; i++) { //чтение данных о профилях
                        var bg = json.response[i].falsenames / json.response[i].allnames;
                        if (bg > 0.099) {
                            var bghtml = '<b>' + bg.toString().substring(0, 5) + '</b>';
                        }
                        else {
                            var bghtml = (bg + '').substring(0, 5)
                        }
                        var tmpname = data.response[j].first_name + ' ' + data.response[j].nickname + ' ' + data.response[j].last_name; //имя+ник+фамилия
                        var tmpid = data.response[j].domain;
                        if (json.response[i].uid != data.response[j].uid) { //проверка на на удаление. 
                            tmpname = 'DELETED';
                            tmpid = 'id' + json.response[i].uid;
                            j--;
                        }
                        j++;
                        $("#list").append('<tr><td id="cell_no"><b>' + (i + 1) + '<b>.</td><td id="cell_name"><a class="memLink" href="' + apiurl + tmpid + '" target="_blank">' + tmpname + '</a></td><td id="cell_forwarnings">' + json.response[i].allnames + '</td> <td id="cell_fornames">' + json.response[i].falsenames + '</td><td id="cell_percent">' + bghtml + '</td></tr>'); //вывод данных в таблицу
                    }
                });
            });
            $("#stats").show();
        }
        function Error(code) { //обработка ошибок с всплывающим окном
            var box = new MessageBox({ title: 'Ошибка' });
            box.addButton({ label: 'Закрыть', style: "button_no", onClick: function () { box.hide() } });
            if (code == 1) {
                box.content('Серверная ошибка');
            }
            else if (code == 5) {
                box.content('Ошибка авторизации');
            }
            box.show();
        }
    </script>
</head>
<body>
    <input id="viewerid" type="hidden" />
    <input id="authkey" type="hidden" />
    <input id="apiurl" type="hidden" />
    <br />
    <div id="stats" style="display: none">
        <table class="wikiTable">
            <thead>
                <tr>
                    <th style="width: 18px">
                        &nbsp;
                    </th>
                    <th style="width: 175px">
                        Пользователь
                    </th>
                    <th style="width: 175px">
                        Всего
                    </th>
                    <th style="width: 175px">
                        Неверно
                    </th>
                    <th>
                        B/G
                    </th>
                </tr>
            </thead>
            <tbody id='list'>
            </tbody>
        </table>
    </div>
</body>
</html>


JS отдельно

Код
        var progressLine = '<div style="padding:5px;text-align: center"><img valign="middle" src="/images/upload.gif"></div>';
        $(document).ready(function () {
            VK.init(function () {
                var parts = document.location.search.substr(1).split("&");
                var flashVars = {}, curr;
                for (i = 0; i < parts.length; i++) {
                    curr = parts[i].split('=');
                    flashVars[curr[0]] = curr[1];
                }
                $("#viewerid").val(flashVars['viewer_id']); //хранение данных
                $("#authkey").val(flashVars['auth_key']);
                $("#apiurl").val(flashVars['api_url']);
                Stats();
            });
        });
         function Stats() {
            var uid = new Array(100);
            var viewerid = $("#viewerid").val(); //получение сохраненных данных
            var authkey = $("#authkey").val();
            if ($("#apiurl").val().indexOf('vk.com') > -1) { //определения адреса ВКонтакте
                var apiurl = 'http://vk.com/'; 
            }
            else {
                var apiurl = 'http://vkontakte.ru/';
            }
            $.get("http://..../Stats.aspx", { id: viewerid, authkey: authkey, action: 'all' }, function (data) {
                json = JSON.parse(data); //получение статистики GET запросом, JSON
                if (json.response.answer == -1) { //проверка на наличие ошибок
                    Error(json.response.error)
                    return;
                }
                for (var i = 0; i < json.answer; i++) { //сохранение всех айди в массив
                    uid[i] = json.response[i].uid;
                }
                VK.api("getProfiles", { uids: uid.join(","), fields: "nickname,domain" }, function (data) { //склеивание и подготовка запроса
                    var j = 0; 
                    for (var i = 0; i < json.response.length; i++) { //чтение данных о профилях
                        var bg = json.response[i].falsenames / json.response[i].allnames;
                        if (bg > 0.099) {
                            var bghtml = '<b>' + bg.toString().substring(0, 5) + '</b>';
                        }
                        else {
                            var bghtml = (bg + '').substring(0, 5)
                        }
                        var tmpname = data.response[j].first_name + ' ' + data.response[j].nickname + ' ' + data.response[j].last_name; //имя+ник+фамилия
                        var tmpid = data.response[j].domain;
                        if (json.response[i].uid != data.response[j].uid) { //проверка на на удаление. 
                            tmpname = 'DELETED';
                            tmpid = 'id' + json.response[i].uid;
                            j--;
                        }
                        j++;
                        $("#list").append('<tr><td id="cell_no"><b>' + (i + 1) + '<b>.</td><td id="cell_name"><a class="memLink" href="' + apiurl + tmpid + '" target="_blank">' + tmpname + '</a></td><td id="cell_forwarnings">' + json.response[i].allnames + '</td> <td id="cell_fornames">' + json.response[i].falsenames + '</td><td id="cell_percent">' + bghtml + '</td></tr>'); //вывод данных в таблицу
                    }
                });
            });
            $("#stats").show();
        }
        function Error(code) {
            var box = new MessageBox({ title: 'Ошибка' }); //обработка ошибок
            box.addButton({ label: 'Закрыть', style: "button_no", onClick: function () { box.hide() } });
            if (code == 1) {
                box.content('Серверная ошибка');
            }
            else if (code == 5) {
                box.content('Ошибка авторизации');
            }
            box.show();
}
Теги:
IFRAME, Статистика, getProfile
Добавлено: 14 Февраля 2015 13:20:17 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...