Статья впервые была опубликована на сайте VR-Online под заголовком "RSS для ленивых".
Windows RSS Platform - это API, позволяющий приложениям работать с коллекцией RSS каналов, называемой также общим списком новостных каналов (Common Feed List), на которые подписан пользователь.
Windows RSS Platform позволяет вашим приложениям:
Windows RSS Platform доступен в Windows XP SP2, Windows Vista и Windows Seven при условии, что в системе установлен Internet Exporer версии 7 или более свежей.
Поддерживаются форматы RSS и Atom, но их структура приводится к формату RSS 2.0.
Объектная модель
На рисунке показана объектная модель платформы
Основным объектом платформы является FeedManager. С помощью этого объекта мы получаем доступ к общему списку новостных каналов. Структура этого списка повторяет структуру иерархической файловой системы, состоящей из каталогов и каналов. Каждый каталог может содержать в себе подкаталоги и/или каналы (как, например, на рисунке ниже).
Свойства объекта FeedManager:
Методы объекта FeedManager:
Для работы с каталогами воспользуемся объектом FeedFolder. Доступ к корневому каталогу можно получить, прочитав значение свойства FeedManager.RootFolder.
Свойства объекта FeedFolder:
Методы объекта FeedFolder:
Чтобы получить доступ к каналам, просто прочтите в цикле элементы коллекции каналов FeedFolder.Feeds. Каждый канал описывается объектом Feed.
Свойства объекта Feed:
Методы объекта Feed:
Параметры последнего метода стоит разобрать немного подробнее.
<Свойство, по которому необходимо отсортировать элементы> может принимать следующие значения:
Значения параметра <Порядок сортировки> могут быть:
<Флаг фильтра>:
И, наконец, <Дополнительные флаги> могут принимать одно из значений:
А как же элементы канала или сами новости? Они описываются объектом FeedItem. Чтобы прочитать содержание новостей, прочитайте в цикле свойства каждого элемента коллекции Feed.Items.
Свойства объекта FeedItem:
Объект FeedItem имеет только один метод - Xml, и, как вы уже догадались, он возвращает строку с фрагментом XML-кода новости. Метод имеет единственный параметр, аналогичный параметру <Дополнительные флаги> в методе Feed.Xml.
Осталось только разобраться, каким образом мы можем получить новости. Для этой цели мы можем воспользоваться методами:
Немного о недостатках...
RSS Platform имеет некоторые ограничения:
Переходим к практике
Итак, мы уже ознакомились с теоретической частью, давайте теперь напишем какой-нибудь рабочий пример! Пусть это будет консольная утилита, которая соберет новости с указанных нами сайтов и покажет нам их в виде HTML-документа.
Для начала нам нужно получить модуль с описанием ранее рассмотренных объектов. Для этого в IDE в меню Component выберите пункт Import Component....
В диалоге Import Component выбираем Import a Type Library и жмем на кнопку Next.
Ждем, когда в диалоге загрузится список зарегистрированных библиотек типов, а дальше ищем библиотеку Microsoft Feeds Object Library.
В списке выбираем найденную библиотеку и опять жмем на кнопку Next.
Далее в строке Unit Dir Name указываем имя модуля и путь к нему. Флажок Generate Component Wrappers можно не устанавливать.
Next.
На последней странице диалога выбираем Create Unit и нажимаем кнопку Finish.
У нас есть модуль с описанием интерфейсов, приступаем к созданию консольного приложения. Для создания HTML-документа я выбрал THMLWriter, вы можете использовать любую удобную вам библиотеку.
Итак, как видите, ничего сложного! В этой статье я не рассмотрел обработку событий в Windows RSS Platform и работу с медиа-объектами, но, надеюсь, те из вас, кому данный материал показался интересным, сами смогут во всем разобраться. Мне остается только привести несколько ссылок по теме:
Windows RSS Platform
Пример простого RSS-агрегатора на Delphi
Исходник примера
Windows RSS Platform - это API, позволяющий приложениям работать с коллекцией RSS каналов, называемой также общим списком новостных каналов (Common Feed List), на которые подписан пользователь.
Windows RSS Platform позволяет вашим приложениям:
- добавлять новые и просматривать ранее добавленные новостные каналы;
- упорядочивать новостные каналы по каталогам;
- отслеживать изменения и состояние загрузки содержимого каналов;
- изменять время опроса каналов;
- работать непосредственно с XML-кодом содержимого каналов.
Windows RSS Platform доступен в Windows XP SP2, Windows Vista и Windows Seven при условии, что в системе установлен Internet Exporer версии 7 или более свежей.
Поддерживаются форматы RSS и Atom, но их структура приводится к формату RSS 2.0.
Объектная модель
На рисунке показана объектная модель платформы
Основным объектом платформы является FeedManager. С помощью этого объекта мы получаем доступ к общему списку новостных каналов. Структура этого списка повторяет структуру иерархической файловой системы, состоящей из каталогов и каналов. Каждый каталог может содержать в себе подкаталоги и/или каналы (как, например, на рисунке ниже).
Свойства объекта FeedManager:
- RootFolder - корневой каталог (объект FeedFolder);
Методы объекта FeedManager:
- GetFolder(<путь к каталогу>) - возвращает каталог (объект FeedFolder) по указанному пути или nil, если каталог не существует;
- ExistsFolder(<путь к каталогу>) - проверяет наличие указанного каталога;
- DeleteFolder(<путь к каталогу>) - удаляет указанный каталог, включая вложенные подкаталоги и каналы;
- GetFeed(<путь к каналу>) - возвращает канал (объект Feed) по указанному пути или nil, если канал отсутствует;
- GetFeedByUrl() - возвращает канал (объект Feed) по его адресу или nil, если канал отсутствует в списке;
- ExistsFeed(<путь к каналу>) - проверяет наличие указанного канала;
- IsSubscribed() - проверяет, подписан ли пользователь на указанный канал;
- DeleteFeed(<путь к каналу>) - удаляет указанный канал из списка.
Для работы с каталогами воспользуемся объектом FeedFolder. Доступ к корневому каталогу можно получить, прочитав значение свойства FeedManager.RootFolder.
Свойства объекта FeedFolder:
- IsRoot - признак того, что каталог является корневым;
- SubFolders - коллекция подкаталогов (объект FeedsEnum);
- Name - имя каталога;
- Parent - родительский каталог (объект FeedFolder), если есть;
- Path - путь к каталогу;
- TotalItemCount - возвращает общее количество элементов всех каналов в каталоге (с учетом подкаталогов);
- TotalUnreadItemCount - возвращает общее количество непрочтенных элементов во всех каналах в каталоге;
- Feeds - коллекция каналов (объект FeedsEnum).
Методы объекта FeedFolder:
- GetSubfolder(<имя подкаталога>) - возвращает подкаталог (объект FeedFolder) или nil, если подкаталог отсутствует;
- ExistsSubfolder(<имя подкаталога>) - проверяет наличие указанного подкаталога;
- CreateSubfolder(<имя подкаталога>) - создает подкаталог с указанным именем и возвращает указатель на него (объект FeedFolder);
- Delete - удаляет каталог, включая все подкаталоги и каналы;
- Move(<путь к каталогу>) - устанавливает новый путь к каталогу (перемещает каталог);
- Rename(<имя каталога>) - переименовывает каталог;
- CreateFeed(<имя канала>, ) - добавляет в каталог новый канал.
Чтобы получить доступ к каналам, просто прочтите в цикле элементы коллекции каналов FeedFolder.Feeds. Каждый канал описывается объектом Feed.
Свойства объекта Feed:
- Copyright - сведения об авторских правах;
- Description - описание канала;
- Image - URL логотипа канала;
- Language - код языка канала;
- LastBuildDate - дата последнего изменения элементов канала;
- Link - ссылка на домашнюю страницу канала;
- PubDate - дата опубликования канала;
- Title - заголовок канала;
- Ttl - время жизни канала (количество минут, в течение которого XML-код канала будет храниться в кэше в неизменном виде);
- ItemCount - количество элементов канала;
- Items - коллекция элементов канала (объект FeedsEnum);
- LastWriteTime - дата и время создания или последнего изменения канала;
- LocalID - идентификатор канала;
- Name - имя канала;
- Parent - каталог, в котором размещен канал (объект FeedFolder);
- Path - путь к каналу;
- UnreadItemCount - количество непрочтенных элементов канала;
- Url - URL канала.
Методы объекта Feed:
- MarkAllItemsRead - помечает все элементы канала как прочтенные;
- Xml(<максимальное количество элементов канала, которые необходимо вернуть>, <свойство, по которому необходимо отсортировать элементы>, <порядок сортировки>, <флаг фильтра элементов>, <дополнительные флаги>) - возвращает строку, содержащую XML-код элементов канала.
Параметры последнего метода стоит разобрать немного подробнее.
<Свойство, по которому необходимо отсортировать элементы> может принимать следующие значения:
- FXSP_NONE - не сортировать элементы;
- FXSP_PUBDATE - сортировать по дате публикации;
- FXSP_DOWNLOADTIME - сортировать по дате получения (скачивания).
Значения параметра <Порядок сортировки> могут быть:
- FXSO_NONE - не сортировать элементы (обязательно указывается, если вы указали параметр FXSP_NONE);
- FXSO_ASCENDING - сортировать по возрастанию;
- FXSO_DESCENDING - сортировать по убыванию.
<Флаг фильтра>:
- FXFF_ALL - вернуть все элементы канала;
- FXFF_UNREAD - вернуть только непрочтенные элементы канала;
- FXFF_READ - вернуть только прочтенные элементы канала.
И, наконец, <Дополнительные флаги> могут принимать одно из значений:
- FXIF_NONE - вернуть только стандартную разметку;
- FXIF_CF_EXTENSIONS - включить в разметку нестандартные тэги (если они присутствуют).
А как же элементы канала или сами новости? Они описываются объектом FeedItem. Чтобы прочитать содержание новостей, прочитайте в цикле свойства каждого элемента коллекции Feed.Items.
Свойства объекта FeedItem:
- Author - e-mail автора новости;
- Comments - URL страницы комментариев к новости;
- Description - текст новости;
- GUID - GUID новости;
- Link - URL страницы с размещенной новостью;
- Modified - дата и время последнего изменения новости;
- PubDate - дата и время опубликования новости;
- Title - новостной заголовок;
- Enclosure - медиа-объект, связанный с новостью (описывается объектом FeedEnclosure);
- IsRead - признак того, что новость уже помечена как прочитанная;
- LocalID - идентификатор новости в общем списке новостных каналов;
- Parent - новостной канал (объект Feed).
Объект FeedItem имеет только один метод - Xml, и, как вы уже догадались, он возвращает строку с фрагментом XML-кода новости. Метод имеет единственный параметр, аналогичный параметру <Дополнительные флаги> в методе Feed.Xml.
Осталось только разобраться, каким образом мы можем получить новости. Для этой цели мы можем воспользоваться методами:
- FeedManager.AsyncSyncAll - принудительно обновляет содержимое всех каналов в общем списке;
- Feed.Download - загружает содержимое канала с сервера и объединяет полученые элементы канала с ранее загруженными.
Немного о недостатках...
RSS Platform имеет некоторые ограничения:
- поддерживаются только стандартные тэги форматов RSS и Atom;
- не поддерживаются DTD-схемы описания XML-документов;
- платформа не может работать с сайтами с ограниченным доступом (с установленным паролем и т.п.);
- платформа не может работать с локальными RSS/Atom-файлами (нельзя указать путь к файлу на локальной машине);
- общий список новостных каналов доступен всем пользователям на локальной машине;
- поддерживается работа только по протоколам HTTP и HTTPS (необходимо явно указывать протокол);
- API доступен при условии, что на компьютере пользователя установлен Internet Explorer 7 или более свежая версия.
Переходим к практике
Итак, мы уже ознакомились с теоретической частью, давайте теперь напишем какой-нибудь рабочий пример! Пусть это будет консольная утилита, которая соберет новости с указанных нами сайтов и покажет нам их в виде HTML-документа.
Для начала нам нужно получить модуль с описанием ранее рассмотренных объектов. Для этого в IDE в меню Component выберите пункт Import Component....
В диалоге Import Component выбираем Import a Type Library и жмем на кнопку Next.
Ждем, когда в диалоге загрузится список зарегистрированных библиотек типов, а дальше ищем библиотеку Microsoft Feeds Object Library.
В списке выбираем найденную библиотеку и опять жмем на кнопку Next.
Далее в строке Unit Dir Name указываем имя модуля и путь к нему. Флажок Generate Component Wrappers можно не устанавливать.
Next.
На последней странице диалога выбираем Create Unit и нажимаем кнопку Finish.
У нас есть модуль с описанием интерфейсов, приступаем к созданию консольного приложения. Для создания HTML-документа я выбрал THMLWriter, вы можете использовать любую удобную вам библиотеку.
program feeds_test;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
Classes,
Feeds,
HTMLWriterUtils,
HTMLWriterIntf,
uHTMLWriter;
procedure DoCreateFeedsPage(SubsFeeds: TStrings; const HTMLFilename: string);
var
FeedsManager: IFeedsManager;
Root: IFeedFolder;
Feed: IFeed;
Items: IFeedsEnum;
Item: IFeedItem;
HTMLDoc, Body: IHTMLWriter;
feedName, feedURL: string;
k, j: Integer;
begin
if not Assigned(SubsFeeds) then
Exit;
// создаем экземпляр менеджера новостных лент
FeedsManager := CoFeedsManager.Create;
HTMLDoc := HTMLWriterCreateDocument(dtXHTML10Transitional);
Body := HTMLWriterCreate('body');
try
try
Body.AddAttribute('style', 'body');
// получаем указатель на корневой каталог списка новостных лент
Root := FeedsManager.RootFolder as IFeedFolder;
for k := 0 to SubsFeeds.Count - 1 do
begin
// получаем имя новостной ленты
feedName := SubsFeeds.Names[k];
// и ее URL
feedUrl := SubsFeeds.Values[feedName];
if (feedName = EmptyStr) or (feedUrl = EmptyStr) then
Continue;
// если корневой каталог списка содержит указатель на новостную ленту
if Root.ExistsFeed(feedName) then
Feed := Root.GetFeed(feedName) as IFeed // получаем указатель на нее
else
// в противном случае в корневом каталоге создаем указатель
// на новостную ленту (осуществляем подписку)
Feed := Root.CreateFeed(feedName, feedUrl) as IFeed;
// загружаем элементы новостной ленты с указанного URL
Feed.Download;
// если лента содержит список новостей
if Feed.ItemCount > 0 then
begin
Body.AddHeading1Text(Feed.Title);
Body.AddHeading4Text(Feed.Description);
// получаем список новостей в ленте
Items := Feed.Items as IFeedsEnum;
// перебираем список новостей
for j := 0 to Items.Count - 1 do
begin
// получаем указатель на новость из ленты
Item := Items.Item(j) as IFeedItem;
Body.AddAnchor(Item.Link,
Format('<h5>[%s] %s</h5>', [FormatDateTime('dd.mm.yyyy', Item.PubDate),
Item.Title]));
Body.AddDivTextWithStyle(Item.Description, 'div.sectionbody');
end;
end;
// удаляем новостную ленту, чтобы не оставлять следов в общем списке,
// иначе Outlook или IE нам покажут эту ленту
Feed.Delete;
end;
Body.CloseTag(ucoUseCRLF);
// Сохраняем все в HTML документ
HTMLDoc
.OpenHead
.OpenMeta
.AddMetaNamedContent('generator', 'feeds_test')
.CloseTag(ucoUseCRLF)
.AddTitle('RSS Feeds List')
.AddTag('style', ctNormal, chaCanHaveAttributes)
.AddAttribute('type="text/css"')
.AddText('body {margin: 1em 5% 1em 5%;}')
.AddText('h1, h2, h3, h4, h5, h6 {color: #527bbd;font-family: sans-serif;margin-top: 1.2em;margin-bottom: 0.5em;line-height: 1.3;}')
.AddText('h1, h2, h3 {border-bottom: 2px solid silver;}')
.AddText('h2 {padding-top: 0.5em;}')
.AddText('h3 {float: left;}')
.AddText('h3 + * {clear: left;}')
.AddText('div.sectionbody {font-family: serif;margin-left: 0;}')
.AddText('p {margin-top: 0.5em;margin-bottom: 0.5em;}')
.CloseTag(ucoUseCRLF)
.CloseTag(ucoUseCRLF)
.OpenBody
.AddText(Body.AsHTML)
.CloseTag
.CloseDocument
.SaveToFile(HTMLFilename);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
FeedsManager := nil;
Body := nil;
HTMLDoc := nil;
end;
end;
var
Subscriptions: TStrings; // коллекция опрашиваемых каналов
Filename: string; // имя файла HTML-документа
i: Integer;
const
SFilename = 'feeds.html';
SSubscriptions: array [0..3] of string = (
'VR-Online=http://vr-online.ru/rss.xml',
'Облако проектов=http://projectscloud.ru/rss',
'Yandex - IT-новости=http://news.yandex.ru/computers.rss',
'iXBT=http://www.ixbt.com/export/news.rss'
);
begin
Subscriptions := TStringList.Create;
try
try
Filename := ExtractFilePath(ParamStr(0)) + SFilename;
for i := Low(SSubscriptions) to High(SSubscriptions) do
Subscriptions.Add(SSubscriptions[i]);
DoCreateFeedsPage(Subscriptions, Filename);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
FreeAndNil(Subscriptions);
end;
end.
Итак, как видите, ничего сложного! В этой статье я не рассмотрел обработку событий в Windows RSS Platform и работу с медиа-объектами, но, надеюсь, те из вас, кому данный материал показался интересным, сами смогут во всем разобраться. Мне остается только привести несколько ссылок по теме:
Windows RSS Platform
Пример простого RSS-агрегатора на Delphi
Исходник примера






Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.