最近博客園討論氣氛熱烈,有價值的評論也層出不窮。有時候我們會很希望訂閱某篇文章的評論RSS,只可惜博客園目前沒有這個功能。對於註冊用戶來說,我們可以透過點擊評論框下方的「訂閱回應」鏈接,這樣就會在出現新評論的時候收到郵件。可惜匿名用戶,只好不斷刷新才能關注最近討論到什麼地方了。不過我們是什麼人?我們是程式設計師,這點障礙對我們來說應該是簡單不過的小事了。自己搭一個站點,取得頁面數據,分析HTML,輸出為RSS,就這麼簡單。
老趙為此作了一個最簡單的範例,可以訂閱http://jeffreyzhao.cnblogs.com上任一篇文章的評論。由於只是簡單的個人工具程序,所以完全不考慮性能、伸縮性、擴展性,容錯性,也拋棄任何的單元測試,依賴注入等“最佳實踐” 。總之一句話,怎麼容易怎麼來。
這個範例由兩部分組成,第一部分是個靜態HTML頁面,根據文章URL產生並轉向其RSS連結。寥寥數行HTML和JavaScript:
<html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>博客园RSS</title> <script language="javascript" type="text/javascript"> function goToCommentRss(url) { window.location = "CommentRss.ashx?url=" + encodeURIComponent(url); } </script> </head> <body> <textarea id="url" cols="50" rows="10"></textarea><br /> <input type="button" value="Comment RSS" onclick="goToCommentRss(document.getElementById('url').value)" /> </body> </html>
CommentRss.ashx將為我們輸出評論的RSS。它的程式碼如下:
public class CommentRss : IHttpHandler{ public void ProcessRequest(HttpContext context) { string url = context.Request.QueryString["url"]; WebClient webClient = new WebClient(); webClient.Encoding = Encoding.UTF8; string html = webClient.DownloadString(url); context.Response.ContentType = "text/xml"; context.Response.ContentEncoding = Encoding.UTF8; SyndicationFeed feed = GetRssFeed(url, html); Rss20FeedFormatter rssFormatter = new Rss20FeedFormatter(feed); XmlWriter rssWriter = XmlWriter.Create(context.Response.Output); rssFormatter.WriteTo(rssWriter); rssWriter.Close(); } private static SyndicationFeed GetRssFeed(string url, string html) { ... } public bool IsReusable { get { return false; } } }
其實.NET框架已經為我們準備了太多太多有用的工具,我們只需要將它們拼接起來。例如有了WebClient類,三行程式碼便可下載到頁面的HTML。然後我們透過GetRssFeed方法來取得一個SyndicationFeed物件,再透過Rss20FeedFormatter輸出。 SyndicationFeed和Rss20FeedFormatter都是.NET 3.5中自帶的類別庫,放在System.ServiceModel.dll程式集中的System.ServiceModel.Syndication命名空間裡,可以方便讀取或產生Atom 1.0或RSS 2.0格式的XML為我們所用。更多資訊可以參考InfoQ中文站的這篇報告:WCF的Web程式設計模型資源。
GetRssReed的關鍵在於分析HTML字串,老趙在這裡使用了正規表示式匹配出每條評論的標題、URL、時間、使用者和內容。然後建構出一個SyndicationFeed物件就再簡單不過了。可惜的是,博客園不同模板的HTML不同,因此老趙的這個範例只支援現在用的這個模板。您可以自行改造,例如為CommentRss.ashx增加一個新的參數,用來指稱HTML的解析方式,便可以用於多個模板了。
這個範例使用起來也非常簡單,您可以將其編譯或部署在本地的IIS上,打開Default.html頁面,將文章的URL複製進去,如《老趙談IL(2)》一文的URL:
點選按鈕,便會連結至RSS頁。於是在IE中便會展示為:
此時您只要把URL放入本地的RSS閱讀器即可。因為程式部署在您的機器上,因此您無法使用Google Reader等工具進行訂閱。如果您有條件的話,把它們放到虛擬空間等地方即可。由於您的程式只為您一個人服務,因此不會佔用大量資源,目前的寫法也足夠了。
我們是程式設計師。自己動手,豐衣足食。
【相關推薦】
1. RSS高效率入門教學
#以上是手動產生評論RSS的程式碼實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!