Leer un RSS o feed con PHP

En este artículo vamos a explicar cómo leer un RSS o feed con PHP lo cual es útil para mostrar el contenido de estos canales de distribución. Los términos RSS y feed a menudo se utilizan de manera intercambiable, pero tienen significados ligeramente diferentes:

Mientras que RSS es un formato específico utilizado para sindicar y distribuir contenido web, feed es un término más amplio que se refiere a cualquier flujo de contenido en tiempo real, aunque en muchos casos se utiliza específicamente en el contexto de los feeds RSS. Veamos sus definiciones:

  • RSS (Really Simple Syndication): Es un formato de datos que se utiliza para distribuir contenido web de manera estandarizada. Permite a los usuarios suscribirse y recibir actualizaciones automáticas de contenido, como noticias, blogs u otras publicaciones en línea. Los usuarios que se suscriben al RSS de un sitio web, pueden recibir las últimas actualizaciones sin tener que visitar el sitio web manualmente.
  • Feed: Un feed (en español, fuente) se refiere a un flujo continuo de contenido actualizado. Es un término genérico para describir cualquier fuente de datos que proporciona información en tiempo real. Comúnmente se asocia con los feeds RSS. Por ejemplo, cuando alguien dice «suscribirse al feed de un blog», se refiere a recibir actualizaciones automáticas a través del formato RSS.

Estructura para leer un RSS o feed

La estructura de un RSS o feed es un formato XML estandarizado. Hay varias versiones de RSS, siendo RSS 2.0 una de las más comunes. Un ejemplo simple de la estructura de un documento RSS 2.0 sería:

<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Título del Feed</title>
    <link>URL del Sitio Web</link>
    <description>Descripción del Feed</description>
    <item>
      <title>Título del Artículo 1</title>
      <link>URL del Artículo 1</link>
      <description>Descripción del Artículo 1</description>
    </item>
    <item>
      <title>Título del Artículo 2</title>
      <link>URL del Artículo 2</link>
      <description>Descripción del Artículo 2</description>
    </item>
    <!-- Más elementos 'item' para otros artículos -->
  </channel>
</rss>

Donde la explicación los elementos sería la siguiente:

  • <rss version="2.0"> Indica la versión de RSS que se está utilizando (en este caso, 2.0).
    • <channel>: Es el inicio del canal de distribución, contiene información sobre el feed y sus artículos.
      • <title>, <link>, <description> Muestra información sobre el feed, como el título, el enlace y la descripción.
      • <item> Contiene información sobre un artículo específico en el feed. Cada artículo está encapsulado en esta etiqueta.
        • <title>, <link>, <description> Dentro de cada artículo podemos mostrar diferente información como el título, el enlace y la descripción.

Es importante señalar que el contenido real de cada <item> puede variar según las necesidades del feed y no seguir la misma estructura que en este ejemplo. Además, existen otras versiones de RSS y otros formatos relacionados como Atom, que también se utilizan para sindicar contenido web. La estructura básica, sin embargo, es similar en muchos de estos formatos.

Estructura de lectura RSS o feed Atom

Atom es otro formato de sindicación web similar a RSS, pero con algunas diferencias en la estructura y la filosofía de diseño. Atom también utiliza XML para representar la información con sus propias etiquetas, un ejemplo sería:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Título del Feed</title>
  <link href="URL del Feed" />
  <updated>Fecha de la última actualización</updated>
  <author>
    <name>Nombre del Autor</name>
  </author>
  <id>Identificador único del Feed</id>
  <entry>
    <title>Título del Artículo 1</title>
    <link href="URL del Artículo 1" />
    <id>Identificador único del Artículo 1</id>
    <updated>Fecha de la última actualización del Artículo 1</updated>
    <summary>Resumen del Artículo 1</summary>
    <content type="html">Contenido HTML del Artículo 1</content>
  </entry>
  <entry>
    <title>Título del Artículo 2</title>
    <link href="URL del Artículo 2" />
    <id>Identificador único del Artículo 2</id>
    <updated>Fecha de la última actualización del Artículo 2</updated>
    <summary>Resumen del Artículo 2</summary>
    <content type="html">Contenido HTML del Artículo 2</content>
  </entry>
  <!-- Más elementos 'entry' para otros artículos -->
</feed>

