Pull to refresh

Работа с API ВКонтакте на C#

Reading time 7 min
Views 71K
Приветствую тебя, дорогой читатель! В статье описан процесс создания простейшего WindowsForms приложения, которое будет работать с API социальной сети «ВКонтакте».

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

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

UPD: Репозиторий на GitHub
UPD(26/09/2018): Добавлен параметр 'v' к запросам. Добавлено автозаполнение ID приложения при получении токена. Добавлено предупреждение.
Предупреждение: Используемая версия API — 5.52. На 26/09/2018 последней является 5.85. Начиная с API версии 5.8, программа работать не будет, так как в полях 'city' и 'country' возвращаются объекты, а не числа.

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

  • 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();
        }

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="+ VkAPI.__APPID +"&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=") != -1)
            {
                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;
        }

        private void GetToken_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e){}

    }
}

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

При нажатии на кнопку открывается 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
    {
        public const string __APPID = "APPLICATION_ID";  //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);
            GetInformation.AddUrlParam("v", "5.52");
            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);
            GetCityById.AddUrlParam("v", "5.52");
            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);
            GetCountryById.AddUrlParam("v", "5.52");
            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_1(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_1(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);
GetInformation.AddUrlParam("v", "5.52");
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);

Наше небольшое приложение готово! Всем спасибо за внимание! Я готов выслушать ваши замечания.
Tags:
Hubs:
+7
Comments 14
Comments Comments 14

Articles