rss
twitter
  •  

Lector RSS de Twitter ideal para Frameworks

| Posted in General |

2

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.

Compartir:
  • Facebook
  • Twitter
  • Digg
  • Meneame
  • StumbleUpon
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Netvibes

Comentarios (2)

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 ;-)

Escriba un comentario