Для новичков. Работа с API ВКонтакте на C#

от автора

Приветствую тебя, дорогой читатель! Данная статья написана новичком для новичков, в ней описан процесс создания простейшего WindowsForms приложения, которое будет работать с API социальной сети «ВКонтакте». Но это приложение не будет использовать готовые библиотеки (VK.Net и прочие) для обращения к API VK.

Задачи приложения:

  1. Получить User Token и выполнять все дальнейшие запросы с помощью него.
  2. Получить на вход ID пользователя.
  3. Вывести информацию о пользователе с введённым ID.


Для удобства я буду использовать две библиотеки:

  • xNet — для произведения GET-запросов.
  • JSON.Net — для считывания ответов на эти запросы.

Первое, что необходимо сделать — это получить ID приложения. Для этого нужно зайти на VkDevelopers, создать новое Standalone приложение, зайти в его настройки и скопировать ApplicationID.

Можно приступать к созданию приложения, заходим в VisualStudio и создаём новое WindowsForms приложение.

Подключаем библиотеки

Библиотека JSON.Net подключается с помощью консоли диспетчера пакетов, достаточно ввести команду:

Install-Package Newtonsoft.Json

Для подключения библиотеки xNet нам потребуется зайти сюда, скачать xNet.dll и добавить его в проект с помощью менеджера ссылок.

После подключения библиотек создаём две формы: MainForm (Можно использовать стандартную Form1) и AuthorizationForm. Формы выглядят так:

MainForm

AuthorizationForm

Эта форма состоит из элемента WebBrowser с параметром Name = GetToken.

Создадим ещё один файл класса. Назовём его VkAPI.

Приступаем к написанию кода.

Для начала реализуем получение токена. Для этого в MainForm создадим обработчик нажатия на кнопку Button_GetToken:

private void Button_GetToken_Click(object sender, EventArgs e)         {             AuthorizationForm GetToken = new AuthorizationForm();             GetToken.ShowDialog();         } 

Также отредактируем AuthorizationForm:

using System; using System.Windows.Forms; using System.IO;  namespace VkAPITutorial {     public partial class AuthorizationForm : Form     {         public AuthorizationForm()         {             InitializeComponent();         }          private void AuthorizationForm_Load(object sender, EventArgs e)         {             GetToken.DocumentCompleted += GetToken_DocumentCompleted;             GetToken.Navigate("https://oauth.vk.com/authorize?client_id=5709976&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.52");         }          private void GetToken_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)         {             if (GetToken.Url.ToString().IndexOf("access_token=") != 0)             {                 GetUserToken();             }         }          private void GetUserToken()         {             char[] Symbols = { '=', '&' };             string[] URL = GetToken.Url.ToString().Split(Symbols);             File.WriteAllText("UserInf.txt", URL[1] + "\n");             File.AppendAllText("UserInf.txt", URL[5]);             this.Visible = false;         }     } } 

Теперь разберём всё по порядку:

При нажатии на кнопку открывается AuthorizationForm с Web-браузером, в браузере открывается ссылка:

https://oauth.vk.com/authorize?client_id=ApplicationID&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.52

Параметр client_id — это ID приложения, полученный нами в начале статьи. После параметра scope перечислены разрешения, которые мы запрашиваем, полный список разрешений можно найти здесь.

При обновлении страницы мы проверяем содержится ли в адресе access_token, если да, то мы разбиваем адрес и заносим в файл token и ID пользователя, который авторизовывался. После этого AuthorizationForm закрывается. Токен получен!

Теперь можно приступить к получению и выводу информации о пользователе. Нам нужно получить имя, фамилию, город, страну и фото. Можно получать их запросами, по отдельности, но лучше получить их в одном запросе.

Отредактируем файл VkAPI.cs:

