Twitter has a flexible collection of mechanisms for accessing information in a variety of formats such as a simplified RSS style XML feed or a plain XML feed that provides a richer set of information about a user and their updates. I am going to use the latter, although for brevity I am just going to pull the date, message and user from the user_timeline method which can be retrieved from http://twitter.com/statuses/user_timeline/user_id.xml (replacing user_id with your twitter handle). To read this information I am going to use LINQ to XML (available in the .NET Framework Version 3.5) as this API simplifies working with XML data without having to use additional language syntax like XPath. Finally, to format the output I am going to bind the data to a Repeater Control (which will reside in a web user control that we can set properties on).
Create a new web user control:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="BirdSeed.ascx.vb" Inherits="BirdSeed" %> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <p> <asp:Label ID="NameLabel" runat="server" Text='<%#Eval("Name")%>'></asp:Label> <br /> <asp:Label ID="DateCreatedLabel" runat="server" Text='<%#Eval("DateCreated", "{0:dd/MM/yyyy HH:mm}")%>'></asp:Label> <br /> <asp:Label ID="MessageLabel" runat="server" Text='<%#Eval("Message")%>'></asp:Label> </p> </ItemTemplate> </asp:Repeater>
Add a UserID property to the user control's code behind and launch the request in its Page_Load method:
Imports System.Net Imports System.Xml Imports System.Xml.Linq Imports System.Linq Partial Class BirdSeed Inherits System.Web.UI.UserControl Dim _UserID As String = Nothing Public Property UserID() As String Get Return _UserID End Get Set(ByVal value As String) _UserID = value End Set End Property Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then Dim url As String = String.Format("http://twitter.com/statuses/user_timeline/{0}.xml", UserID) Using wr As WebResponse = WebRequest.Create(url).GetResponse() Using reader As XmlReader = XmlReader.Create(wr.GetResponseStream()) Dim xDoc As XDocument = XDocument.Load(reader) Dim query = From el In xDoc.Descendants("status") _ Select New With { _ .DateCreated = ParseDateTime(GetValue(el, "created_at")), _ .Message = ParseLinks(GetValue(el, "text")), _ .Name = GetUserName(el) _ } Repeater1.DataSource = query.ToList Repeater1.DataBind() End Using End Using End If End Sub Private Function GetUserName(ByVal element As XContainer) As String Dim query = From el In element.Descendants("user") _ Select New With { _ .Name = GetValue(el, "name") _ } Return query.ToList.Item(0).Name End Function Private Function GetValue(ByVal element As XContainer, ByVal key As String) As String Dim el = element.Element(key) Return If(el Is Nothing, "", el.Value) End Function Public Shared Function ParseDateTime(ByVal dt As String) As DateTime Dim dayOfWeek As String = dt.Substring(0, 3).Trim() Dim month As String = dt.Substring(4, 3).Trim() Dim dayInMonth As String = dt.Substring(8, 2).Trim() Dim time As String = dt.Substring(11, 9).Trim() Dim offset As String = dt.Substring(20, 5).Trim() Dim year As String = dt.Substring(25, 5).Trim() Return DateTime.Parse(String.Format("{0}-{1}-{2} {3}", dayInMonth, month, year, time)) End Function Private Function ParseLinks(ByVal text As String) As String Dim pattern As String = "(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?" Dim matchDelegate As New MatchEvaluator(AddressOf LinkMatchHandler) Dim regx As Regex = New Regex(pattern, RegexOptions.IgnoreCase) Return regx.Replace(text, matchDelegate) End Function Private Function LinkMatchHandler(ByVal m As Match) As String Return String.Format("<a href=""{0}"">{0}</a>", m) End Function End Class
Finally, register the user control on your application page and make an instance of it (passing along a twitter handle in the UserID property).
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> <%@ Register TagPrefix="uc" TagName="BirdSeed" Src="~/BirdSeed.ascx" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Bird Seed</title> </head> <body> <form id="form1" runat="server"> <div> <uc:BirdSeed ID="BirdSeed1" runat="server" UserID="dgzyky" /> </div> </form> </body> </html>
You can limit the number of results by simply setting the repeaters data source like so:
Repeater1.DataSource = query.Take(5).ToList
There you have it, a simple tweet reader using ASP.NET, LINQ to XML and the Repeater Control.