拉RSS订阅来自Facebook页

问题描述:

我需要帮助拉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'的元素不是允许的提要格式。

感谢

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

它使用Gregorys码以上时,如果你改变了饲料格式atom10而不是rss20工作。 更改URL:

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

在我的情况还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; 
    }