从 Facebook 页面获取 RSS 订阅源

6
我需要帮助从Facebook页面中提取RSS源。我正在使用以下代码,但它一直给我一个错误:
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”不是允许的Feed格式。

谢谢

3个回答

10

在这种情况下,Facebook将返回HTML,因为它不喜欢XmlReader提供的用户代理。由于您无法自定义它,因此您需要另一种解决方法来获取该源。以下解决方案应该可以解决您的问题:

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的一种行为方式,但是所提出的更改对于其他接受当前实现的网站同样有效。


请考虑将您的用户代理设置为 FireFox 或 Chrome 使用的代理。 - Kurru
感谢Gregory和Kurru的回答。我尝试了两种解决方案,但现在我遇到了一个不同的异常,即“'Element'是无效的XmlNodeType”。我认为Facebook的Feed格式目前无法使用SyndicationFeed类进行解析。 - Yassmeen
异常在哪个点(哪一行)发生?我认为我们可以通过更多的工作来追踪这个问题。 - AC2MO
我尝试了这个并得到了完全相同的异常... 我检查了源代码,发现问题出在 <access:restriction relationship="deny" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" /> 这一行。 - edobry

2

如果将提要格式更改为atom10而不是rss20,则可以使用Gregory上面的代码。 更改URL:

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

1
在我的情况下,Facebook的动态也很难消费,然后我尝试使用Feedburner为我的Facebook页面烧录动态。 Feedburner以Atom1.0格式为我生成了动态。然后我成功地使用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;
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接