Pull to refresh

Простая работа с RSS-ридером SimplePie в PHP

image

Иногда возникает необходимость получать свежие новости в формате RSS или Atom.

Неважно для каких целей — важно, что для этого уже есть готовое решение.
И решение простое и удобное — а именно, PHP-библиотека SimplePie.

Скачать её можно на GitHub. Там лежит полный архив со всеми необходимыми файлами.

Здесь приведены лишь основные методы работы с фидами и новостями, поэтому советую ознакомиться с официальной документацией, там полно действительно полезных функций.

Подключение


Раньше SimplePie выглядел в виде одного PHP-файла simplepie.inc, который почему-то до сих пор упоминается в официальной документации.

Теперь же ситуация изменилась — необходимо закачать на сервер директорию SimplePie и в нужном PHP-скрипте подключить модуль автозагрузки класса:
include_once('SimplePieAutoloader.php');

Также Вам может понадобиться подключить модуль конвертирования интернациональных имён доменов IDNA_Convert:
include_once('idn/idna_convert.class.php');

После подключения модулей необходимо создать экземпляр класса SimplePie, сообщить ему информацию о загружаемом RSS/Atom-документе и научить куда складывать кэшированные документы и на какой срок (в секундах):
$feed=new SimplePie();
$feed->set_feed_url('http://news.mail.ru/rss/');
$feed->set_cache_location('./rss_cache');
$feed->set_cache_duration(1800);
$feed->enable_cache(true);


Для правильного добавления дат/времени например в базу данных требуется установить временную зону:
date_default_timezone_set('Europe/Moscow');

Ну и наконец, инициализируем экземпляр класса SimplePie:
$success=$feed->init();

Использование


Для получения информации из выбранного фида нам нужно попробовать определить Content-type загруженного документа. Он может быть как и заявленным в документации RSS/Atom-документом, так и блогом, да и вообще видимо любым документом, где есть заголовок, дата со временем и содержание.
$feed->handle_content_type();

При необходимости можно указать Content-type если мы его заранее знаем:
$feed->handle_content_type('text/html');

Данные о загруженном фиде можно вытащить с помощью нескольких полезных методов:
$feed->get_title(); // получаем заголовок RSS-ленты, например "Новости@Mail.Ru"
$feed->get_permalink(); // постоянная ссылка новостной ленты, например "http://news.mail.ru/"
$feed->get_favicon(); // ссылка на favicon новостной ленты в формате .ico
$feed->get_image_url(); // ссылка на картинку, которую использует фид для самоидентификации в формате .jpg, .gif или ином
$feed->get_description(); // забираем краткое описание ленты
$feed->get_encoding(); // получаем кодировку документа
$feed->get_language(); // узнаём на каком языке выводится данный фид, например "en-us", "ru-ru"


Основная информация о фиде у нас есть, наконец-то можно почитать и сами новости:
$items=$feed->get_items();

Теперь в массиве $items хранится вся информация о новостях и доставать её можно следующим способом:
foreach($items as$item){
$item_date=$item->get_date('Y-m-d H:i:s'); // получаем дату/время в нужном формате
$item_title=$item->get_title(); // краткий заголовок новости
$item_content=$item->get_content(); // содержание новости
$item_link=$item->get_link(); // постоянная ссылка на новость на сайте-источнике
$enclosures=$item->get_enclosures(); // картинки и всякие прикреплённые к новости файлы
if(count($enclosures)){ // если у нас есть какие-нибудь картинки в новости
foreach($enclosures as$enclosure){
$enclosure_mime=$enclosure->get_real_type(); // получаем MIME-тип вложенного файла
$enclosure_url=$enclosure->get_link(); // вытягиваем ссылку на картинку
}
}
}


Ну вот, теперь у нас есть основная информация об RSS-канале и его новостях, и мы можем её использовать в своих целях — например добавить в Cron вывод в файл и читать на работе новости из консоли без палева :)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.