[PHP] Cómo unir / combinar distintos feeds RSS en uno utilizando tu propio servidor

En este caso práctico vamos a explicarte cómo unir distintos feeds RSS en uno solo. A nosotros nos hizo falta para programar algunas newsletters automáticas que se alimentan de feeds RSS, y como fue un poco complicado unir las piezas, te traemos un tutorial paso a paso sobre cómo hacerlo.

Es cierto que existen plataformas que te permiten hacer esto online, pero depender de esas plataformas implica, o bien tener dificultades a la hora de añadir feeds a la mezcla, o bien que el número de feeds a añadir sea limitado. Esto lo evitas teniendo tu propio script en tu servidor, con el que puedes hacer lo que quieras, como quieras, cuando quieras. ¿Empezamos?

Preparar el entorno

Para este proyecto vamos a instalar una librería PHP de código abierto llamada «SimplePie», que es la que nos va a permitir manejar los feeds RSS. Seguidamente, crearemos un script en PHP que, llamando a esta librería, nos permitirá unir los distintos feeds RSS en uno.

Conseguir SimplePie

Para obtener SimplePie, de forma que puedas instalarlo en tu servidor, basta con ir a http://simplepie.org/ y darle a «descargar». Esto te bajará un archivo comprimido con unos archivos en su interior, sin embargo no vas a necesitarlos todos, ahora entenderás por qué.

Instalar SimplePie

La instalación de SimplePie es bastante sencilla, y solamente necesitarás acceso FTP. Un programa como Filezilla puede hacerte el trabajo si sabes cómo usarlo. Suponiendo que quieres llamar a la librería desde tudominio/php, vamos a hacer lo siguiente:

  1. En la carpeta raíz de tu dominio crea dos carpetas, una llamada «php» y la otra llamada «cache»
  2. A la carpeta «cache» dale permisos 777 por si las moscas
  3. Dentro de la carpeta «php» sube la carpeta «library» y el archivo «autoloader.php» que se encuentran en el archivo comprimido que descargaste antes. Lo demás lo puedes desechar

Llegados a este punto, ya tienes funcional la librería SimplePie, y podemos trabajar en el script que te haga el trabajo de juntas los distintos feeds RSS.

Crear el script

Crea un archivo en banco donde quieras con el nombre que quieras, y ponle la extensión PHP. Por ejemplo, puedes crear un archivo llamado «feedcombinado.php» en la raíz de tu dominio.

Dentro de ese archivo vamos a pegar un código basado en el trabajo de hhje22 hace más de 8 años, pero que tendremos que actualizar un poco porque está obsoleto. Aún así es muy buen código, y los cambios serán mínimos. Te dejamos el código tal cual lo hemos adaptado en el entorno antes mencionado. Simplemente tendrás que cambiar aquellos datos necesarios para que se adapte a tus necesidades. Sin embargo, con los datos que tiene puedes probar si realmente funciona.

<?php 
/* Merge multiple RSS feeds with SimplePie
 *
 * Just modify the path to SimplePie and 
 * modify the $feeds array with the feeds you want
 *
 * You should probably also change the channel title, link and description,
 * plus I added a CC license you may not want
 *
 * Help from: http://www.webmaster-source.com/2007/08/06/merging-rss-feeds-with-simplepie/ and https://digitalfreelancing.eu/?p=87313
 * 
 *
*/
header('Content-Type: application/rss+xml; charset=UTF-8');
// Your path to simplepie
include_once('./php/autoloader.php');
//
$feedlink = "https://oliverdelarosa.com/feedcombinado.php"; // URL for this feed, <atom:link>
$feedtitle = "Post de Oliver de la Rosa"; // <title>
$feedhome = "https://OliverdelaRosa.com"; // <link>
$feeddesc = "Feed de todos los post de Oliver de la Rosa en Internet"; // <link>
// Feeds you want to aggregate
$feeds = array(
    'https://oliverdelarosa.com/feed/',
    'https://digitalfreelancing.eu/feed/?lang=es',
	'https://digitalfreelancing.eu/feed',
    'https://derobots.online/author/oliverdelarosa/feed',
	'https://micocina.online/author/oliverdelarosa/feed',
    'https://thefinancialfreedom.online/author/oliverdelarosa/feed',
    'https://lalibertadfinanciera.online/author/oliverdelarosa/feed',
    'https://electrycan.com/author/oliverdelarosa/feed',
    'https://vivirabordo.com/author/OliverdelaRosa/feed',
    'https://demariposas.online/author/oliverdelarosa/feed',
    'https://cursosbaratos.online/author/oliverdelarosa/feed',
    'https://generadores.online/author/OliverdelaRosa/feed/',
    'https://proveedorindustrial.online/author/OliverdelaRosa/feed/',
    'https://fundasbaratas.online/author/OliverdelaRosa/feed',
    'https://playasdecanarias.com/author/OliverdelaRosa/feed/',
    'https://www.youtube.com/feeds/videos.xml?channel_id=UCWFRESFCQjtDv0egKR3j40Q'
    
    
    
    
);
echo '<?xml version="1.0" encoding="UTF-8"?>'; 
?>
<rss version="2.0" 
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>
<channel>
<title><?php echo $feedtitle; ?></title>
<atom:link href="<?php echo $feedlink; ?>" rel="self" type="application/rss+xml" />
<link><?php echo $feedhome; ?></link>
<description><?php echo $feeddesc; ?></description>
<language>en-us</language>
<copyright>Copyright <?php echo '2007-'.date("Y");  ?></copyright>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>

<?php
date_default_timezone_set('America/Chicago');
$feed = new SimplePie(); // Create a new instance of SimplePie
// Load the feeds
$feed->set_feed_url($feeds);
$feed->set_cache_duration (600); // Set the cache time
$feed->enable_xml_dump(isset($_GET['xmldump']) ? true : false);
$success = $feed->init(); // Initialize SimplePie
$feed->handle_content_type(); // Take care of the character encoding
?>


<?php if ($success) {
$itemlimit=0;
foreach($feed->get_items() as $item) {
if ($itemlimit==40) { break; }
?>

    <item>
        <title><?php echo $item->get_title(); ?></title>
        <link><?php echo $item->get_permalink(); ?></link>
        <guid><?php echo $item->get_permalink(); ?></guid>
        <pubDate><?php echo $item->get_date('D, d M Y H:i:s T'); ?></pubDate>
        <dc:creator><?php if ($author = $item->get_author()) { echo $author->get_name()." at "; }; ?><?php if ($feed_title = $item->get_feed()->get_title()) {echo $feed_title;}?></dc:creator>
        <description>
        <?php echo htmlspecialchars(strip_tags($item->get_description())); ?>
        </description>
        <content:encoded><![CDATA[<?php echo $item->get_content(); ?>]]></content:encoded>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
    </item>
<?
$itemlimit = $itemlimit + 1;
}
}
?>
</channel>
</rss>

Corrección de posibles problemas

Si el script no funciona, comprueba que la ruta hacia el archivo autoloader.php en la línea 16 es correcta, y que SimplePie está correctamente instalado en las carpetas que hemos mencionado.


Desde Digital Freelancing OÜ esperamos que te haya servido este tutorial, si ha sido así compártelo en tus redes sociales y déjanos un comentarios con tus impresiones. También puedes escribirnos para cualquier duda o aportación que tengas sobre este asunto, estaremos encantados de ayudarte.