2011-06-09 49 views
6

我需要幫助拉RSS提要,從一個Facebook頁面,我用下面的代碼,但它不斷給我一個錯誤:拉RSS訂閱來自Facebook頁

string url = 
    "https://www.facebook.com/feeds/page.php?id=40796308305&format=rss20"; 

XmlReaderSettings settings = 
    new XmlReaderSettings 
        { 
         XmlResolver = null, 
         DtdProcessing=DtdProcessing.Parse, 

        }; 
XmlReader reader = XmlReader.Create(url,settings); 

SyndicationFeed feed = SyndicationFeed.Load(reader); 

foreach (var item in feed.Items) 
{ 
    Console.WriteLine(item.Id); 
    Console.WriteLine(item.Title.Text); 
    Console.WriteLine(item.Summary.Text); 

} 

if (reader != null) reader.Close(); 

該代碼可以完美地與任何博客或頁面rss,但與Facebook rss它給了一個異常,並帶有以下消息

具有名稱'html'和命名空間'http://www.w3.org/1999/xhtml'的元素不是允許的提要格式。

感謝

回答

10

Facebook將在這種情況下返回HTML,因爲它不喜歡通過的XmlReader提供的用戶代理。由於您無法對其進行自定義,因此您需要一個不同的解決方案來抓取Feed。這應該解決您的問題:

var req = (HttpWebRequest)WebRequest.Create(url); 
req.Method = "GET"; 
req.UserAgent = "Fiddler"; 

var rep = req.GetResponse(); 
var reader = XmlReader.Create(rep.GetResponseStream()); 

SyndicationFeed feed = SyndicationFeed.Load(reader); 

這是嚴格的Facebook的行爲,但所提出的改變應該同樣適合那些好與您當前執行的其他網站。

+0

考慮您的用戶代理設置爲通過Firefox或Chrome中使用的一個 – Kurru 2011-06-09 15:20:48

+0

感謝格雷戈裏,Kurru爲您answers.I都嘗試解決方案,但現在我得到一個不同的異常,這是「‘元素’是無效XmlNodeType」。我覺得Facebook的飼料格式不能使用syndicationFeed類@至少在目前進行解析。 – Yassmeen 2011-06-12 09:10:54

+0

在這一點(這行)不例外發生的?我想我們可以用更多的工作來追蹤這一個。 – 2011-06-13 00:34:52

2

它使用Gregorys碼以上時,如果你改變了飼料格式atom10而不是rss20工作。 更改URL:

string url = 
"https://www.facebook.com/feeds/page.php?id=40796308305&format=atom10"; 
1

在我的情況還Facebook的飼料難以消耗,然後我用Feedburner的嘗試刻錄進我的Facebook頁面。 Feedburner以Atom1.0格式爲我生成Feed。然後我成功:)與system.syndication類我的代碼消耗,這是:

string Main() 
    { 
     var url = "http://feeds.feedburner.com/Per.........all"; 


     Atom10FeedFormatter formatter = new Atom10FeedFormatter(); 
     using (XmlReader reader = XmlReader.Create(url)) 
     { 
      formatter.ReadFrom(reader); 
     } 
     var s = ""; 
     foreach (SyndicationItem item in formatter.Feed.Items) 
     { 
      s+=String.Format("[{0}][{1}] {2}", item.PublishDate, item.Title.Text, ((TextSyndicationContent)item.Content).Text); 
     } 

     return s; 
    }