Тут показано:
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">
</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();
}