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;\=\?\-\,\:\;\#\_\~\%\+]*)/', '<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.