Twitter API Atom Aggregator with C#

360 views Asked by At

My issue is that I have inherited the launch of a site which has a Twitter feed ticker placed as an absolute footer on the page. The administration has decided they do not want any retweets or @mentions included in the feed. I can see the feed is being aggregated through Atom RSS. I have attempted to just change the search terms, and the twitter URL in the C# code, and the whole site crashes.

Unfortunately, I am completely unfamiliar in C#, so my ability to modify this code is limited, at best.

The web site is constructed with includes for the header, footer, twitter bar, etc.

Furthermore, the projected launch for the site is this evening at COB, so drafting another plug-in from scratch is not really an option.

The ticker is called to the page with this (The code is missing its opening and closing comment brackets so it would display here):

com.omniupdate.div label="ticker" path="/z-omniupdate/fakes/bfeo/2012/ticker.html"      
bf2012:ticker runat="server"     
/com.omniupdate.div 

The CSS is:

    #ticker{
    width: 100%;
    height: 43px;
    border-top: 1px solid #939241;
    background: #bdcc2a url('/bfeo/2012/img/tweet-bg.gif') 0 0 repeat-x;
    background: -moz-linear-gradient(#bdcc2a, #a9b625);
    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#a9b625), to(#e4c595));
    background: -webkit-linear-gradient(#bdcc2a, #a9b625); 
    background: -o-linear-gradient(#bdcc2a, #a9b625);
    position:fixed;
    z-index: 1000;
    bottom: 0;
}
    #ticker p{
        font-size: 15px;
        color: #fff;
        text-transform: uppercase;
        float: left;
        line-height: 43px;
        margin-right: 10px;
    }
.ticker-engage {
    list-style: none;
    padding: 0;
    margin: 8px 0 0 0;
    width: 108px;
    height: 28px;
    float: left;
}
    .ticker-engage li{
        display: inline;    
    }
    .ticker-engage li a{
        height: 28px;
        width: 28px;
        text-indent: -9999px;
        float: left;
        margin: 0 2px 0 0;
    }
    .ticker-engage  li a.twitter{
        background: url('/bfeo/2012/img/twitter-sm.png') 0 0 no-repeat;
    }
    .ticker-engage  li a.facebook{
        background: url('/bfeo/2012/img/facebook-sm.png') 0 0 no-repeat;
    }
    .ticker-engage  li a.youtube{
        background: url('/bfeo/2012/img/youtube-sm.png') 0 0 no-repeat;
    }
 #tweetlist{
    list-style: none;
    padding: 7px 20px 0 20px;
    height: 36px;
    width: 666px;
    float: left;
    background: url('/bfeo/2012/img/tweet-bg.gif') 0 0 repeat-x;
    background: -moz-linear-gradient(#aab726, #98a322);
    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#aab726), to(#98a322));
    background: -webkit-linear-gradient(#aab726, #98a322); 
    background: -o-linear-gradient(#aab726, #98a322);
    font-size: 12px;
}
     #tweetlist li{
        display: inline;    
    }
     #tweetlist li a:link,  #tweetlist li a:visited{
        color: #fff;
        text-decoration: none;
        font-weight: normal;
    }
     #tweetlist li a:hover, #tweetlist li a:focus{
        text-decoration: underline;
    }
     #tweetlist li span{
            color: #ffe400; 
     }

Ticker.ascx:

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="ticker.ascx.cs" Inherits="bf_controls_ticker" %>
<div id="ticker">
    <div class="wrapper clearfix">
        <p>Engage with us</p>
        <ul class="ticker-engage">
            <li><a class="facebook" target="_blank" href="http://www.facebook.com/booththinking">
                Facebook</a></li>
            <li><a class="twitter" target="_blank" href="http://twitter.com/booththinking">Twitter</a></li>
            <li><a class="youtube" target="_blank" href="http://www.youtube.com/user/BoothThinking">
                Youtube</a></li>
        </ul>
        <form id="form1" runat="server">
        <div>
            <ul id="tweetlist">
                <asp:Literal ID="Literal1" runat="server"></asp:Literal>
            </ul>
        </div>
        </form>
    </div>
</div>

ticker.ascx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml;
using System.Text;

public partial class bf_controls_ticker : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(HttpGet("http://search.twitter.com/search.atom?q=booththinking"));
        XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
        ns.AddNamespace("at", "http://www.w3.org/2005/Atom");
        ns.AddNamespace("twitter", "http://api.twitter.com/");
        XmlNodeList entries = doc.DocumentElement.SelectNodes("//at:entry", ns);
        //Response.Write(entries.Count);
        StringBuilder sb = new StringBuilder();
        foreach (XmlNode node in entries)
        {
            sb.Append(String.Format("<li><span>{2}:</span> <a href=\"{0}\">{1}</a></li>", node.ChildNodes[2].Attributes["href"].Value, node.ChildNodes[3].InnerText, node.LastChild.FirstChild.InnerText.Split(' ')[0]));
        }
        Literal1.Text = sb.ToString();
    }

    private string HttpGet(string URI)
    {
        System.Net.WebRequest req = System.Net.WebRequest.Create(URI);

        System.Net.WebResponse resp = req.GetResponse();
        if (resp == null) return null;

        System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
        string responsexml = sr.ReadToEnd().Trim();
        sr.Close();

        return responsexml;
    }
}
1

There are 1 answers

0
Gravypower On

If I understand you correctly you could just check the string for the pattern you are trying to skip.

In your for each loop try something like this:

foreach (XmlNode node in entries)
{
    var content = node.SelectSingleNode("at:content", ns).InnerText;

    if(!content.ToLower().Contains("@somename"))
    {
        sb.Append(String.Format("<li><span>{2}:</span> <a href=\"{0}\">{1}</a></li>", node.ChildNodes[2].Attributes["href"].Value, node.ChildNodes[3].InnerText, node.LastChild.FirstChild.InnerText.Split(' ')[0]));
    }
}

have a look at regular expressions for more complicated pattern matching