Чтение 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();
