Принцип работы с UserAPI заключается в HTTP-запросе клиента к серверу и получение от него ответа в виде JSON-массива. Для обработки данных от сервера я использовал библиотеку Json.NET.
Итак, приступим :)
Все запросы выполняются методом GET с отсылкой идентификатор сессии (sid), его мы получаем при авторизации. Создадим новый класс UserAPI. В конструктор класса добавим всё необходимое для получения sid.
Итак, приступим :)
Все запросы выполняются методом GET с отсылкой идентификатор сессии (sid), его мы получаем при авторизации. Создадим новый класс UserAPI. В конструктор класса добавим всё необходимое для получения sid.
- // Сюда будем слать HTTP-запрос для авторизации
- const string l = "login.userapi.com/auth?login=force&site=2";
- // А сюда для получения данных
- const string d = "userapi.com/data?";
-
- string sid = string.Empty;
-
- public UserAPI(string Email, string Pass)
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(l + "&email=" + Email + "&pass=" + Pass);
- request.Method = "GET";
- /* Отключаем автоматическу переадресацию,
- * т.к sid передаётся в заголовке Location */
- request.AllowAutoRedirect = false;
- HttpWebResponse response = (HttpWebResponse)request.GetResponse();
- sid = response.Headers.Get("Location");
- /* Пример значения заголовка Location:
- * durov.ru/index.html#;sid=c9858c2feaa17203fa87e6b8c2371380
- * Читаем последние 32 символа с конца и получаем заветный sid :)*/
- sid = sid.Substring(sid.Length - 32);
- }
Теперь создадим метод Request, с помощью него мы будем отсылать запрос к серверу и получать от него ответ.
- private string Request(string r)
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(d + r);
- request.Method = "GET";
- HttpWebResponse response = (HttpWebResponse)request.GetResponse();
- Stream responseStream = response.GetResponseStream();
- StringBuilder sb = new StringBuilder();
- int count = 0;
- byte[] buf = new byte[1024];
- do
- {
- count = responseStream.Read(buf, 0, buf.Length);
- /* Ответ от сервера приходит в кодировке UTF-8 */
- sb.Append(Encoding.UTF8.GetString(buf, 0, count));
- }
- while (count > 0);
- return sb.ToString();
- }
Для получения списка друзей пользователя:
1. Создаём класс Friend:
- public class Friend
- {
- public int Id = 0;
- public string Name = null;
- public string PicUrl = null;
- public bool Online = false;
- }
2. И метод UserFriends, который принимает в качестве аргумента Id пользователя, список друзей которого мы хотим получить, номер начального и конечного элемента:
- public Friend[] UserFriends(int Id, int From, int To)
- {
- ArrayList tmp = new ArrayList();
- string req = Request("act=friends&from=" + From
- + "&to=" + To
- + "&id=" + Id
- + "&sid=" + sid);
- ArrayList al = JsonConvert.DeserializeObject<ArrayList>(req);
- Friend[] f = new Friend[al.Count];
- JArray ja;
- for (int i = 0; i < al.Count; i++)
- {
- ja = (JArray)al[i];
- f[i] = new Friend();
- /* id пользователя */
- f[i].Id = (int)ja[0];
- /* Имя и фамилия */
- f[i].Name = (string)ja[1];
- /* URL фотографии */
- f[i].PicUrl = (string)ja[2];
- /* Если 1, то пользователь Online */
- f[i].Online = (int)ja[3] == 1;
- }
- return f;
- }
Добавим возможность чтения статуса пользователя:
1. Создадим интерфейс Status:
- public interface Status
- {
- int UserID { get; }
- string UserName { get; }
- DateTime Date { get; }
- string StatusText { get; }
- }
2. Класс JsonData, реализующий интерфейс Status:
- class JsonData : Status
- {
- public int UserID { get { return _UserID; } }
- public string UserName { get { return _UserName; } }
- public DateTime Date { get { return _Date; } }
- public string StatusText { get { return _StatusText; } }
-
- public int _UserID = 0;
- public string _UserName = null;
- public DateTime _Date = DateTime.Now;
- public string _StatusText = null;
- /* Общее количество обновлений статуса. */
- public int n = 0;
- /* Массив с запрошенными обновлениями статуса.
- * Мы запрашиваем с 0-ого по 1-ый(не включительно)*/
- public ArrayList d = new ArrayList();
-
- DateTime date = DateTime.Parse("1/1/1970");
-
- public Status Processing()
- {
- try
- {
- JArray ja = (JArray)d[0];
- /* id обновившего статус */
- _UserID = (int)ja[1];
- /* Имя обновившего статус */
- _UserName = (string)ja[3];
- /* Дата обновления статуса (Unix time) */
- _Date = date.AddSeconds((int)ja[4]);
- /* Текст обновления */
- _StatusText = (string)ja[5];
- }
- catch { }
- return (Status)this;
- }
- }
3. И создадим метод ReadStatus:
- public Status ReadStatus(int Id)
- {
- string req = Request("act=activity&from=0&to=1&id=" + Id + "&sid=" + sid);
- JsonData jd = JsonConvert.DeserializeObject<JsonData>(req);
- return jd.Processing();
- }
Ну вот и всё.
- UserAPI u = new UserAPI(email, pass);
- string s = string.Empty;
- foreach (Friend f in u.UserFriends(id, 1, 1000))
- {
- s = u.ReadStatus(f.Id).StatusText;
- Console.WriteLine("UserID: " + f.Id
- + " UserName: " + f.Name
- + " UserStatus: " + s);
- }
Подобными методами можно использовать и остальные возможности UserAPI, описание которых можно посмотреть в документации.
______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru