A twitter feed is a great way to breath a little life into an otherwise static website. Check out the bottom right corner of my portfolio site as an example.

Update: Twitter upgraded their API to version 1.1. The code in this post no longer works, but you can reference the Twitter feed module that I wrote for SuperFeed to see how to use the new API. Also, I no longer have a twitter feed on my portfolio site.

The Code

So let’s get right to it. With C#, a little LINQ, and the excellent twitter API, something like this is relatively easy to do. Here’s the code (more or less) that I use on my website:

using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

public class TweetLoader
{
  const string ATOM_NAMESPACE = "http://www.w3.org/2005/Atom";
  const string SCREEN_NAME = "lonekorean"; // TODO: your twitter name goes here
  const int NUM_TWEETS = 5;
  const int MAX_ATTEMPTS = 3;

  public static List<string> LoadTweets()
  {
    XNamespace xmlns = ATOM_NAMESPACE;
    XDocument doc = null;

    // defensively attempt to get XML document
    int attempts = 0;
    while (attempts < MAX_ATTEMPTS &&
      (doc == null || doc.ToString().Length == 0))
    {
      attempts++;
      string url = string.Format(
        "http://api.twitter.com/1/statuses/user_timeline.atom" +
        "?screen_name={0}&count={1}", SCREEN_NAME, NUM_TWEETS);
      try
      {
        doc = XDocument.Load(url);
      }
      catch
      {
        // pause half a second before retrying
        System.Threading.Thread.Sleep(500);
      }
    }

    List<string> tweets = new List<string>(NUM_TWEETS);
    if (doc != null && doc.ToString().Length > 0)
    {
      // use linq to translate XML document into a list of strings
      tweets = (
        from item in doc.Descendants(xmlns + "entry")
        select item.Element(xmlns + "title").Value
          .Replace(SCREEN_NAME + ": ", "")
      ).ToList<string>();
    }

    return tweets;
  }
}

The Walkthrough

First things first, you’ll want to change the screen name on line 8, and maybe the values on line 9 and 10 to your liking.

Line 19 sets up a while loop with a defensive try/catch block inside to retry the API request, just because the internet isn’t perfect and you never know when a request will fail. If the max number of attempts is reached without success, the final output will be null, so make sure your code can handle that.

Lines 23-25 are where the magic is. Feel free to test that URL directly in your browser. For more options, refer to the documentation.

Lines 41-45 use LINQ to pull out the actual strings that we want and package them into a tidy list. Oddly enough, every one of these strings is prepended with "lonekorean: " (or your screen name, obviously), so line 44 takes that out for us.

And that’s it. The one thing I got stuck on while coding this was the namespacing for Atom. Notice how I apply it on lines 42 and 43 with “xmlns +”. Just don’t forget that part and you’re golden.