Для новачків. Робота з 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Ця форма складається з елемента веб-Браузера з параметром 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-браузером, в браузері відкривається ссылка:
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);
Словник<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);
Словник<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);
Словник<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 = { "центр", "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["центр"]);
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 = { "центр", "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["центр"]);
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 = { "центр", "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["центр"]);
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 = { "центр", "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["центр"]);
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#. Всім дякую за увагу! Я готовий вислухати ваші зауваження.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.