rss
twitter
  •  

Lector RSS de Twitter ideal para Frameworks

| Posted in General |

4

Para un proyecto que estoy desarrollando debía mostrar los últimos X tweets de una cuenta en twitter sin usar JavaScript, sólo PHP; y además debía realizar las labores de “parsing” a las etiquetas # y @ para poder auto-enlazar a su correspondiente query de twitter y además, mostrar “hace cuánto fue escrita la entrada”, es decir: tiempo relativo.

Al no encontrar nada de esto en la web, me dí a la tarea de hacerlo yo mismo, uniendo varias piezas creadas por otros autores incluso en otro lenguajes de programación.

Debo decir que es perfectamente acoplable a cualquier framework en forma de un partial. Puedo decir que corre perfectamente con CodeIgniter.

A continuación, mi humilde aporte:


<?php
/**
 * Visualizar Twitter RSS
 * By: Alexander Garzon (www.php.com.ve)
 * @param string $rss_twitter URL completa del feed RSS
 * @style DIV class named rss_twitter
 * @return html
 */

class RSS_Twitter {

    //Determina si el número (en palabra) es plural si es mayor a 1
    public static function Pluralidad($val, $qty) {
        if ($val > 1) return $val.' '.$qty.'s';
        else return $val.' '.$qty;
    }
    //Calcula el tiempo relativo (diferencia) según una determinada y el presente.
    public static function TiempoRelativo($seconds) {
        if (($seconds / 604800) > 1) return 'Hace '.RSS_Twitter::Pluralidad(round($seconds / 604800), 'semana');
        elseif (($seconds / 86400) > 1) return 'Hace '.RSS_Twitter::Pluralidad(round($seconds / 86400), 'día');
        elseif (($seconds / 3600) > 1) return 'Hace '.RSS_Twitter::Pluralidad(round($seconds / 3600), 'hora');
        elseif (($seconds / 60 ) > 1) return 'Hace '.RSS_Twitter::Pluralidad(round($seconds / 60), 'minuto');
        else return 'Hace '.RSS_Twitter::Pluralidad($seconds, 'segundo');
    }

    public static function FormatoTiempo($tiempocadena) {
        $timestamp = strtotime($tiempocadena);
        $diferencia = time() - $timestamp;
        return RSS_Twitter::TiempoRelativo($diferencia);
    }

    public static function TweetFilter($tweet) {
        //Filtra contenidos del tweet (para links, #tags y @respuestas

        //Se elimina el nmombre del mismo autor en el mensaje (es redundante)
        $pos = strpos($tweet, ":");
        $salida = substr_replace($tweet, '', 0,$pos+2); // El +2 es refiere a el simbolo ':' y el espacio en blanco que le sigue.

        //Agregamos links a los http
        $salida = preg_replace('/(http:\/\/)(.*?)\/([\w\.\/\&amp;amp;\=\?\-\,\:\;\#\_\~\%\+]*)/', '<a href="$0" onclick="window.open(this.href); return false;">$0</a>', $salida);
        //Agregamos links a los @
        $salida = preg_replace('/\B@([_a-zA-Z0-9-]+)/','@<a href="http://twitter.com/$1" onclick="window.open(this.href); return false;">$1</a>',$salida);
        //Agregamos links a los #
        $salida = preg_replace('/\B#([_a-zA-Z0-9-]+)/','<a href="http://search.twitter.com/search?q=%23$1" onclick="window.open(this.href); return false;">#$1</a>',$salida);

        return $salida;

    }
    //Extrae y publica los tweets del RSS
    public static function TweetReader($url) {
        if (!@simplexml_load_file($url)) {
            echo "Error enlazando a Twitter, intente de nuevo";
        } else {
            $feed = simplexml_load_file($url);
            foreach ($feed->channel->item as $item) :
                echo "<div class=\"rss_twitter\">";
                echo $array['title'] = (RSS_Twitter::TweetFilter($item->title))."<br />".PHP_EOL;
                echo "<a href=\"$item->link\" onclick=\"window.open(this.href); return false;\">".RSS_Twitter::FormatoTiempo($item->pubDate)."</a><br />".PHP_EOL;
                echo "<br /></div>".PHP_EOL;
            endforeach;
        }

    }

}

RSS_Twitter::TweetReader($rss_twitter);

?>

Lo único que nos falta es proveer la variable $rss_twitter que corresponde a la ruta absoluta del canal RSS de la cuenta Twitter que deseamos mostrar y además la cantidad de “tweets” que mostraremos, esa ruta viene siendo algo como por ejemplo:

http://twitter.com/statuses/user_timeline/28505702.rss?count=3

Donde 28505702 es el ID de la cuenta de Twitter y 3 es la cantidad de Tweets que mostraremos.

Espero les sea de utilidad.

ACTUALIZACIÓN 12/07/2010: Le he agregado una validación simple para en caso de que por alguna razón Twitter esté caído.

Comentarios (4)

Hola,

Un humilde añadido para la función: TweetFilter

En la línea 47 añadimos:
//Repasamos los caracteres especiales
$salida = utf8_decode($salida);

Un saludo

Gracias ;-)

Hola,

De nuevo muchas gracias por tu clase. En mi anterior comentario sugerí lo que creía una mejora para corregir ciertos caracteres extraños que me aparecieron al probar tu código en un fichero totalmente vacío con el único código:

include(‘RSS_Twitter.php’);
$rss_twitter = ‘http://twitter.com/statuses/user_timeline/28505702.rss?count=3
RSS_Twitter::TweetReader($rss_twitter);

Sin embargo cuando añadí ese mismo código a la web en la que estoy trabajando me volvieron a salir caracteres extraños. Y sólo se resolvió al quitar la función de php: decode sugerida anteriormente.

Por lo que veo está relacionado con la meta etiqueta de codificación:

Al incluir esta etiqueta y la función php: utf8_decode vuelven a aparecer caracteres extraños.

Así es que finalmente la he quitado y lo único que he tenido que hacer es reemplazar día por día en la función: TiempoRelativo

Escribo todo esto aquí por si algún otro newbie del PHP y el twitter como yo se encuentra con problemas para inicializar la clase y hacerla funcionar o con las tildes y demás.

Un saludo y gracias de nuevo

Hmmm veo que ha filtrado la metaetiqueta:

Bueno, eso y que el código de inicialización va entre tags php claro jejej

Escriba un comentario

*