Как стать автором
Обновить

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

Принцип работы с UserAPI заключается в HTTP-запросе клиента к серверу и получение от него ответа в виде JSON-массива. Для обработки данных от сервера я использовал библиотеку Json.NET.
Итак, приступим :)

Все запросы выполняются методом GET с отсылкой идентификатор сессии (sid), его мы получаем при авторизации. Создадим новый класс UserAPI. В конструктор класса добавим всё необходимое для получения sid.
  1. // Сюда будем слать HTTP-запрос для авторизации
  2. const string l = "login.userapi.com/auth?login=force&site=2";
  3. // А сюда для получения данных
  4. const string d = "userapi.com/data?";
  5.  
  6. string sid = string.Empty;
  7.  
  8. public UserAPI(string Email, string Pass)
  9. {
  10.     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(l + "&email=" + Email + "&pass=" + Pass);
  11.     request.Method = "GET";
  12.     /* Отключаем автоматическу переадресацию,
  13.      * т.к sid передаётся в заголовке Location */
  14.     request.AllowAutoRedirect = false;
  15.     HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  16.     sid = response.Headers.Get("Location");
  17.     /* Пример значения заголовка Location:
  18.      * durov.ru/index.html#;sid=c9858c2feaa17203fa87e6b8c2371380
  19.      * Читаем последние 32 символа с конца и получаем заветный sid :)*/
  20.     sid = sid.Substring(sid.Length - 32);
  21. }


Теперь создадим метод Request, с помощью него мы будем отсылать запрос к серверу и получать от него ответ.
  1. private string Request(string r)
  2. {
  3.     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(d + r);
  4.     request.Method = "GET";
  5.     HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  6.     Stream responseStream = response.GetResponseStream();
  7.     StringBuilder sb = new StringBuilder();
  8.     int count = 0;
  9.     byte[] buf = new byte[1024];
  10.     do
  11.     {
  12.         count = responseStream.Read(buf, 0, buf.Length);
  13.         /* Ответ от сервера приходит в кодировке UTF-8 */
  14.         sb.Append(Encoding.UTF8.GetString(buf, 0, count));
  15.     }
  16.     while (count > 0);
  17.     return sb.ToString();
  18. }


Для получения списка друзей пользователя:

1. Создаём класс Friend:
  1. public class Friend
  2. {
  3.     public int Id = 0;
  4.     public string Name = null;
  5.     public string PicUrl = null;
  6.     public bool Online = false;
  7. }


2. И метод UserFriends, который принимает в качестве аргумента Id пользователя, список друзей которого мы хотим получить, номер начального и конечного элемента:
  1. public Friend[] UserFriends(int Id, int From, int To)
  2. {
  3.     ArrayList tmp = new ArrayList();
  4.     string req = Request("act=friends&from=" + From
  5.                       + "&to=" + To
  6.                       + "&id=" + Id
  7.                       + "&sid=" + sid);
  8.     ArrayList al = JsonConvert.DeserializeObject<ArrayList>(req);
  9.     Friend[] f = new Friend[al.Count];
  10.     JArray ja;
  11.     for (int i = 0; i < al.Count; i++)
  12.     {
  13.         ja = (JArray)al[i];
  14.         f[i] = new Friend();
  15.         /* id пользователя */
  16.         f[i].Id = (int)ja[0];
  17.         /* Имя и фамилия */
  18.         f[i].Name = (string)ja[1];
  19.         /* URL фотографии */
  20.         f[i].PicUrl = (string)ja[2];
  21.         /* Если 1, то пользователь Online */
  22.         f[i].Online = (int)ja[3] == 1;
  23.     }
  24.     return f;
  25. }


Добавим возможность чтения статуса пользователя:

1. Создадим интерфейс Status:
  1. public interface Status
  2. {
  3.     int UserID { get; }
  4.     string UserName { get; }
  5.     DateTime Date { get; }
  6.     string StatusText { get; }
  7. }


2. Класс JsonData, реализующий интерфейс Status:
  1. class JsonData : Status
  2. {
  3.     public int UserID { get { return _UserID; } }
  4.     public string UserName { get { return _UserName; } }
  5.     public DateTime Date { get { return _Date; } }
  6.     public string StatusText { get { return _StatusText; } }
  7.  
  8.     public int _UserID = 0;
  9.     public string _UserName = null;
  10.     public DateTime _Date = DateTime.Now;
  11.     public string _StatusText = null;
  12.     /* Общее количество обновлений статуса. */
  13.     public int n = 0;
  14.     /* Массив с запрошенными обновлениями статуса.
  15.      * Мы запрашиваем с 0-ого по 1-ый(не включительно)*/
  16.     public ArrayList d = new ArrayList();
  17.  
  18.     DateTime date = DateTime.Parse("1/1/1970");
  19.  
  20.     public Status Processing()
  21.     {
  22.         try
  23.         {
  24.             JArray ja = (JArray)d[0];
  25.             /* id обновившего статус */
  26.             _UserID = (int)ja[1];
  27.             /* Имя обновившего статус */
  28.             _UserName = (string)ja[3];
  29.             /* Дата обновления статуса (Unix time) */
  30.             _Date = date.AddSeconds((int)ja[4]);
  31.             /* Текст обновления */
  32.             _StatusText = (string)ja[5];
  33.         }
  34.         catch { }
  35.         return (Status)this;
  36.     }
  37. }


3. И создадим метод ReadStatus:
  1. public Status ReadStatus(int Id)
  2. {
  3.     string req = Request("act=activity&from=0&to=1&id=" + Id + "&sid=" + sid);
  4.     JsonData jd = JsonConvert.DeserializeObject<JsonData>(req);
  5.     return jd.Processing();
  6. }



Ну вот и всё.
  1. UserAPI u = new UserAPI(email, pass);
  2. string s = string.Empty;
  3. foreach (Friend f in u.UserFriends(id, 1, 1000))
  4. {
  5.     s = u.ReadStatus(f.Id).StatusText;
  6.     Console.WriteLine("UserID: " + f.Id
  7.                    + " UserName: " + f.Name
  8.                    + " UserStatus: " + s);
  9. }


Подобными методами можно использовать и остальные возможности UserAPI, описание которых можно посмотреть в документации.

______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.