ВКонтакте, в пабликах и группах, очень часто проводятся конкурсы в стиле «Лайкни запись — получи *приз*». Меня всегда интересовало, как же они считают все эти лайки?
Работаю я проджектом в веб-студии, поэтому тема веб-разработки мне знакома, да и самому всегда хотелось «поиграться» с api. И вот, сегодня, когда выдалось пару часов свободного времени, решил все таки взяться за сабж и разобраться, как и что работает.
Единственный язык, с которым более-менее знаком, это php, поэтому пример будет на нем.
Сразу скажу, даже для начинающих программистов в посте нет ничего нового или интересного. Более опытные программисты, скорее всего, вообще разнесут мой код в пух и прах. Но, важен же результат и спортивный интерес, не так ли?
Кому интересно, прошу под кат.
Погнали
Первым делом, идем на http://vk.com/dev и кликаем на «Создать приложение», выбираем «Standalone-приложение» и как-нибудь называем. Я назвал VK Random Winner =)
Получаем код на телефон, вводим, и попадаем на страницу настройки приложения. Тут, вроде, все понятно, все по-русски.
На этой странице нас интересуют два поля: «ID приложения» и «Защищенный ключ». Они нам понадобятся для того, чтобы контакт пустил нас к своим данным.
Оффтоп
Для того, чтобы авторизоваться на ВКонтакте, я читал документацию, перечитывал, смотрел и скролил. Видимо, не мое это, программирование. Но, блуждая по сети с вопросом «Как!?», я набрел на блог, в котором была интересующая меня информация. К сожалению, блог я не помню, да и не в этом суть.
Погнали дальше
Качаем архив с http://vk.com/source/APIServerPHPClass.zip, в нем 2 файла:
- index.php
- vkapi.class.php
Нас интересует index.php:
require 'vkapi.class.php';
$api_id = 1234; // Insert here id of your application
$secret_key = ' your secret key '; // Insert here secret key of your application
$VK = new vkapi($api_id, $secret_key);
$resp = $VK->api('getProfiles', array('uids'=>'1,6492'));
print_r($resp);
Здесь мы вводим id приложения и защитный ключ, которые мы до этого получили. Загружаем оба файла на сервер, открываем index.php и, вуаля, мы видим массив с данными двух пользователей (для наглядности оберните код php в тег pre)
Лазаем по документации, ищем, какая информация нам понадобится. Для себя я определил следующий алгоритм:
- Получаем список всех, кто лайкнул запись
- Случайно выбираем одного(у) из списка
- Выдаем посетителю
Все это хотелось связать с формой, которая требовала бы от посетителя только 2 параметра: id группы/паблика и id записи.
Далее просто предоставлю код, все строчки откомментированы, особой сложности в коде нет. Возможно, я путаюсь в терминах, прошу строго не ругать.
$owner = '-'.$_POST['owner'];
$item = $_POST['item'];
require 'vkapi.class.php';
$api_id = ID ВАШЕГО ПРИЛОЖЕНИЯ; // Insert here id of your application
$secret_key = 'СЕКРЕТНЫЙ КЛЮЧ'; // Insert here secret key of your application
$VK = new vkapi($api_id, $secret_key);
$post = $VK->api('likes.getList', array('type'=>'post', 'owner_id'=>$owner, 'item_id'=>$item, 'count'=>'1000')); // заносим в массив людей, которые лайкнули пост, owner - после wall, item после _
$some_man = count($post['response']['users']) - 1; // считаем колличество лайкнувших, отнимаем 1, чтобы получилась позиция в массиве
$winner_count = rand(0, $some_man); // выбираем рандомно позицию в массиве
$winner = ($post['response']['users'][$winner_count]); // забираем id победителя
$user = $VK->api('users.get', array('uid'=>$winner, 'fields'=>'uid, first_name, last_name, photo')); // заносим информацию о победителе в массив
$winner_id = ($user[response][0]['uid']); // id победителя
$winner_first_name = ($user[response][0]['first_name']); // имя победителя
$winner_last_name = ($user[response][0]['last_name']); // фамилия победителя
$winner_photo = ($user[response][0]['photo']); // фото победителя
Все, вся информация у нас есть, осталось только ее вывести:
echo ('<img src="'.$winner_photo.'"/><a href="http://vk.com/id'.$winner_id.'">'.$winner_first_name.' '.$winner_last_name.'</a>');
Самым сложным для меня было сообразить, что из ссылки необходимо передать к api, чтобы получить нужные данные. Но, метод научного тыка еще никто не отменял.
Попробовать можно тут
.