なか日記

一度きりの人生、楽しく生きよう。

TwitterAPIを使ってみる

 前回、「LinqToTwitterを使ってみる(1) - タイトルは未定」なんて、あたかも(2)に続きそうなタイトルにしてました。
 ところが、ライブラリはあるけど、ドキュメントがあまりないのと、サンプルソースを抜粋してもうまく動かなかったりして、いざ使ってみるとよくわかりません。

 そんなこんなで、まずは直接TwitterAPIを使ってみた方が良いのではないかということでちょこっと使ってみました。

 今回参考にさせてもらったのは - [C#][Twitter]Twitter Web APIを使ってみよう その1 です。

TwitterAPIドキュメント

 公式版(英語): http://apiwiki.twitter.com/Twitter-API-Documentation
 日本語訳 : http://watcher.moe-nifty.com/memo/docs/twitterAPI11.txt
   ※9/5時点の最新版はこれ? http://watcher.moe-nifty.com/memo/docs/twitterAPI31.txt

TwitterAPI用のクラス作成

 まずはTwitterAPIをラップするためのクラスを作成します。
 かずきさんのBlogでは public_timeline を使用されていましたが、今回は friends_timeline を使ってみました。
 ※使い方はどちらも同じですが…
 API叩いて返ってくる情報は多いのですが、とりあえずネタ元と同じくIDとTextのみに絞りました。

    public class Account
    {
        public string UserID { get; set; }
        public string Password { get; set; }
    }

    public class TwitterStatus
    {
        public long ID { get; set; }
        public string Text { get; set; }
    }

    public class TwitterApi
    {
        private const string FriendsTimelineUrl = "http://twitter.com/statuses/friends_timeline.xml";
        private readonly Account _userAccount;
        private readonly WebClient _client = new WebClient();

        public TwitterApi(Account userAccount)
        {
            _userAccount = userAccount;
            _client.Credentials = new NetworkCredential(_userAccount.UserID, _userAccount.Password);
        }

        /// <summary>
        /// XMLデータからタイムラインを取得する
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        private static IEnumerable<TwitterStatus> GetTimeline(XElement xml)
        {
            return from status in xml.Descendants("status")
                   select new TwitterStatus
                   {
                       ID = long.Parse(status.Element("id").Value),
                       Text = status.Element("text").Value
                   };
        }

        /// <summary>
        /// URLからXMLデータを取得する
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        private XElement DownloadXml(string url)
        {
            var data = _client.DownloadData(url);
            return XElement.Parse(Encoding.UTF8.GetString(data));
        }

        /// <summary>
        /// 自分の friend の過去24時間以内に update されたステータスから最大20件を取得する。
        /// </summary>
        /// <returns></returns>
        public IList<TwitterStatus> GetFriendsTimeline()
        {
            var xml = DownloadXml(FriendsTimelineUrl);

            IEnumerable<TwitterStatus> result = GetTimeline(xml);

            return result.ToList();
        }
    }

作成したクラスを使用するコード

 こんな感じで友達の最新20件の発言が取得できます。

    Account account = new Account { UserID = "xxxx", Password = "zzzz" };

    TwitterApi twApi = new TwitterApi(account);   

    IList<TwitterStatus> result = twApi.GetFriendsTimeline();

    result.ToList().ForEach(x => Console.WriteLine("ID:{0} TEXT:{1}", x.ID, x.Text));

ぼやき

 とりあえず今回はTDとTextだけ取得するようにしたけど、最終的には他の値も取得したい。
 そこで悩んでいるのが、データをどう持たせるべきか。
 今の延長で、クラスのリストとした方がのか、でも、画面のコントロールと連動させるなら、DataSetのDataTableとして実走した方が、後々楽な気もするし。

 というわけで、その2に続く(かも?w)