Получить 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" не является допустимым форматом канала.
Спасибо
3 ответа
В этом случае 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, но предлагаемое изменение должно одинаково хорошо работать на других сайтах, которые соответствуют вашей текущей реализации.
Это работает при использовании кода Грегориса выше, если вы измените формат подачи на atom10 вместо rss20. Измените URL:
string url =
"https://www.facebook.com/feeds/page.php?id=40796308305&format=atom10";
В моем случае также трудно было использовать фид Facebook, и затем я пытаюсь с помощью feedburner записать фид на мою страницу в фейсбуке. 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;
}