En la estructura Atom tenemos los siguientes elementos clave:

  • <?xml version="1.0" encoding="utf-8"?> Esta línea es la declaración XML que indica que el documento sigue la versión 1.0 de XML y utiliza la codificación UTF-8 para los caracteres.
  • <feed xmlns="http://www.w3.org/2005/Atom"> Es el elemento raíz del documento Atom y representa la fuente de sindicación con toda la información relacionada con el feed. Establece el espacio de nombres XML para el elemento <feed>, que en este caso es http://www.w3.org/2005/Atom (espacio de nombres estándar para documentos Atom). El espacio de nombres ayuda a evitar conflictos de nombres de elementos entre diferentes tecnologías XML.
    • <title>, <link>, <updated>, <author>, <id> Dentro del feed tenemos su información general como el título, su enlace, última actualización, autor y su identificador único.
    • <entry> Contiene información sobre un artículo específico. Cada artículo está encapsulado en esta etiqueta.
      • <title>, <link>, <id>, <updated>, <summary>, <content type="html"> Dentro de cada artículo encontramos diferente información sobre él como su título, enlace, identificador único, última actualización, un resumen o descripción breve del artículo, y por último el contenido principal del artículo. Este contenido puede ser en formato HTML u otro formato especificado en el atributo type.

Igual que en la estructura RSS, la estructura Atom puede variar según las necesidades del feed. Pero la especificación Atom proporciona más flexibilidad sobre qué elementos se pueden incluir en un feed o entrada específica.

Estrategia de lectura RSS o feed con PHP

Aunque es posible crear un algoritmo general que nos permita leer un RSS o feed con PHP sea cual sea su contenido o formato Atom, diseñar una función específica para el canal RSS que queremos leer tiende a ser más eficiente y menos propenso a errores.

En general, es más práctico diseñar un algoritmo PHP para leer un feed RSS o Atom después de observar su estructura por varias razones:

  • Estructuras diferentes: RSS y Atom tienen estructuras diferentes. Mientras que ambos son formatos XML, los elementos y atributos utilizados para representar información varían. Diseñar un algoritmo específico para cada formato facilita la manipulación de datos.
  • Compatibilidad: Diseñar un algoritmo para un formato específico, permite aprovechar las características y elementos específicos de ese formato. Esto permite un procesamiento más preciso y eficiente de la información.
  • Errores y validación: Conocer la estructura específica permite una mejor validación y manejo de errores. Anticipar los posibles elementos que se encontrarán y estructurar el código para manejar casos de manera específica.

Por estos motivos antes de leer un RSS o feed con PHP debemos observar la estructura XML del canal que queremos leer y adaptar el código PHP a esa estructura.

Código PHP para leer un canal RSS o feed

Vamos a ver un ejemplo de código PHP para leer el RSS o feed en el formato Atom del ejemplo anterior. La función PHP debe recibir la URL del feed RSS y mostrar los datos en formato HTML. Para hacer esto, utilizaremos la instrucción simplexml_load_file() para leer y parsear el feed RSS y luego generaremos el contenido HTML correspondiente. El código es el siguiente:

function mostrarFeedComoHTML($urlFeed) {
    $feed = simplexml_load_file($urlFeed);

    if ($feed) {
        echo '<h1>' . $feed->title . '</h1>';
        echo '<p>Enlace del Feed: <a href="' . $feed->link['href'] . '">' . $feed->link['href'] . '</a></p>';
        echo '<p>Actualizado: ' . $feed->updated . '</p>';
        echo '<p>Autor: ' . $feed->author->name . '</p>';
        echo '<p>Identificador único del Feed: ' . $feed->id . '</p>';
        echo '<ul>';
        // Puedes agregar más elementos aquí según la estructura del feed Atom

        foreach ($feed->entry as $entry) {
            echo '<li>';
            echo '<h2>' . $entry->title . '</h2>';
            echo '<p>' . $entry->summary . '</p>';
            echo '<p>Enlace: <a href="' . $entry->link['href'] . '">' . $entry->link['href'] . '</a></p>';
            echo '<p>Actualizado el: ' . $entry->updated . '</p>';
            echo '<p>Identificador único: ' . $entry->id . '</p>';
            if ($entry->content['type'] == 'html') echo '<p>' . html_entity_decode($entry->content) . '</p>';
            else echo '<p>' . $entry->content . '</p>';
            // Puedes agregar más elementos aquí según la estructura del feed Atom
            echo '</li>';
        }
        echo '</ul>';
    } else {
        echo 'No se pudo cargar el feed Atom.';
    }
}

// Llama a la función con la URL del feed Atom
$urlFeed = 'URL_DEL_FEED_ATOM_AQUI';
mostrarFeedComoHTML($urlFeed);

