Как стать автором
Обновить

Выбор победителя из «лайкнувших» пост во ВКонтакте

ВКонтакте, в пабликах и группах, очень часто проводятся конкурсы в стиле «Лайкни запись — получи *приз*». Меня всегда интересовало, как же они считают все эти лайки?



Работаю я проджектом в веб-студии, поэтому тема веб-разработки мне знакома, да и самому всегда хотелось «поиграться» с 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)



Лазаем по документации, ищем, какая информация нам понадобится. Для себя я определил следующий алгоритм:



  1. Получаем список всех, кто лайкнул запись
  2. Случайно выбираем одного(у) из списка
  3. Выдаем посетителю


Все это хотелось связать с формой, которая требовала бы от посетителя только 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, чтобы получить нужные данные. Но, метод научного тыка еще никто не отменял.



Попробовать можно тут

.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.