酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Twitterのパブリック・タイムラインを表示する

この記事は、今現在にリリースされている最新の「Windows 8 Release Preview(Build 8400)」、「Visual Studio 2012 RC」を利用しております。「Windows 8 Release Preview」は開発中のものであることにご留意ください。

Windows.Data.Json名前空間のJsonArrayクラスを使って、JSONデータをパースする」のTipsを使って、Twitterのパブリック・タイムラインから情報を取得してみましょう。取得したデータをListViewで表示してみましょう。

取得したパブリック・タイムラインを表示するために、アカウントのサムネイル画像とScreenName、ツイートの内容を表示するListViewを定義します。

<Page
    x:Class="JsonReadSample.MainPage"
    IsTabStop="false"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:JsonReadSample"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">

        <StackPanel>
            <Button x:Name="btnReadTwitter" Content="read twitter" Click="btnReadTwitter_Click" />
        </StackPanel>
  
        <ListView x:Name="listView" HorizontalAlignment="Left" Margin="188,0,0,0" VerticalAlignment="Stretch" Width="366">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{Binding ProfileImageUrl}" Width="100" Height="100" Stretch="Uniform"></Image>
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="{Binding ScreenName}" />
                            <TextBlock Text="{Binding Text}" />
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

ツイートを表示させるためのTweetクラスを定義します。

    public class Tweet
    {
        public string Text { get; set; }
        public string ScreenName { get; set; }
        public string ProfileImageUrl { get; set; }
    }

Twitterのパブリック・タイムラインは、HttpClientクラスを使って取得しています。

HttpClientクラスの使い方は、「HttpClientを使ってReferrer等のリクエストヘッダを指定してインターネット上のリソースへアクセスする」にて軽く触れていますのでご覧ください。

private async void btnReadTwitter_Click(object sender, RoutedEventArgs e)
{
    // Twitterのpublicタイムラインからデータを取得する
    var pubtl = new Uri(@"http://api.twitter.com/1/statuses/public_timeline.json?lang=ja");
    var client = new HttpClient();
    var result = await client.GetStringAsync(pubtl);

    // レスポンスを解析して一覧に追加
    var array = default(JsonArray);
    var isSuccess = JsonArray.TryParse(result, out array);
    if (!isSuccess)
    {
        var dialog = new MessageDialog(@"JSONパースに失敗しました");
        await dialog.ShowAsync();
        return;
    }

    // パースしたデータから表示用にTweetクラスに変換する
    var tweets = array.Select(item =>
    {
        var tweet = new Tweet();

        var obj = item.GetObject();
        tweet.Text = obj.GetNamedString("text");

        var user = obj.GetNamedObject("user");
        tweet.ScreenName = user.GetNamedString("screen_name");
        tweet.ProfileImageUrl = user.GetNamedString("profile_image_url_https");

        return tweet;
    });

    // 
    listView.ItemsSource = tweets;
}