
Иногда возникает необходимость получать свежие новости в формате 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 вывод в файл и читать на работе новости из консоли без палева :)