C# и ВКонтакте API
Сегодня будет короткая демонстрация работы с API Вконтакте на примере программы для скачивания музыки из контакта.
Создание приложения.
Идем на страницу http://vk.com/developers.php#devstep2, создаем приложение, запоминаем ИД приложения и защищенный ключ.
Авторизация пользователя и разрешение приложению определенного набора действий.
Авторизация подробно описана здесь. Делать ее будем с помощью контрола WebBrowser.
this.authWebBrowser.Navigate(String.Format("https://oauth.vk.com/authorize?client_id={0}&scope={1}&redirect_uri={2}&display=page&response_type=token", VKSettings.AppId, VKSettings.Scope, VKSettings.RedirectUri));
Здесь
- VKSettings.AppId — ИД приложения, мы его узнали при создании приложения.
- VKSettings.Scope — маска необходимых операций. Нам достаточно доступа к аудиозаписям, для этого передаем «8». Подробнее здесь.
- VKSettings.RedirectUri — «http://oauth.vk.com/blank.html».
После того, как пользователь разрешит приложению нужные операции, браузер будет перенаправлен на страницу, в адресе которой будут данные, нужные для вызовов API.
На событие Navigated вешаем обработчик
var urlParams = System.Web.HttpUtility.ParseQueryString(e.Url.Fragment.Substring(1)); VKSettings.AccessToken = urlParams.Get("access_token"); VKSettings.UserId = urlParams.Get(user_id);
Сначала программу я делал на WPF, но в WPF контроль с браузером терял часть ссылки начиная с «#» при редиректе, так что пришлось писать на WinForms.
Получение количества песен.
Для получения количества песен используется метод audio.getCount.
Для вызова метода формируем URL:
string.Format("https://api.vk.com/method/audio.getCount.xml?oid={0}&access_token={1}", UserId, AccessToken)
К названию метода приписана строка «.xml» — это сделано для получения результата в XML. Без этого был бы JSON.
Дальше получаем результат:
var xml = new XmlDocument(); xml.Load(countUrl);
Получение информации о треках.
Теперь используем метод audio.get. Формируем URL:
string.Format("https://api.vk.com/method/audio.get.xml?uid={0}&count={1}&access_token={2}", UserId, count, AccessToken)
Аналогичным образом получаем ответ, начинаем парсить. Ответ содержит коллекцию элементов audio, каждый из которых соответствует одному треку. Нас интересуют следующие их узлы:
- title — Название трека.
- artist — Исполнитель.
- album — ИД альбома. Причем я так и не нашел метода API для получения названия альбома.
- url — Адрес для скачивания трека. Адреса привязаны к IP, так скачивать с них надо сразу же.
Дальше скачиваем файлы:
using (WebClient Client = new WebClient()) { Client.DownloadFile(url, fileName); }
Все, задача решена.
UPD.
Разобрался, как получить имена альбомов. Список альбомов возвращает метод audio.getAlbums. Странно, что этого метода нет в панели методов справа.
Про парсинг сайтов на C# можно прочитать здесь http://lsreg.ru/parsing-sajtov-na-c/