Задачи приложения:
- Получить User Token и выполнять все дальнейшие запросы с помощью него.
- Получить на вход ID пользователя.
- Вывести информацию о пользователе с введённым ID.
Для удобства я буду использовать две библиотеки:
Первое, что необходимо сделать — это получить ID приложения. Для этого нужно зайти на VkDevelopers, создать новое Standalone приложение, зайти в его настройки и скопировать ApplicationID.
Можно приступать к созданию приложения, заходим в VisualStudio и создаём новое WindowsForms приложение.
Install-Package Newtonsoft.Json
Для подключения библиотеки xNet нам потребуется зайти сюда, скачать xNet.dll и добавить его в проект с помощью менеджера ссылок.
После подключения библиотек создаём две формы: MainForm (Можно использовать стандартную Form1) и AuthorizationForm. Формы выглядят так:
Создадим ещё один файл класса. Назовём его 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#. Всем спасибо за внимание! Я готов выслушать ваши замечания.
Комментарии (5)
Begunini
06.11.2016 13:40+1Если честно, представления о работе с API именно вконтакте не появилось — стандартный token flow. И был задействован всего 1 метод. Надеялся на обзор занимательных с точки зрения авторов возможностей API сервиса. В частности, можно сделать пример по интеграции торговли ВКонтакте через собственный шлюз на C# с какой-нибудь CMS с интернет-магазином. Ну или хотя бы с уведомлением в Slack )))
dimkozzz
06.11.2016 15:25+2Присоединяюсь к комментарию dmitry_dvm.
От себя добавлю пару ресурсов:
1. Конвенции по именованиям
2. Туториал о том, что такое и зачем нужены принципы SOLID
Чтобы статья была хоть как-то полезна для новичков, я бы посоветовал после просмотра вышеописанных ресурсов провести рефакторинг кода и выложить на github или другой аналогичный сервис, и ссылку добавить в статью. Ну и реализовать это на WPF и/или UWP для личного опыта. Обработка исключений тоже очень важный аспект, который хоть в каком-то виде должен присутствовать в приведенном коде.DjoNIK
06.11.2016 19:57Я после «от новичка для новичков» сразу к комментариям пролистал — не ошибся ))
DjoNIK
06.11.2016 20:02Уважаемый автор, призываю задуматься в первую очередь о необходимости статья на хабре. Безусловно, конкретно для Вас профит очевиден — неплохой фидбек т сообщества. Но по факту, статью бы спрятать в черновик.
2016 год, если есть очевидная необходимость не в web, а именно desktop, и если уж завязываться только на Windows, то либо UWP, либо WPF (хоть об этом и было выше).
dmitry_dvm
Зачем новичкам WindowsForms, когда UWP шагает по планете, а WPF — стандарт де-факто для десктопа? Именование свойств — смесь верблюда и змеи. MVVM? — не, не слышал.