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"}
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"> </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>
Код: Выделить всё
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(); }