Хочу рассказать о своем модуле VK::App для создания клиентских приложений в социальной сети vk.com. Основные возможности модуля:
- Авторизация, основанная на OAuth 2.0, по логину/паролю или cookies.
- Установка прав доступа, которые потребуются приложению.
- Выполнение любых запросов VK API и получение результата в JSON, XML или Perl Object виде.
Модуль использует минимум зависимостей: только LWP и JSON.
Для написания клиентского при приложения вам надо знать api_id. Для этого можно зарегистрировать свое приложение или использовать существующий api_id.
Синтаксис
Конструкторы
#1. Авторизация по логину и паролю
use VK::App;
my $vk = VK::App->new(
# Ваш мобильный телефон или email
login => 'login',
# Пароль
password => 'password',
# api_id приложения
api_id => 'api_id',
# Имя файла в который будут записываться и считываться cookies
#(в данном варианте конструктора это не обязательный параметр)
cookie_file => '/home/user/.vk.com.cookie',
);
#2. Авторизация с помощью cookies файла
use VK::App;
my $vk = VK::App->new(
cookie_file => '/home/user/.vk.com.cookie',
api_id => 'api_id',
);
#3. Дополнительные опции
use VK::App;
my $vk = VK::App->new(
cookie_file => '/home/user/.vk.com.cookie',
api_id => 'api_id',
# Перечисляем через запятую права, которые будут нужны приложению.
# Список всех возможных прав доступа можно посмотреть по ссылке:
# http://vk.com/developers.php?oid=-17680044&p=Application_Access_Rights
scope => 'friends,photos,audio,video,wall,groups,messages,offline',
# Формат данных в котором будут возвращаться ответы на запросы:
# 'JSON', 'XML' или 'Perl' объекты. Значение по умолчанию: 'Perl'.
format => 'Perl',
);
Примеры запросов
# Синтаксис такой:
# my $response = $vk->request($METHOD_NAME,$PARAMETERS);
# Список всех методов:
# http://vk.com/developers.php?oid=-17680044&p=API_Method_Description
#1. Получить uid пользователя по его имени
my $user = $vk->request('getProfiles',{uid=>'genaev',fields=>'uid'});
my $uid = $user->{response}->[0]->{uid};
#2. Получить список треков пользователя по его uid
my $tracks = $vk->request('audio.get',{uid=>$uid});
my $url = $tracks->{response}->[0]->{url}; # прямая ссылка на mp3 первого трека
Модуль опубликован на cpan. Более подробная документация и описание всех методов: https://metacpan.org/module/VK::App.
Зачем нужен еще один велосипед?
Потому что у других велосипедов квадратные колеса! У меня в vk.com есть несколько любимых музыкальных групп и друзей, с которыми наши музыкальные вкусы совпадают. Хотелось иметь актуальную локальную копию музыки этих групп и друзей, чтобы слушать её, например в машине. т.е. иметь возможность автоматической синхронизации. Приложения с GUI я не рассматривал в принципе. Среди консольных подходящих не нашел. Можно было бы поискать реализацию API для других языков программирования (имею опыт работы с Ruby, Python, Java, C), но душа лежит именно к Perl. На cpan.org есть два модуля VK::MP3 и VKontacte::API. VK::MP3 — нормальный модуль, но мои задачи не решает, т.к. занимается только поиском музыки. Vkontacte::API — абсолютно не работоспособный. Во-первых он зачем-то требует секретный ключ приложения, что является небезопасным. Во-вторых на запрос getUserSettings он возвращает код +1, что означает фактическое отсутствие прав доступа. В-третьих при использовании третьего варианта конструктора модуль просто падает. По этим причинами и возникла идея написания модуля, о котором здесь идет речь.
Планы
Довести до ума мою программу vdm (vk download music) ради которой все и затевалось. Выложить её на github, может будет кому-то полезна? Могу собрать из программы статические бинарники под windows, mac, linux (есть купленная версия PDK).
Так получилось, что VK::App — мой первый модуль опубликованный на CPAN. И процесс публикации занял в два-три раза больше времени, чем написание самого модуля. Вроде бы и информации в сети очень много, а четкой последовательности действий не знаешь. Да и есть подводные камни. Я довольно подробно изучил этот вопрос и написал для себя инструкцию, как это правильно и быстро собрать дистрибутив модуля для его публикации. Могу её немного причесать и выложить в качестве отдельной статьи на habrahabr.
Буду рад любым фитбекам!
Автор: genaev