Descripción del código de lectura Atom

Este código PHP tiene como objetivo leer un RSS o feed Atom desde una URL pasada como parámetro y mostrar su contenido en formato HTML. Su funcionamiento es el siguiente:

  • Definición de la función: Se define la función mostrarFeedComoHTML que acepta la URL de un feed Atom como parámetro.
  • Carga del feed Atom: Utiliza simplexml_load_file para cargar el feed Atom desde la URL proporcionada. Este método convierte el XML del feed en un objeto SimpleXML.
  • Comprobación de carga del feed: Si el feed se carga con éxito, se muestra la información general del feed Atom, como el título, el enlace, la fecha de actualización, el autor y el ID del feed.
  • Iteración sobre entradas del feed: Se utiliza un bucle foreach para iterar sobre cada entrada (entry) del feed.
  • Mostrar información de cada entrada: Se muestran elementos específicos de cada entrada, como el título, el resumen, el enlace, la fecha de actualización, el ID y el contenido.
  • Manejo de errores: Si no se puede cargar el feed, se muestra un mensaje de error.
  • Llamada a la fFunción: Se llama a la función con la URL del feed Atom.

Esto sólo es un ejemplo básico sobre cómo leer un RSS o feed con PHP y se puede ampliar según las necesidades específicas de cada canal de distribución. En ocasiones hay canales con muchos más tipos de datos que se pueden añadir a la función como:

            // Manejo de Categorías (si existen)
            if ($entry->category) {
                echo '<p>Categorías: ';
                foreach ($entry->category as $category) {
                    echo $category . ' ';
                }
                echo '</p>';
            }

Leer un RSS o feed con archivos multimedia

Hay ocasiones en que los canales de distribución RSS son muy completos y añaden contenidos multimedia como audios o videos. En este caso nos encontraremos con la etiqueta <enclosure> como en el siguiente ejemplo:

   <entry>
      <title>Título del Artículo</title>
      <link href="URL del Artículo" />
      <id>Identificador único del Artículo</id>
      <updated>Fecha de la última actualización del Artículo</updated>
      <summary>Resumen del Artículo</summary>
      <content type="html">Contenido HTML del Artículo</content>
      <enclosure url="URL del Archivo Adjunto" length="Tamaño del Archivo" type="Tipo de Medio" />
   </entry>

La forma de interpretar el elemento <enclosure> es la siguiente:

  • url: La URL del archivo adjunto.
  • length: El tamaño del archivo.
  • type: El tipo de medio (audio, video, etc.).

Para leer esta propiedad RSS debemos añadir el siguiente código PHP

   if ($enclosure = $entry->enclosure) {
       echo '<p>Adjunto: <a href="' . $enclosure['url'] . '">' . $enclosure['url'] . '</a></p>';
   }

Para mostrar los datos en HTML debemos proceder de la siguiente manera:

  • $enclosure = $entry->enclosure Aquí, se está asignando la propiedad enclosure del elemento entry a la variable $enclosure. Si $entry->enclosure existe, entonces $enclosure contendrá la información del archivo adjunto.
  • En el echo, se está imprimiendo un enlace (<a>) a la URL del archivo adjunto. La estructura de esta línea de código asume que $enclosure es un objeto y que tiene una propiedad url.

Filtrar la salida de un RSS o feed con PHP

En ocasiones hay canales que muestran el contenido html junto con clases CSS, imágenes, etc. que en ocasiones queremos filtrar, mostrar por separado u omitir. En este caso es interesante aplicar algún tipo de filtro con expresiones regulares como:

            $images = [];

            // Extraer imágenes del contenido
            preg_match_all('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', $entry->content, $matches);
            
            if (!empty($matches[1])) {
                $images = $matches[1];
            }

            // Mostrar las imágenes
            foreach ($images as $image) {
                echo '<img src="' . $image . '" alt="Imagen">';
            }

Este código utiliza la función preg_match_all de PHP junto con una expresión regular para buscar todas las coincidencias de etiquetas <img> en una cadena de texto ($entry->content). Si necesitas más información te puede interesar el artículo sobre expresiones regulares donde lo explico más ámpliamente.

Hasta aquí sólo hemos dados unos ejemplos basicos sobre cómo leer un RSS o feed con PHP, manipular sus datos, archivos adjuntos y aplicar filtros. Ahora ya no deberías tener problemas en crear tus propias funciones PHP para leer canales de distribución RSS o feed incluidos Atom.

¡ Espero que este artículo sea de vuestro interés !

Deja un comentario