День двадцать пятый. Twitter API

Вступление

А мы сегодня попробуем научиться получать данные из этого веб-сервиса в своем приложении.

Twitter API

У сервиса Twitter есть свой API, с помощью которого можно получать разлиные данные: число фолловеров, последние записи, контактные данные и т.д. Основная документация по Twitter API находится по адресу http://dev.twitter.com/

Для изучения возьмем шаблон текущей ленты пользователя (например, меня), который можно найти по адресу http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=tehnolog, где вместо моего имени tehnolog вы можете подставить ваше имя, используемое в Twitter. Если вы перейдете по указанной ссылке, то увидите большой XML-документ, содержащий недавние сообщения, которые я послал в Твиттер, а также различные метаданные. Вот отрывок из такого документа (пользователя jeffblankenburg):


<status>
  <created_at>Sun Oct 24 13:30:04 +0000 2010</created_at>
  <id>28594986565</id>
  <text>Day #24: Embedding Fonts in Windows Phone 7 http://bit.ly/wp7day24 #wp7 #wp7dev #31daysofwp7</text>
  <source>
    <a href="http://www.tweetdeck.com" rel="nofollow">TweetDeck</a>
  </source>
  <truncated>false</truncated>
  <favorited>false</favorited>
  <in_reply_to_status_id />
  <in_reply_to_user_id />
  <in_reply_to_screen_name />
  <retweet_count />
  <retweeted>false</retweeted>
  <user>
    <id>5688882</id>
    <name>Jeff Blankenburg</name>
    <screen_name>jeffblankenburg</screen_name>
    <location>Columbus, OH</location>
    <description>I'm a passionate technologist, husband, and father in Columbus, OH. I work for a small software company located in Redmond, WA. #wp7 http://blankensoft.com</description>
    <profile_image_url>http://a3.twimg.com/profile_images/396764567/jeffblankenburgheadshot_normal.jpg</profile_image_url>
    <url>http://www.jeffblankenburg.com</url>
    <protected>false</protected>
    <followers_count>1962</followers_count>
    <profile_background_color>131516</profile_background_color>
    <profile_text_color>333333</profile_text_color>
    <profile_link_color>994700</profile_link_color>
    <profile_sidebar_fill_color>cccccc</profile_sidebar_fill_color>
    <profile_sidebar_border_color>999999</profile_sidebar_border_color>
    <friends_count>652</friends_count>
    <created_at>Tue May 01 15:54:53 +0000 2007</created_at>
    <favourites_count>201</favourites_count>
    <utc_offset>-18000</utc_offset>
    <time_zone>Eastern Time (US & Canada)</time_zone>
    <profile_background_image_url>http://s.twimg.com/a/1287010001/images/themes/theme14/bg.gif</profile_background_image_url>
    <profile_background_tile>true</profile_background_tile>
    <profile_use_background_image>true</profile_use_background_image>
    <notifications>false</notifications>
    <geo_enabled>true</geo_enabled>
    <verified>false</verified>
    <following>true</following>
    <statuses_count>5664</statuses_count>
    <lang>en</lang>
    <contributors_enabled>false</contributors_enabled>
    <follow_request_sent>false</follow_request_sent>
    <listed_count>151</listed_count>
    <show_all_inline_media>false</show_all_inline_media>
  </user>
  <geo />
  <coordinates />
  <place />
  <contributors />
</status>

Важно понимать, что вы имеете дело с обычным XML. Поэтому вы можете работать с ним при помощи стандартных приемов. Аналогично, вы можете работать с XML-документами других веб-сервисов.

Извлечение данных из XML

Получить XML-файл и извлечь из него данные очень просто (три строчки кода!). Только помните про одну важную деталь - убедитесь, что ваш телефон подключен к интернету. Это можно сделать при помощи пространства имен Microsoft.Phone.Net.NetworkInformation:


if (NetworkInterface.GetIsNetworkAvailable())

Внутри данного условия мы создадим новый объект WebClient и сделаем асинхронный вызов к Twitter API через адрес, который давал выше. Сначала мы создадим обработчик события, который будет работать после получения всех данных, а затем сделаем асинхронный вызов. В нашем примере мы будем получать имя пользователя из текстового поля, куда пользователь может ввести любое имя учетной записи Twitter (себя, своих знакомых и т.д).


if (NetworkInterface.GetIsNetworkAvailable())
{
    WebClient twitter = new WebClient();

    twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted);
    twitter.DownloadStringAsync(new Uri("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=" + TwitterNameBox.Text));
}

Когда данные будут получены, то сработает наш обработчик события. Далее нужно что-то делать с полученными данными.

Обработка данных XML

Получив данные, нужно вывести их на экран. В предыдущих примерах я уже показывал, как сделать привязку данных к элементу XAML. Сейчас мы этого делать не будем (впрочем в исходниках к примеру вы найдете и этот способ). А попробуем другой вариант с использованием LINQ.

Для этого добавляем к проекту пространство имен System.Xml.Linq. Далее нам нужно создать объект XElement, который будет содержать наши данные.


XElement xmlTweets = XElement.Parse(e.Result);

Теперь осталось только связать данные со списком ListBox и, используя LINQ, создать объекты TwitterItem на лету из наших данных.


TwitterList.ItemsSource = 
    from tweet in xmlTweets.Descendants("status")
        select new TwitterItem{
            message = tweet.Element("text").Value
                            };

В исходниках к примеру вы можете увидеть, что у нас есть класс TwitterItem, содержащий свойство message. Вот и все! Мы получаем данные, обрабатываем их и выводим их в списке. Для лучшего понимания примера изучите исходник.

Twitter API
Реклама