Чтение RSS на C#

21.11.2017 at 21:45

Для чтения RSS на C# есть несколько способов. Традиционный — классы из пространства имен System.ServiceModel.Syndication.
Другим способ является использование библиотеки CodeHollow.FeedReader. Плюсы этой библиотеки:

  • работает под .Net Core, а значит можно использовать на линуксе. В том числе и на любом VPS.
  • умеет искать на странице ссылки на RSS фиды

При чтении RSS нужно определять, какие записи новые, а какие нет. В формате RSS для этого используется свойство Id.

Для чтения RSS, вывода в консоль новых записей в порядке появления и проверке появления новых записей каждую минуту, я написал вот такой класс:

public class FeedProcessor
{
    public string Uri { get; set; }
    private bool started;

    public FeedProcessor(string uri)
    {
        this.Uri = uri;
    }

    public void Start()
    {
        if (!started)
        {
            started = true;
            DoWork();
        }
    }

    private async Task DoWork()
    {
        var feedUris = await FeedReader.GetFeedUrlsFromUrlAsync(Uri);
        if (feedUris.Any())
        {
            string lastId = "";
            var feedUri = feedUris.First().Url;
            while (true)
            {
                var feed = await FeedReader.ReadAsync(feedUri);
                var newItems = new List<FeedItem>();
                foreach (var item in feed.Items)
                {
                    if (item.Id == lastId)
                        break;
                    newItems.Add(item);
                }
                if (feed.Items.Any())
                    lastId = feed.Items.First().Id;
                newItems.Reverse();
                foreach (var item in newItems)
                    Console.WriteLine(item.Link);

                await Task.Delay(TimeSpan.FromMinutes(1));
            }
        }
    }
}

Метод FeedReader.GetFeedUrlsFromUrlAsync используется для получения всех фидов со страницы. Дальше мы используем первый фид.

Дальше с помощью метода FeedReader.ReadAsync читаем записи и аыводим новые в обратном порядке (от старых к последним).

Используется класс очень просто:

new FeedProcessor(@"http://www.reddit.com/new/").Start();