using System.Collections.Generic; using xNet; using Newtonsoft.Json;  namespace VkAPITutorial {     class VkAPI     {         private const string __APPID = "ApplicationId";  //ID приложения         private const string __VKAPIURL = "https://api.vk.com/method/";  //Ссылка для запросов         private string _Token;  //Токен, использующийся при запросах          public VkAPI(string AccessToken)         {             _Token = AccessToken;         }          public Dictionary<string, string> GetInformation(string UserId, string[] Fields)  //Получение заданной информации о пользователе с заданным ID          {             HttpRequest GetInformation = new HttpRequest();             GetInformation.AddUrlParam("user_ids", UserId);             GetInformation.AddUrlParam("access_token", _Token);             string Params = "";             foreach (string i in Fields)             {                 Params += i + ",";             }             Params = Params.Remove(Params.Length - 1);             GetInformation.AddUrlParam("fields", Params);             string Result = GetInformation.Get(__VKAPIURL + "users.get").ToString();             Result = Result.Substring(13, Result.Length - 15);             Dictionary<string, string> Dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(Result);             return Dict;         }          public string GetCityById(string CityId)  //Перевод ID города в название         {             HttpRequest GetCityById = new HttpRequest();             GetCityById.AddUrlParam("city_ids", CityId);             GetCityById.AddUrlParam("access_token", _Token);             string Result = GetCityById.Get(__VKAPIURL + "database.getCitiesById").ToString();             Result = Result.Substring(13, Result.Length - 15);             Dictionary<string, string> Dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(Result);             return Dict["name"];         }          public string GetCountryById(string CountryId)  //Перевод ID страны в название         {             HttpRequest GetCountryById = new HttpRequest();             GetCountryById.AddUrlParam("country_ids", CountryId);             GetCountryById.AddUrlParam("access_token", _Token);             string Result = GetCountryById.Get(__VKAPIURL + "database.getCountriesById").ToString();             Result = Result.Substring(13, Result.Length - 15);             Dictionary<string, string> Dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(Result);             return Dict["name"];         }     } } 

И MainForm:

using System; using System.Windows.Forms; using System.Collections.Generic; using System.IO;  namespace VkAPITutorial {     public partial class MainForm : Form     {         VkAPI _ApiRequest;         private string _Token;  //Токен, использующийся при запросах         private string _UserId;  //ID пользователя         private Dictionary<string, string> _Response;  //Ответ на запросы          public MainForm()         {             InitializeComponent();         }          private void Button_GetToken_Click(object sender, EventArgs e)         {             AuthorizationForm GetToken = new AuthorizationForm();             GetToken.ShowDialog();         }          private void MainForm_Load(object sender, EventArgs e)         {             try             {                 StreamReader ControlInf = new StreamReader("UserInf.txt");                 _Token = ControlInf.ReadLine();                 _UserId = ControlInf.ReadLine();                 ControlInf.Close();                 if (_Token != null)                 {                     _ApiRequest = new VkAPI(_Token);                     string[] Params = { "city", "country", "photo_max" };                     _Response = _ApiRequest.GetInformation(_UserId, Params);                     if (_Response != null)                     {                         User_ID.Text = _UserId;                         User_Photo.ImageLocation = _Response["photo_max"];                         User_Name.Text = _Response["first_name"];                         User_Surname.Text = _Response["last_name"];                         User_Country.Text = _ApiRequest.GetCountryById(_Response["country"]);                         User_City.Text = _ApiRequest.GetCityById(_Response["city"]);                         Button_GetToken.Visible = false;                     }                 }             }             catch{}         }          private void Button_GetInformation_Click(object sender, EventArgs e)         {             try             {                 StreamReader ControlInf = new StreamReader("UserInf.txt");                 _Token = ControlInf.ReadLine();                 ControlInf.Close();                 _ApiRequest = new VkAPI(_Token);                 _UserId = User_ID.Text;                 string[] Params = { "city", "country", "photo_max" };                 _Response = _ApiRequest.GetInformation(_UserId, Params);                 if (_Response != null)                 {                     User_ID.Text = _UserId;                     User_Photo.ImageLocation = _Response["photo_max"];                     User_Name.Text = _Response["first_name"];                     User_Surname.Text = _Response["last_name"];                     User_Country.Text = _ApiRequest.GetCountryById(_Response["country"]);                     User_City.Text = _ApiRequest.GetCityById(_Response["city"]);                     Button_GetToken.Visible = false;                 }             }             catch             {              }         }     } } 

Разберём код:

При запуске приложение пытается считать токен и ID пользователя:

StreamReader ControlInf = new StreamReader("UserInf.txt"); _Token = ControlInf.ReadLine(); _UserId = ControlInf.ReadLine(); ControlInf.Close(); 

Если считывание прошло успешно, то приложение пытается произвести запрос информации о пользователе (Проверка токена на валидность):

_ApiRequest = new VkAPI(_Token); string[] Params = { "city", "country", "photo_max" }; _Response = _ApiRequest.GetInformation(_UserId, Params); 

Если запрос успешен, то все поля в форме заполняются и кнопка GetToken становится неактивной:

User_ID.Text = _UserId; User_Photo.ImageLocation = _Response["photo_max"]; User_Name.Text = _Response["first_name"]; User_Surname.Text = _Response["last_name"]; User_Country.Text = _ApiRequest.GetCountryById(_Response["country"]); User_City.Text = _ApiRequest.GetCityById(_Response["city"]); Button_GetToken.Visible = false; 

Иначе кнопка GetToken активна, и при нажатии на неё срабатывает функция:

 private void Button_GetInformation_Click(object sender, EventArgs e)         {             try             {                 StreamReader ControlInf = new StreamReader("UserInf.txt");                 _Token = ControlInf.ReadLine();                 ControlInf.Close();                 _ApiRequest = new VkAPI(_Token);                 _UserId = User_ID.Text;                 string[] Params = { "city", "country", "photo_max" };                 _Response = _ApiRequest.GetInformation(_UserId, Params);                 if (_Response != null)                 {                     User_ID.Text = _UserId;                     User_Photo.ImageLocation = _Response["photo_max"];                     User_Name.Text = _Response["first_name"];                     User_Surname.Text = _Response["last_name"];                     User_Country.Text = _ApiRequest.GetCountryById(_Response["country"]);                     User_City.Text = _ApiRequest.GetCityById(_Response["city"]);                     Button_GetToken.Visible = false;                 }             }             catch             {              }         } 

Теперь разберёмся как происходит GET-запрос. Сначала создаётся переменная:

HttpRequest GetInformation = new HttpRequest(); 

Далее в неё заносятся параметры:

GetInformation.AddUrlParam("user_ids", UserId); GetInformation.AddUrlParam("access_token", _Token); string Params = ""; foreach (string i in Fields) {     Params += i + ","; } Params = Params.Remove(Params.Length - 1); GetInformation.AddUrlParam("fields", Params); 

И производится GET-запрос:

string Result = GetInformation.Get(__VKAPIURL + "users.get").ToString(); 

Результат обрезается до строки, которую можно конвертировать:

Result = Result.Substring(13, Result.Length - 15); 

Происходит конвертация json в словарь:

Dictionary<string, string> Dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(Result); 

Приложение готово! Хоть оно и небольшое, но оно даёт представление о работе с API «ВКонтакте» на C#. Всем спасибо за внимание! Я готов выслушать ваши замечания.
ссылка на оригинал статьи https://habrahabr.ru/post/314518/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *