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」の要素は、許可されたフィード形式ではありません。

ありがとう

4

3 に答える 3

10

Facebook は、XmlReader によって提供されるユーザー エージェントを好まないため、このインスタンスで HTML を返します。カスタマイズできないため、フィードを取得するには別のソリューションが必要になります。これで問題が解決するはずです:

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 の動作ですが、提案された変更は、現在の実装で問題ない他のサイトでも同様に機能するはずです。

于 2011-06-09T15:17:11.367 に答える
2

フィード形式を rss20 ではなく atom10 に変更すると、上記の Gregorys コードを使用するときに機能します。URL を変更します。

string url = 
"https://www.facebook.com/feeds/page.php?id=40796308305&format=atom10";
于 2011-09-23T17:06:53.643 に答える
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;
   }
于 2011-11-19T10:17:44.533 に答える