Cliente AIR de Twitter para monitorear Conferencias

17 July, 2009 (11:01) | Edgar Parada | Flex, air

El siguiente es un tutorial que espero sea útil para todos aquellos que alguna vez han organizado un evento/conferencia y quieren una idea novedosa para mantener informada a la audiencia en tiempo real de lo que se dice del evento.

Aprovechando algunas tecnologías como Flex, AIR y Twitter vamos a construir un cliente que permita mostrar los feeds generados por el Search API de Twitter. Esta aplicación se puede distribuir entre los asistentes no importando su plataforma: Windows, Mac o Linux; también es posible dejarla corriendo en proyectores, kioscos o pantallas LCD.

Requisitos Previos

Tener instalado Flex Builder (http://www.adobe.com/go/flex_trial)

Tener una fuente de datos basada en XML, puede ser un RSS, XML, ATOM, etc... para el ejemplo usaremos un feed generado por el Search API de Twitter:

http://search.twitter.com/search.rss?q=adobenvivo

Primera Parte - Recopilando los datos

Comenzamos creando un proyecto nuevo en Flex de escritorio (aplicación AIR), esto se logra en Flex Builder con el comando File > New > Flex Project

Le damos un nombre al proyecto (p.ej TwitterReader)

twitter_1

En el archivo principal TwitterReader.mxml vamos a usar un componente llamado HTTPService para cargar los datos, así mismo vamos a agregarle unas cuantas propiedades al componente principal WindowedApplication el código base queda de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="absolute" themeColor="#d8d8d8" 
	width="250" height="670" 
	horizontalScrollPolicy="off" verticalScrollPolicy="off"
	horizontalGap="0" verticalGap="0">
 
	<mx:HTTPService id="AEVdata" url="http://search.twitter.com/search.rss?q=adobeenvivo"  />
 
</mx:WindowedApplication>

Las propiedades aplicadas al componente WindowedApplication permitiren ir definiendo el layout de la aplicación, un color de resaltado; así como restringir la aparición de scrollbars horizontales. El componente HTTPService necesita un id para referenciarlo y una url de donde están los datos.

Segunda Parte - Creando los Renderers

Vamos a crear una nueva carpeta debajo de src llamada renderers donde estará un componente personalizado para mostrar los datos mediante una imagen y un texto.

Lo anterior lo logramos con clic secundario sobre carpeta src > New > Folder

twitter_2

Después creamos el componente personalizado con el comando File > New > MXML Component

twitter_3

Le asignamos un nombre TwitterRenderer y nos basamos en HBox con un tamaño de 240 pixeles de ancho por 90 pixeles de alto.

twitter_4

Dentro de ese componente agregamos algunas propiedades y un par de componentes: Image y Text, el código queda de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" 
	width="240" height="90" fontSize="9" 
	horizontalAlign="center" verticalAlign="middle" 
	horizontalScrollPolicy="off" verticalScrollPolicy="off">
 
	<mx:Image width="50" height="50" source="{data.content.url}" 
		toolTip="{data.author}" buttonMode="true" 
		click="navigateToURL(new URLRequest(data.guid));" />
 
	<mx:Text width="150" text="{data.title}"  />	
 
</mx:HBox>

La mayoría de las propiedades son para definir tamaño de tipografías, layout y comportamiento de scrollbars. Las propiedades que estan envueltas entre { } y contienen data, hacen referencia continua (bindings) a los datos que cargaremos en el componente, que vienen del modelo de datos que plantea el RSS. Hay un evento click asociado al componente Image que nos llevará al status de ese mensaje.

Tercera Parte - Integración del Componente

Para integrar el componente personalizado que creamos, solo hace falta ir de nuevo a la aplicaicón principal TwitterReader.mxml y utilizarlo como itemRenderer dentro de cualquier componente basado en lista que permita mostrar datos, en el ejemplo utilizaremos un TileList también agregamos una propiedad para mostrar el relojito al cargar datos en HTTPService llamada showBusyCursor.

 <?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="absolute" themeColor="#d8d8d8" 
	width="250" height="670" horizontalScrollPolicy="off"
	horizontalGap="0" verticalGap="0">
 
	<mx:HTTPService id="AEVdata" url="http://search.twitter.com/search.rss?q=adobeenvivo" 
		showBusyCursor="true" />
 
	<mx:TileList id="ARVtile" 
		dataProvider="{AEVdata.lastResult.rss.channel.item}"
		width="100%" height="100%"
		itemRenderer="renderers.TwitterRenderer"
		alternatingItemColors="[#cccccc, #dadada]" />
 
</mx:WindowedApplication>

Cuarta Parte - Lógica de la Aplicación mediante ActionScript 3

Para la última parte del “desarrollo” de la aplicación es necesario programar un poco, mediante ActionScript 3, recuerden que lo que hacemos en Flex es describir la estructura de la aplicación mediante MXML y programar la lógica de negocio con ActionScript 3. Incorporamos un bloque de código y un evento creationComplete a la aplicación principal y con esto último terminamos la aplicación.

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
	creationComplete="init()" layout="absolute" themeColor="#d8d8d8" 
	width="250" height="670" horizontalScrollPolicy="off"
	horizontalGap="0" verticalGap="0">
 
	<mx:Script>
		import flash.net.*;
		import flash.utils.Timer;
 
		private function init():void
		{   
			AEVdata.send();
			var delay:uint = 100000;
			var myTimer:Timer = new Timer(delay);
			myTimer.start(); 
			myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
		}
 
		private function timerHandler(e:TimerEvent):void{
			AEVdata.send();
		}
 
	</mx:Script>
 
	<mx:HTTPService id="AEVdata" url="http://search.twitter.com/search.rss?q=adobeenvivo" 
		showBusyCursor="true" />
 
	<mx:TileList id="ARVtile" 
		dataProvider="{AEVdata.lastResult.rss.channel.item}"
		width="100%" height="100%"
		itemRenderer="renderers.TwitterRenderer"
		alternatingItemColors="[#cccccc, #dadada]" />
 
</mx:WindowedApplication>

La función init() manda llamar los datos del componente HTTPService y crea un Timer (temporizador) que en combinación con la función timeHandler() pedirá los datos cada 100 segundos, este valor lo establecemos con la variable delay que esta en milisegundos.

Parte Final - Empaquetamiento de la aplicación AIR

Hemos llegado al final del tutorial, solamente hace falta un último paso antes de tener un archivo .air totalmente multiplataforma, hay que utilizar el comando Project > Export Release Build

Aparecerá un asistente muy fácil de seguir el cuál nos pedirá algunos datos de la aplicación, así como un certificado, si no contamos con uno desde el mismo asistente podemos crearlo.

twitter_5

Para ver la aplicación final pueden descargarla del post anterior

Espero que les haya gustado el tutorial y cualquier duda pueden dejarme un comentario en este post o buscarme en Twitter como @edgarparada

Comentarios

Pingback de Bootcamp Flex/AIR en Activ | www.riactive.com
Fecha: July 17, 2009, 11:34 am

[...] queremos invitarlos a un Bootcamp que hemos estados preparando y del cuál pueden tener una muestra este post, el enfoque principal es Aprender a hacer una RIA con Flex/AIR y decidimos utilizar un API de un [...]

Comentario de Jorge A. Díaz
Fecha: July 17, 2009, 9:29 pm

Genial el post. Muy pero muy original para mostrar la combinación de Fx, AS3 y la API de Twitter.

Saludos desde Cuba

Comentario de itzco
Fecha: August 13, 2009, 4:34 am

Edgar,

Basado en este tutorial (aunque no me quedo tan bonito), como conectar con una fuente de datos de Tequila.
http://sites.google.com/site/phptequila/tutorials-1/interacting-with-flex

Saludos

Comentario de isantos
Fecha: August 13, 2009, 5:37 pm

que tal… gracias por la info, muy buena por cierto :D

sabes si existe un limite de llamadas a la api de twitter haciendo uso de search en rss??? por ejemplo si quiero hacer lo que comentas pero si actualizo cada segundo ya serian 3600 llamadas en una hora…

sabes algo acerca de eso o no hay limite de llamadas???

espero me puedas ayudar
saludos;)

Comentario de Patrick Suquet
Fecha: August 14, 2009, 8:10 am

Twitter solo permite que aplicaciones de terceros hagan 20,000 peticiones por hora al API (desde una misma IP).

En aplicaciones para móviles por lo general no puedes hacer más de 70 llamadas desde algún cliente Twitter

Saludos

Escribir comentario