logo
Twitter-клиент

3. Конструкторская часть

Приложение состоит из модуля “Program.cs”, который содержит точку входа в программу, класс Twitter, содержащий методы получения ПИН-кода, авторизации и отправки сообщения, а так же модуля “Form.cs”, который содержит функции для чтения своей ленты, ленты другого пользователя, просмотра трендов, своих читателей и пользователей, за лентой которых Вы следите.

Точкой входа в программу является метод Run класса Application, в котором происходит создание основного окна приложения.

Application.Run(new Form1());

Класс Twitter:

public class Twitter

{

public HttpWebRequest Request;//запрос серверу

public HttpWebResponse Response;//ответ сервера

public StreamReader Reader;

//данные для авторизации

public string oauth_token;

public string oauth_token_secret;

public string oauth_callback_confirmed;

public Twitter() { }//конструктор

public string GetPin()//метод для получения ПИН-кода

{

....

}

public string Authorize(string pin)//метод для авторизации

{

....

}

public string SendTwit(string Twit)//метод для отправки сообщения в ленту

{

....

}

Метод public string GetPin() используется для получения ПИН-кода. Он не принимает никаких параметров, а возвращаемым значением является строка, которая содержит уникальный идентификатор авторизации. Внутри метода генерируются необходимые данные для авторизации, формируется запрос на сервер, формируется необходимая строка, которая передается браузеру по умолчанию и ожидается ввод ПИН-кода.

public string GetPin()

{

Uri uri = new Uri("http://api.twitter.com/oauth/request_token");

string consumerKey = "XXX";

string consumerSecret = "XXX";

OAuthBase oAuth = new OAuthBase();

// Генерация необходимых данных

string timeStamp = oAuth.GenerateTimeStamp();

string nonce = oAuth.GenerateNonce();

string normUri;

string normParams;

string sig = oAuth.GenerateSignature(uri, consumerKey, consumerSecret, string.Empty, string.Empty, "GET", timeStamp, nonce, OAuth.OAuthBase.SignatureTypes.HMACSHA1, out normUri, out normParams);

// Формирование и вывод строки запроса

string request_url =

"http://api.twitter.com/oauth/request_token" + "?" +

"oauth_consumer_key=" + consumerKey + "&" +

"oauth_signature_method=" + "HMAC-SHA1" + "&" +

"oauth_signature=" + sig + "&" +

"oauth_timestamp=" + timeStamp + "&" +

"oauth_nonce=" + nonce + "&" +

"oauth_version=" + "1.0";

// Запрос на сервер

Request = (HttpWebRequest)HttpWebRequest.Create(request_url);

Response = (HttpWebResponse)Request.GetResponse();

Response = (HttpWebResponse)Request.GetResponse();

Reader = new StreamReader(Response.GetResponseStream(), Encoding.GetEncoding(1251));

string outline = Reader.ReadToEnd();

char[] delimiterChars = { &, = };

string[] words = outline.Split(delimiterChars);

oauth_token = words[1];

oauth_token_secret = words[3];

oauth_callback_confirmed = words[5];

request_url = "http://api.twitter.com/oauth/authorize?oauth_token=" + oauth_token;

System.Diagnostics.Process.Start(request_url); // Передаём ссылку на страницу браузеру по умолчанию и ждём пока пользователь введёт PIN-код

return oauth_token;

}

Метод public string Authorize(string pin) используется для авторизации пользователя. В качестве параметра принимает строку, содержащую ПИН-код. Возвращаемым значением является имя пользователя. Внутри метода происходит процедура запроса на сервер, получение ответа в виде строки, разбор полученной строки и присвоение значений соответствующим переменным.

public string Authorize(string pin)

{

Uri uri = new Uri("http://api.twitter.com/oauth/request_token");

string consumerKey = "7sm4qTVBxeqlTdv9Syfog";

string consumerSecret = "058PJGiiPs3SClDoDg1cd6fvFqw37Vy8ZXSrpKks5k";

OAuthBase oAuth = new OAuthBase();

string oauth_verifier = pin; // oauth_verifier -- это полученный нами PIN-код.

// Формирование и вывод строки запроса

request_url =

"http://api.twitter.com/oauth/access_token" + "?" +

"oauth_consumer_key=" + consumerKey + "&" +

"oauth_token=" + oauth_token + "&" +

"oauth_signature_method=" + "HMAC-SHA1" + "&" +

"oauth_signature=" + sig + "&" +

"oauth_timestamp=" + timeStamp + "&" +

"oauth_nonce=" + nonce + "&" +

"oauth_version=" + "1.0" + "&" +

"oauth_verifier=" + oauth_verifier;

// Запрос на сервер

Request = (HttpWebRequest)HttpWebRequest.Create(request_url);

Response = (HttpWebResponse)Request.GetResponse();

Reader = new StreamReader(Response.GetResponseStream(), Encoding.GetEncoding(1251));

outline = Reader.ReadToEnd();

// Разбор выданной строки и присвоение значений соответствующим переменным

words = outline.Split(delimiterChars);

oauth_token = words[1];

oauth_token_secret = words[3];

string user_id = words[5];

string screen_name = words[7];

return screen_name;

}

Метод public string SendTwit(string Twit) используется для отправки сообщения в ленту. В качестве параметра принимает строку с сообщением. Возвращаемым значением является строка с текстом “ok” в случае удачного завершения, либо строка с ответом сервера об ошибке.

public string SendTwit(string Twit)

{

OAuthTokens tokens = new OAuthTokens(); // Создаём объект класса

tokens.ConsumerKey = "7sm4qTVBxeqlTdv9Syfog"; //Ввводим Consumer Key

//Вводим Consumer Secret

tokens.ConsumerSecret = "058PJGiiPs3SClDoDg1cd6fvFqw37Vy8ZXSrpKks5k";

//Вводим AccessToken

tokens.AccessToken = "264296709-ZYOQKDXKbXlNcZa7nl1VbR1g3oIZmXwX9b4XlSgA";

//Вводим Access Token Secret

tokens.AccessTokenSecret = "j2BJCq5hwxkIgWslRybLYPzZY4euIiAuYJiFzVrtBY";

//Отправляем сообщение в твиттер

TwitterResponse<TwitterStatus> tweetResponse = TwitterStatus.Update(tokens, Twit);

if (tweetResponse.Result == RequestResult.Success) //Проверка отправки

{

return "ok"; //Сообщение отправилось

}

else

{

return tweetResponse.ErrorMessage; //Сообщение не отправилось

}

}

При нажатии на различные кнопки на форме происходит вызов методов классов библиотеки Twitterizer2.

Кнопка “Timeline”:

UserTimelineOptions opts = new UserTimelineOptions();

opts.IncludeRetweets = true;

opts.UseSSL = true;

opts.Count = 15;

timeline.Clear();

TwitterResponse<TwitterStatusCollection> t = TwitterTimeline.HomeTimeline(tokens, opts);

foreach (TwitterStatus status in t.ResponseObject)

{

timeline.AppendText(status.User.Name + " " + "[" + status.CreatedDate + "] " + status.Text + " ");

}

В данном случае задаются опции новостной ленты и выводятся сообщения пользователей, которых Вы читаете.

Действия для кнопок “Mentions” и “My tweets”, а так же кнопки “Ok” при вводе имени пользователя аналогичны действиям кнопки “Timeline”, но в этих случаях выводятся соответственно сообщения, в которых упоминается Ваш никнейм, Ваши сообщения и сообщения пользователя, имя которого Вы ввели в элемент TextBox.

При нажатии на кнопки “Following” и “Followers” выводятся списки пользователей, которых Вы читаете и которые читают Вас соответственно.

Кнопка “Following”:

int i = 0;

TwitterResponse<TwitterUserCollection> fol = TwitterFriendship.Friends(tokens);

foreach (TwitterUser following in fol.ResponseObject)

{

i++;

}

timeline.AppendText("You follow " + i + " people ");

foreach (TwitterUser following in fol.ResponseObject)

{

timeline.AppendText(following.ScreenName + " ");

}

Кнопка “Followers”:

int i = 0;

TwitterResponse<TwitterUserCollection> fol = TwitterFriendship.Followers(tokens);

foreach (TwitterUser follower in fol.ResponseObject)

{

i++;

}

timeline.AppendText("You have " + i + " followers ");

foreach (TwitterUser follower in fol.ResponseObject)

{

timeline.AppendText(follower.ScreenName+" ");

}

При нажатии на кнопку “Trends” выводятся текущие тренды.

System.Net.WebRequest reqGET = System.Net.WebRequest.Create("https://api.twitter.com/1/trends/1.json");

System.Net.WebResponse resp = reqGET.GetResponse();

System.IO.Stream stream = resp.GetResponseStream();

System.IO.StreamReader sr = new System.IO.StreamReader(stream);

string s = sr.ReadToEnd();

int n = s.Length;

char[] str = s.ToCharArray();

int ind = s.IndexOf("name");

string[] find = s.Split(new string[] {"name"}, 10, StringSplitOptions.None);

for (int i = 0; i < 10; i++)

{

int ind1 = find[i].IndexOf("event");

if (ind1 != -1)

{

string a = find[i].Substring(3, ind1-6);

timeline.AppendText(a+" ");

}

Происходит GET-запрос по адресу https://api.twitter.com/1/trends/1.json, читается ответ с сервера, который принимается в строку. Так как список трендов передается в формате JSON, необходимо извлечь из строки названия трендов. Для этого строка разбивается на массив строк, начинающихся с подстроки “name”, после чего в цикле для каждой строки находится подстрока “event” и в текстовое поле записывается текст, который находится между подстроками “name” и “event”.

Видно, что программа позволяет вести непрерывный диалог как с пользователем, который может контролировать приложение, так и с системой, которая посылает разнообразные команды серверу.