Pull to refresh

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

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



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



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

.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.