Чтение RSS на C#
Для чтения 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();