Ir directamente al contenido de esta página

Integrar contenido del RSS de Flickr por medio de PHP

Como ya hicimos para el RSS de WordPress, vamos a explicar como aprovechar los feeds que proporciona Flickr para incluir sus contenidos en una página por medio de PHP.

Básicamente, el procedimiento para hacerlo es el mismo que empleamos en la entrada mencionada arriba —uso de DomDocument() y recorrido de los nodos—, por lo que sólo vamos a explicar un punto que puede ser un poco problemático si no se conoce a fondo el estándar del DOM.

Para los impacientes, ésta es la prueba con la galería de fotos que mi mujer mantiene de nuestros gatos, y éste es el código:


<ul>
<?php 
  $xml = new DomDocument();
  $xml->load('http://api.flickr.com/services/feeds/photoset.gne?set=número_del_set&nsid=id_del_usuario&lang=es-us&format=rss2');
  $root = $xml->documentElement;
  $entradas = $root->getElementsByTagName('item');
  for($i=0;$i<($entradas->length);$i++){ 
    $titulo = $entradas->item($i)->getElementsByTagName('title')->item(0)->nodeValue; 
    $vinculo = $entradas->item($i)->getElementsByTagName('link')->item(0)->nodeValue;
    $miniatura = $entradas->item($i)->getElementsByTagNameNS('*','thumbnail')->item(0)->getAttribute('url');
    $fecha = $entradas->item($i)->getElementsByTagName('pubDate')->item(0)->nodeValue;
    $fecha_unix = strtotime($fecha);
    $fecha = strftime("%d/%m/%Y",$fecha_unix);
    echo '<li><a href="'.$vinculo.'"><img src="'.$miniatura.'" width="120" height="120" alt="" /></a> <i>'.$titulo.'</i> '.$fecha.'</li>'; 
  }
?>
</ul>
	

Ahora, si alguien quiere saber algo más…

Paso a paso

El primer paso indispensable es localizar el RSS del que queremos extraer la información. Cuando se trata de una galería pública, se localiza debajo de las miniaturas:

El vínculo al RSS que necesitamos

Para la pequeña galería que quiero crear sólo voy a emplear de cada entrada del RSS el título de la imagen, la fecha en la que se publicó, el vínculo a la página de Flickr y el URL de la miniatura.

Los que ya hayan leído la entrada indicada sabrán que una vez cargado el feed por medio de DomDocument() sólo es cuestión de recorrerlo para localizar el contenido de los elementos title, link y pubDate.

Pero… ¿de dónde saco las miniaturas? ¿Cuál es el elemento definido en RSS 2.0 para etiquetarlas? Pues ninguno, no existe nada como <thumbnail>url</thumbnail>. Para incluir esa información, en Flickr han empleado un espacio de nombresmedia— creado por Yahoo, y que declaran en la raíz del RSS:


<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/" [...] > 
 

En éste precisamente definen thumbnail, y lo encontramos en el feed de esta manera:


<media:thumbnail url="url_de_la_miniatura" height="75" width="75" /> 
 

Como se trata de un elemento de un espacio de nombres, no podemos extraerlo del DOM por medio de getElementsByTagName() como lo hacemos para el título o la fecha, sino que tenemos que emplear getElementsByTagNameNS(), un método que necesita dos parámetros: el prefijo del espacio de nombres y el nombre del elemento. En nuestro código lo empleamos así:


$miniatura = $entradas->item($i)->getElementsByTagNameNS('*','thumbnail')->item(0)->getAttribute('url'); 
 

Como es imprescindible indicar ambos parámetros, pero el prefijo nos resulta irrelevante, empleamos el asterisco.

Y con esto, ya obtenemos todos los datos que necesitamos para integrar nuestra galería.

¿Pero no existen ya librerías para hacer esto?

Tal vez alguien se preguntará: «¿por qué no emplear phpFlickr o MagpieRSS?, ¿hay algún problema con ellas?». En absoluto, son librerías muy potentes y sus autores han realizado un trabajo encomiable. No obstante, nosotros nos decantamos por la economía de medios: no estamos seguros, pero intuimos que por el principio de Pareto el 80% del empleo común de estas librerías no agota ni el 20% de sus capacidades. Si lo que se pretende es crear una aplicación que deba consumir de forma intensiva recursos de Flickr, no hay duda de que son tremendamente eficaces, ¿pero para incluir las miniaturas de una galería pública con sus respectivos enlaces? Creemos que son innecesarias.

Esta entrada se publicó el 29 de septiembre de 2010, se archivó en , y fue etiquetada como , . Autor: Saúl González Fernández. Hay 4 comentarios ›.

Comentarios

  1. Fliberty dice:

    ¿Qué tal amigo?

    El código me ha ido de maravilla, sin embargo, ¿sabes si es posible obtener el URL de la imagen original, para que a partir del enlace cargue la imagen en grande?

    Muchas gracias.

  2. Saúl González Fernández dice:

    @Fliberty: Dentro del for añade esta línea antes del echo:

    
    $imagen = $entradas->item($i)->getElementsByTagName('enclosure')->item(0)->getAttribute('url');
     

    Así en la variable $imagen ya tendrás el URL de la fotografía.

  3. Sergio dice:

    Hola Saúl,
    Me da error cuando no hay imagen en un item, ¿cómo puedo solucionarlo?.
    Adjunto el código utilizado (obtenido del tuyo).
    Muchas gracias.

    
    load('http://elpais.com/tag/rss/banca/a/');
      $root = $xml->documentElement;
      $entradas = $root->getElementsByTagName('item');
      for($i=0;$ilength);$i++){ 
        $titulo = $entradas->item($i)->getElementsByTagName('title')->item(0)->nodeValue; 
        $vinculo = $entradas->item($i)->getElementsByTagName('link')->item(0)->nodeValue;
        $imagen = $entradas->item($i)->getElementsByTagName('enclosure')->item(0)->getAttribute('url');
        $description = $entradas->item($i)->getElementsByTagName('description')->item(0)->nodeValue;
        $fecha = $entradas->item($i)->getElementsByTagName('pubDate')->item(0)->nodeValue;
        $fecha_unix = strtotime($fecha);
        $fecha = strftime("%d/%m/%Y",$fecha_unix);
        echo '<a href="'.$vinculo.'" rel="nofollow>>'.$fecha.' '.$titulo.'</a> '.$description.' '; 
      }
    ?>
    
  4. Saúl González Fernández dice:

    @Sergio: Puedes probar con un bloque try().

¿Algún comentario?

* Los campos con un asterisco son necesarios

Últimos proyectos

© Digital Icon, S.L., 2007 – 2017