C# и ВКонтакте API

09.02.2013 at 19:27

Сегодня будет короткая демонстрация работы с 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/