Atom rss что это
– Что такое «фиды» (feeds)? Я часто вижу «RSS», «XML», и «Atom» на многих сайтах, но я не знаю как пользоваться этими ссылками.
– Что такое «фиды» (feeds)? Я часто вижу «RSS», «XML», и «Atom» на многих сайтах, но я не знаю как пользоваться этими ссылками.
Что все это значит?
Вы должно быть не раз замечали иконку фида, или такие вот модифицированные кнопочки (см. справа) на ваших любимых сайтах, блогах, подкаст-терминалах. Эти иконки представляют контент в любом формате – текст, аудио или видео – вы можете подписаться на такой фид и читать/смотреть/слушать при помощи фид-читалки.
Чем это удобно?
Развитие технологий в области онлайн-публикаций позволило не только с простотой публиковать регулярные обновления на веб-сайтах, но также и отслеживать изменения на большом количестве ваших любимых вебсайтов, блогов, без необходимости вводить каждый адрес в браузер и проверять каждый сайт вручную. Теперь вы можете значительно ускорить ваш процесс мониторинга информации с большого количества сайтов, подписавшись на фиды и автоматически собирая информацию в одном месте, чтобы просмотреть когда будет нужно или удобно.
Для издателя онлайн-информации: Фиды обеспечивают немедленную доставку свежей информации, и дают возможность подписываться на ее автоматическое получение.
Для рекламистов: Реклама в фидах обходит недостатки которые проявились при использовании стандартных маркетинговых каналов – перегрузка спамом, недостаточная оперативность доставки, неудобства связанные с засорением почтового ящика и т.д. В результате реклама получается тематическая и не нагружающая.
Кто публикует фиды?
Как я буду читать фиды?
Если вы хотите просматривать и подписываться на фиды, у вас есть множество вариантов на выбор. На сегодняшний день существует более 2000 различных приложений для чтения фидов, также известных как агрегаторы (в основном, они предназначены для текстового контента) и «подкатчеры» («podcatchers» для отслеживания обновлений подкастов). Есть также программы-читалки разработанные исключительно для мобильных устройств.
Некоторые из программ агрегаторов обойдутся вам небольших денег, однако порадуют простотой использования и будут содержать множество предустановленных новостных каналов, среди которых вы вероятно найдете и интересные для себя. Бесплатных программ также великое множество, попробуйте поискать по слову «Feed reader» или «Feed aggregator» на популярных поисковых сайтах – вы получите достаточно предложений. Некоторые популярные фид-агрегаторы будут перечислены в конце этой страницы.
Типичный интерфейс для фид-агрегатора будет отображать ваши новостные ленты и число новых (непрочитанных) записей в каждой ленте. Вы можете сгруппировать фиды в категории.
Если вы предпочитаете онлайн-инструменты, вы без труда найдете такие. Они позволят вам просматривать ленты новостей на которые вы подписаны, откуда угодно, где вам удастся найти интернет-браузер. Обновления и новые возможности устанавливаются автоматически.
Как мне опубликовать свой собственный фид?
Если у вас есть вебсайт, блог, аудио/видео материалы, или просто фотоснимки, вы можете «приделать» к своим материалам новостную ленту. Если вы пользуетесь популярной блог-платформой или интрументом для публикации как TypePad, WordPress, или Blogger, то скорее всего новостная лента создается для вас автоматически. Даже некоторые другие не-блоговые сайты, такие как сеть обмена фотографиями Flikr предоставляют фиды для материалов которые вы публикуете, чтобы облегчить доступ к этим материалам вашим посетителям. Также есть инструменты которые помогают преобразовать традиционный веб-контент в формат подходящий для распространения по RSS.
Сервис FeedBurner позволяет издателям веб-контента, у которых уже есть новостная лента (фид) лучше понять возможности этого способа доставки контента, и улучшить взаимодействие с аудиторией. Если у вас уже есть фид, «пропустите» его через FeedBurner, чтобы получить множество новых возможностей и преимуществ.
Узнайте больше о сервисах FeedBurner для блогов, подкастов и коммерческих публикаций.
И наконец, немного технической информации
Отметим, что RSS это только один из форматов для описания XML фидов. Другой, также достаточно известный формат это Atom. Оба формата имеют своих приверженцев, и вряд-ли они будут обьединены в один формат. Тем не менее, большинству пользователей важно лишь получать свежий контент, не особо заботясь о тенической реализации сервиса. FeedBurner помогает издателям избежать неопределенности в том какой формат использовать – это абсолютно все равно благодаря сервису SmartFeed, который делает любой формат читаемым на любом устройстве подписчика.
Доступ к веб-каналу
Предварительные условия
Чтобы подготовить приложение UWP для работы в сети, необходимо настроить соответствующие возможности сетевого подключения в файле проекта Package.appxmanifest. Если приложению необходимо подключаться в качестве клиента к удаленным службам в Интернете, для этого требуется возможность internetClient . Дополнительные сведения см. в разделе "Возможности" темы Основы работы с сетями.
Получение сводного содержимого из веб-канала
Конструктор Uri создает исключение, если параметр uriString, переданный конструктору, не является допустимым URI. Поэтому проверяем uriString при помощи блока Try/Catch.
Допустим, было возвращено нужное содержимое канала. В этом случае код из примера перебирает каждый элемент канала, вызывая displayCurrentItem (который мы определим позже), чтобы отобразить элементы и их содержимое в виде списка с помощью пользовательского интерфейса.
При вызове большинства асинхронных сетевых методов вам следует написать код для обработки исключений. Обработчик исключений может получить подробную информацию о причине исключения, чтобы разобраться в проблеме и принять необходимые меры.
В предыдущем шаге метод RetrieveFeedAsync вернул запрошенное содержимое канала, а код примера перебрал все доступные элементы канала. Каждый из этих элементов представляется с помощью объекта SyndicationItem, содержащего все свойства элемента и содержимое, которое предоставляется соответствующим стандартом синдикации (RSS или Atom). В следующем примере рассматривается функция displayCurrentItem, которая обрабатывает каждый элемент и отображает его содержимое с помощью элементов пользовательского интерфейса с различными именами.
Типы Atom
Приложения могут создавать два типа атомов: строковые атомы и целочисленные атомы. Значения целочисленных атомов и строковых атомов не перекрываются, поэтому оба типа атомов можно использовать в одном блоке кода.
Несколько функций принимают в качестве параметров строки или атомы. При передаче Atom в эти функции приложение может использовать макрос макеинтатом для преобразования Atom в форму, которая может использоваться функцией.
В следующих разделах описываются типы Atom.
Строковые атомы
Когда приложения передают строки, заканчивающиеся нулем, в функции глобаладдатом, аддатом, глобалфиндатоми финдатом , они получают строковые атомы (16-разрядные целые числа) в Return. Строковые атомы имеют следующие свойства:
- Значения строковых атомов находятся в диапазоне от 0xC000 (МАКСИНТАТОМ) до 0xFFFF.
- Регистр не важен при поиске имени Atom в таблице Atom. Кроме того, вся строка должна совпадать в операции поиска. сопоставление подстрок не выполняется.
- Длина строки, связанной со строкой Atom, не может превышать 255 байт. Это ограничение относится ко всем функциям Atom.
- Счетчик ссылок связан с каждым именем Atom. Счетчик увеличивается каждый раз, когда имя Atom добавляется в таблицу и уменьшается каждый раз при удалении имени Atom из него. Это не позволяет разным пользователям одной и той же строки Atom уничтожить имена Atom друг друга. Если число ссылок для имени Atom равно нулю, система удаляет Atom и имя Atom из таблицы.
Целочисленные атомы
Целочисленные атомы отличаются от строковых атомов следующими способами.
Форматы строк Atom
Функции аддатом, глобаладдатом, финдатоми глобалфиндатом принимают указатель на строку, завершающуюся нулем. Приложение может указать этот указатель одним из следующих способов.
Каналы RSS и Atom
Получайте или создавайте самое свежее и популярное веб-содержимое с помощью сводных веб-каналов, созданных по стандартам RSS и Atom с помощью компонентов в пространстве имен Windows.Web.Syndication.
Локальные таблицы Atom
Приложение может использовать локальную таблицу Atom для эффективного управления большим количеством строк, используемых только в приложении. Эти строки и связанные с ними атомы доступны только для приложения, создавшего таблицу.
Приложение, которому необходима одна и та же строка в нескольких структурах, может уменьшить использование памяти с помощью локальной таблицы Atom. Вместо копирования строки в каждую структуру приложение может поместить строку в таблицу Atom и включить результирующий объект Atom в структуры. Таким образом, строка появляется только один раз в памяти, но может использоваться в приложении много раз.
Приложения также могут использовать локальные таблицы Atom для экономии времени при поиске определенной строки. Для выполнения поиска приложению требуется только поместить строку поиска в таблицу Atom и сравнить полученный объект Atom с атомами в соответствующих структурах. Сравнение атомов обычно выполняется быстрее, чем сравнение строк.
Таблицы Atom реализуются как хэш-таблицы. По умолчанию в локальной таблице Atom для хэш-таблицы используются 37 контейнеров. Однако можно изменить число контейнеров, используемых при вызове функции инитатомтабле . Если приложение вызывает инитатомтабле, это необходимо сделать до вызова любых других функций управления Atom.
Создание Atom и счетчик использования
Приложение создает локальный экземпляр Atom, вызывая функцию аддатом ; Он создает глобальный объект Atom, вызывая функцию глобаладдатом . Для обеих функций требуется указатель на строку. Система выполняет поиск строки в соответствующей таблице Atom и возвращает в приложение соответствующий элемент Atom. В случае с строкой Atom, если строка уже находится в таблице Atom, система увеличивает счетчик ссылок для строки во время этого процесса.
Повторные вызовы для добавления одного и того же имени Atom возвращают один и тот же элемент Atom. Если имя Atom не существует в таблице при вызове аддатом , имя Atom добавляется в таблицу и возвращается новый элемент Atom. Если это строковый Atom, то счетчик ссылок также имеет значение One.
Приложение должно вызывать функцию делетеатом , когда больше не требуется использовать локальный экземпляр Atom; Он должен вызывать функцию глобалделетеатом , когда больше не требуется глобальный атом. В случае со строкой Atom любая из этих функций сокращает число ссылок соответствующего объекта Atom на единицу. Когда счетчик ссылок достигает нуля, система удаляет имя Atom из таблицы.
Имя Atom строкового Atom остается в глобальной таблице Atom, пока значение счетчика ссылок больше нуля, даже после того, как приложение, помещенное в таблицу, завершается. Локальная таблица Atom уничтожается при завершении связанного приложения независимо от количества ссылок на атомы в таблице.
Какие версии форматов веб-каналов поддерживаются?
Универсальная платформа Windows (UWP) поддерживает извлечение веб-каналов формата RSS версий 0.91–2.0 и формата Atom версий 0.3–1.0. Классы в пространстве имен Windows.Web.Syndication могут определять веб-каналы и их элементы, способные представлять элементы RSS и Atom.
Кроме того, в форматах Atom 1.0 и RSS 2.0 документы веб-каналов могут содержать элементы или атрибуты, не определенные в официальных спецификациях. Со временем эти особые элементы стали способом определения информации домена, потребляемой другими форматами данных веб-служб, например GData и OData. Чтобы обеспечить поддержку нового компонента, класс SyndicationNode представляет универсальные XML-элементы. Использование SyndicationNode с классами в пространстве имен Windows.Data.Xml.Dom позволяет приложениям получать доступ к атрибутам, расширениям и любому содержимому, которое они могут включать.
Обратите внимание, что для публикации сводного содержимого реализация протокола Atom Publication (Windows.Web.AtomPub) платформы UWP поддерживает только операции с содержимым веб-каналов согласно стандартам Atom и Atom Publication.
О таблицах Atom
Таблица Atom — это определяемая системой таблица, в которой хранятся строки и соответствующие идентификаторы. Приложение помещает строку в таблицу Atom и получает 16-разрядное целое число, называемое Atom, которое можно использовать для доступа к строке. Строка, помещенная в таблицу Atom, называется именем Atom.
Система предоставляет несколько таблиц Atom. Каждая таблица Atom служит другой целью. например, приложения платформа динамических данных Exchange (DDE) используют глобальную таблицу atom для совместного использования строк имени элемента и имени раздела с другими приложениями. Вместо передачи фактических строк приложение DDE передает глобальные атомы в свое партнерское приложение. Участник использует атомы для получения строк из таблицы Atom.
Приложения могут использовать локальные таблицы Atom для хранения собственных сопоставлений имен элементов.
В этом разделе рассматриваются следующие темы.
Пользовательская таблица Atom
В дополнение к глобальной таблице Atom пользовательская таблица Atom является другой системной таблицей Atom, которая также является общей для всех процессов. Таблица user Atom используется для небольшого числа сценариев, внутренних для Win32k; Например, имена модулей Windows, хорошо известные строки в Win32k, форматы OLE и т. д. Несмотря на то, что приложения не взаимодействуют с пользовательской таблицей Atom напрямую, они вызывают несколько API-интерфейсов, таких как registerClass, регистервиндовмессажеи регистерклипбоардформат, которые добавляют записи в таблицу Atom пользователя. Записи, добавленные, RegisterClass можно удалить с помощью UnregisterClass . Однако записи, добавленные RegisterWindowMessage и, RegisterClipboardFormat не удаляются до завершения сеанса. Если в таблице Atom пользователя больше нет пространства, а передаваемая строка еще не находится в таблице, вызов завершится ошибкой.
Размер таблицы Atom
Многие критические API, включая CreateWindow, основываются на пользовательских атомах. Поэтому нехватка пространства в таблице Atom пользователя приведет к серьезным проблемам. Например, не удается запустить все приложения. Ниже приведены некоторые рекомендации по эффективному использованию приложением таблиц Atom и обеспечению надежности и производительности приложения и системы.
Вы должны ограничить использование приложения пользовательской таблицей Atom. Хранение уникальных строк с помощью таких интерфейсов API, как RegisterClass , RegisterWindowMessage или, RegisterClipboardFormat занимает место в таблице Atom пользователя, которая используется глобально другими приложениями для регистрации классов окон с помощью строк. Если это возможно, следует использовать аддатом / делетеатом для хранения строк в локальной таблице Atom или глобаладдатом / глобалделетеатом , если атомы необходимы для кросс-процессов.
Если возникает проблема с приложением, вызывающим проблемы с таблицей Atom пользователя, можно исследовать основную причину, подключившись к отладчику ядра и нарушая процесс при вызовах метода UserAddAtomEx ( bae1 win32kbase!UserAddAtomEx /p <eprocess> "kc10;g" ). Найдите user32! в стеке вызовов, чтобы узнать, какой API вызывается. Эта методика похожа на обнаружение ошибок глобальной таблицы Atom, описанных в разделе Определение утечек глобальной таблицы Atom. Другим способом дампа содержимого таблицы Atom пользователя является вызов жетклипбоардформатнаме для диапазона возможных атомов от 0XC000 до 0xFFFF. Если общее число атомов постоянно выходит во время работы приложения или не возвращается к базовому плану при закрытии приложения, возникает проблема.
Запросы Atom-Table
Приложение может определить, уже определена ли строка в таблице Atom с помощью функции финдатом или глобалфиндатом . Эти функции выполняют поиск указанной строки в таблице Atom и, если строка находится в ней, возвращают соответствующий Atom.
Приложение может использовать функцию жетатомнаме или глобалжетатомнаме для извлечения строки Atom-Name из таблицы Atom при условии, что приложение имеет объект Atom, соответствующий искомой строке. Обе функции копируют строку Atom-Name указанного Atom в буфер и возвращают длину скопированной строки. Жетатомнаме извлекает строку Atom-Name из локальной таблицы Atom, а глобалжетатомнаме извлекает строку Atom-Name из глобальной таблицы Atom.
Получение RSS/Atom фидов с любой страницы
Основой будет мой любимый инструмент — Zend Framework (используем последнюю, trunk версию). Если вы знакомы с его возможностями, что сходу предложите компонент Zend_Feed, который имеет встроенные возможности по извлечению из страницы лент. Однако не спешите, на практике задача не так и проста. Поэтому будем решать ее постепенно.
Нормализация URL.
И так, нам необходима функция, которая принимает на входе произвольную строку, предположительно с адресом сайта или фида, а возвращает всегда или false, если строка ну никак не похожа на URL, или полный адрес, с указанием протокола и т.п. Для валидации мы используем другой компонент фреймворка — Zend_Uri, который предоставляет нам несколько инструментов для обработки и проверки URI (Uniform Resource Identifiers).
Сначала мы положимся на пользователя, поэтому попробуем сразу использовать переданную строку как адрес. Если это не получится и Zend_Uri откажется признать это правильным адресом, он выбросит исключение (или вернет false, если адрес просто неправильный), которые мы перехватим и уже попробуем привести к более правильной форме. Если же и вторая попытка не удается, тогда все, сдаемся и возвращаем false, означающее, что введенное пользователем никак не является корректным адресом расположения ленты.
Получение прямых линков на ленты.
Теперь следующий этап — нам необходимо получить прямые ссылки на все ленты, которые сможем найти по указанному пользователем адресу. Всегда помним, что там может просто не оказаться ни одной ленты, а может быть несколько, как разных, так и одинаковых, просто различного формата. Вот чего-чего, а различных форматов и спецификаций лента набралось достаточно можно, к тому же часто бывают вообще уникальные и сложнейшие ленты (пока самой трудной оказалась лента от CNBC, в принципе, которая и послужила основой для переписывания старой системы обработки лент). Наше счастье, что разработчики Zend-а уже позаботились о том, чтобы компоненты имели полностью независимые интерфейсы и разработчики абстрагировались от всех нюансов спецификаций.
- ссылка на веб-сайт (корень или конкретную страницу), где нам необходимо найти все ленты.
- прямая ссылка на фид (кстати, может быть с переадресацией внутри)
- линк, где нет фидов.
Для примера, возьмем наугад следующий список:
Дальше пропустим его через валидатор, описанный выше и получим массив полный URL.
- //массив линков, которые готовые к обработке (валидные URI)
- $_links = Array();
- echo "Checking URL. <br />" ;
- foreach ($_url as $u)
- echo "Original URL: " . $u . ". <br />" ;
- $_url = self::_validURI($u);
- if ($_url === false ) continue ;
- else
- $_links[] = $_url;
- >
Дальше мы последовательно пытаемся с каждого адреса извлечь все ленты. Используя Zend_Feed_Reader мы пробуем обнаружить на странице ленты, которые будут возвращены в виде массива объектов класса Zend_Feed_Reader_FeedSet, а по сути — просто массивы (вернее, объект просто реализует необходимые интерфейсы, поэтому с ним можно работать, как с обычным массивом. Если ленты есть, мы перебираем все и извлекаем из них свойство href, содержащее прямую ссылку. В случае, если по указанному адресу ленты отсутствуют (это случай как просто страницы без лент, так и при использовании прямого адреса фида — он воспримется также как отсутствие ленты), мы строим предположение, что, возможно, это как раз случай прямого адреса и пытаемся получить фид напрямую. Если же и эта попытка провалится, считаем, что увы, но по указанному адресу лент нет и переходим к следующему по списку адресу.
- try
- $_ln = Zend_Feed_Reader::findFeedLinks($fl);
- if (($_ln instanceOf Zend_Feed_Reader_FeedSet) && (count($_ln) > 0))
- $tmp = Array();
- foreach ($_ln as $cf)
- //в $cf у нас объект каждого фида, Zend_Feed_Reader_FeedSet
- //он наследуется от ArrayObject и содержит три поля,
- //нам интересно: 'href', содержащие ссылку на фид
- $tmp[] = $cf[ 'href' ];
- >
- //так как бывают дублирующие фиды, удалим дубликаты
- if (!empty($tmp))
- $_feeds_links[$site] = array_unique($tmp);
- >
- >
- else
- //это может быть прямой линк на FeedURL
- // для этого придется попробовать загрузить документ
- try
- $_tmp_feed = Zend_Feed_Reader::import($fl);
- // мы не знаем наперед, какой формат
- if ($_tmp_feed instanceOf Zend_Feed_Reader_FeedAbstract)
- //да, это нормальный фид, он уже в кеше,
- //поэтому просто получим адрес, на случай использования прокси-сервисов
- //как показала практика, использование getFeedLink()
- //иногда не дает нужного результата, например для CNBC-фида
- $_feeds_links[$site][] = $fl;
- continue ;
- >
- else
- throw new Zend_Exception( 'Bad feed' );
- >
- catch (Zend_Exception $e)
- //точно нет
- echo "<br /><b>" . $fl . "</b> == Nothing feeds!<br />" ;
- continue ;
- >
- >
- >
- catch (Zend_Exception $e)
- continue ;
- >
Обратите внимание, в случае, когда мы пытаемся загрузить фид напрямую, мы не знаем, какой формат будет, поэтому для проверки результата используем тот факт, что все классы фидов имеют общего предка, абстрактный класс Zend_Feed_Reader_FeedAbstract. Также в этом случае будет некоторое дублирование, так как дальше мы будем получать последние записи из фидов. Но так как мы используем кеширование, то для случая прямых ссылок данные уже будут в кеше, поэтому повторного запроса не будет.
Получение последних записей ленты.
Если на этом этапе мы встретимся с ошибкой, то просто пропускаем ленту — в лучшем случае, на странице будет еще одна лента, но другого формата, в худшем — мы не найдем ничего. Когда лента импортирована, мы получим заголовок, а далее в цикле 10 последних записей, для каждой из которых получим ссылку, название и дату создания (дата всегда идет в GMT). В тестовом примере я сразу формирую строку, в реальности скорее всего вы каждый из компонент сохраните отдельно, а время, возможно, приведете к единому стандарту (например, с учетом текущей локали пользователя) и конвертируете в UNIX TIMESTAMP для удобства обработки.
Результат мы пока просто выводим через var_dump в браузер (ведь это всего лишь тестовый скрипт). В реальной системе все эти данные пакуются в JSON-массив и отправляются клиенту, который отображает пользователю и дает возможность выбрать одну из лент для подписки. Конечно, можно было бы сделать все за пользователя — например, в случае нескольких лент, которые отличаются только форматом, проверять совпадение ID новостей, и если они одинаковые, то просто брать предпочтительный формат и все. Но это уже зависит от специфики конкретных задач.
Что такое веб-канал?
Веб-канал – это документ, содержащий любое количество отдельных записей, состоящих из текста, ссылок и изображений. Обновления вносятся в веб-канал в виде новых записей, используемых для показа самого свежего содержимого в Интернете. Потребители содержимого могут использовать приложение для чтения веб-каналов, чтобы собирать и отслеживать каналы любого количества отдельных авторов содержимого, быстро и удобно получая доступ к самой свежей информации.
Использование сводного содержимого вместе с сетевой изоляцией
Функция сетевой изоляции в UWP позволяет разработчику управлять доступом приложения UWP к сети и ограничивать его. Доступ к сети может требоваться не всем приложениям. Но для приложений, которым он необходим, платформа UWP предоставляет разные уровни доступа к сети, которые обеспечиваются выбором подходящих возможностей.
Сетевая изоляция позволяет разработчику определить для каждого приложения область необходимого доступа к сети. Приложению без соответствующей определенной области запрещен доступ к отдельному типу сети и к отдельному типу сетевых запросов (только исходящим запросам, инициированным клиентом, или им же в сочетании с входящими нежелательными запросами). Возможность настраивать и применять сетевую изоляцию гарантирует, что даже в случае компрометации приложения оно сможет получить доступ только к тем сетям, к которым доступ ему предоставлен явно. Таким образом значительно сокращается область воздействия на другие приложения и Windows.
Сетевая изоляция влияет на все элементы класса в пространствах имен Windows.Web.Syndication и Windows.Web.AtomPub, которые пытаются получить доступ к сети. Сетевая изоляция активно используется в Windows. Вызов элемента класса в пространстве имен Windows.Web.Syndication или Windows.Web.AtomPub, обеспечивающем доступ к сети, может быть не выполнен из-за сетевой изоляции, если соответствующая возможность работы с сетью не была включена.
Возможности сети для приложения настраиваются в его манифесте при сборке. Они обычно добавляются с помощью Microsoft Visual Studio 2015 в ходе разработки приложения. Возможности сети можно также задать вручную в файле манифеста приложения, используя текстовый редактор.
Дополнительные сведения о сетевой изоляции и сетевых возможностях см. в разделе "Возможности" темы Основы работы с сетями.
Глобальная таблица Atom
Глобальная таблица Atom доступна для всех приложений. Когда приложение помещает строку в глобальную таблицу Atom, система создает объект Atom, который уникален в пределах всей системы. Любое приложение, имеющее Atom, может получить строку, которую он идентифицирует, выполнив запрос к глобальной таблице Atom.
Читайте также: