jan 8, 2010

Posted by in Redes Sociais, Tutoriais | 12 comments

Consumindo dados do Twitter com Actionscript 3.0

Consumindo dados do Twitter com Actionscript 3.0

[ATUALIZAÇÂO]
Esse post foi atualizado, agora você pode passar todos os parâmetros que a URL http://search.twitter.com oferece.

Nesse tutorial vou mostrar como acessar dados do Twitter via XML pela URL de busca do Twitter, é um tutorial básico que visa trabalhar com uma simples integração.

Basicamente o que fazemos é acessar um XML gerado pela busca do Twitter e fazer o “parser” desses dados, esse tutorial não vai abordar o tema de inclusão desses resultados no Stage do Flash, apenas a obtenção desses resultados através de manipulação de XML.

Exemplo depois de uma pequena customização na classe Consome.as para incluir os “tweets” no layout.
Exemplo

Basicamente vamos trabalhar com 3 classes, são elas:

GetTweet.as

  • Essa é a classe que vai fazer a conexão com o XML e vai tratar os dados
package lmcosta.redesocial.twitter
{
	import flash.display.MovieClip;

	import flash.events.Event
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;

	import flash.net.URLLoader;
	import flash.net.URLRequest;

	import lmcosta.redesocial.twitter.event.TwitterEvents

	/**
	 * ...
	 * @author LucasMarçal
	 */
	public class GetTweet extends MovieClip
	{
		public var qtdTweets:Number
		public var arrTweets:Array;
		public var url:String;
		private var _total:Number

		public function GetTweet() {}

		/**
		 *
		 * @param	_usuario:String  				Nome de usuário que você quer buscar
		 * @param	_qtd:Number       				Quantidade de Tweets que você quer que retorne
		 * @param	_palavra:String					Uma palavra específica
		 * @param	_frase:String					Uma frase específica
		 * @param	_qualquerPalavra:String			Qualquer uma dessas palavras
		 * @param	_nenhumaPalavra:String			Nenhuma dessas palavras
		 * @param	_tag:String						Uma Hastag específica
		 * @param	_idioma:String					Idioma, verificar a lista de idioma e seus valores
		 * @param	_twitterAmigo:String			Enviado para essa pessoa
		 * @param	_refAmigo:String				Referênciando essa pessoa
		 * @param	_cidade:String					Cidade específica
		 * @param	_dataInicial:String				Data inicial formato (0000-00-00) sendo Ano-Mês-Dia
		 * @param	_dataFinal:Stirng				Data Final formato (0000-00-00) sendo Ano-Mês-Dia
		 */
		public function configuraPesquisa(parametros:Object):void
		{
			this.url = "http://search.twitter.com/search.atom?q=+from:" + parametros.usuario + "&rpp=" +parametros.qtd + "&ands=" + parametros.palavra + "&phrase=" + parametros.frase + "&ors=" + parametros.qualquerPalavra + "&nots=" + parametros.nenhumaPalavra + "&tag=" + parametros.tag + "&lang=" + parametros.idioma + "&to=" + parametros.twitterAmigo + "&ref=" + parametros.refAmigo + "&near=" + parametros.cidade + "&since=" + parametros.dataInicial + "&until=" + parametros.dataFinal ;

			var urlReq:URLRequest =  new URLRequest(this.url);
			var loader:URLLoader =  new URLLoader();

			loader.addEventListener(Event.COMPLETE , carregouXML);
			loader.addEventListener(IOErrorEvent.IO_ERROR, erroLoadXML);
			loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, erroSeguranca);

			this.addEventListener(TwitterEvents.PARSER_COMPLETO, onComplete);

			loader.load(urlReq);
		}

		private function carregouXML(e:Event):void
		{
			if (e.target.data)
			{
				this.arrTweets =  new Array();

				var twitterXML:XML =  new XML(e.target.data);
				var twitterList:XMLList =  twitterXML.children();

				var tweet:String;
				var data:String;
				var nomeUsuario:String

				for (var i:int = 0; i < twitterList.length(); i++)
				{
					if (tweet != "")
					{
						this.arrTweets.push({usuario:twitterList[i]..*::name, tweet:twitterList[i].*::title,data:twitterList[i].*::published});
					}
				}
				this._total = this.arrTweets.length
				dispatchEvent(new TwitterEvents(TwitterEvents.PARSER_COMPLETO));
			}
		}

		private function erroLoadXML(e:Event):void
		{
			trace("IO Error!");
		}

		private function erroSeguranca(e:Event):void
		{
			trace("Security Error!");
		}
		private function onComplete(e:TwitterEvents):void
		{
			dispatchEvent(new TwitterEvents (TwitterEvents.DADOS_RECEBIDOS));
		}

		public function get dados():Array
		{
			return this.arrTweets;
		}

		public function get total():Number
		{
			return _total;
		}
	}

}

TwitterEvents.as

  • Uma classe de eventos personalizada que informa quando os dados já estão completos (URLRequest) e quando o “parser” já foi finalizado.
package lmcosta.redesocial.twitter.event
{
	import flash.events.Event;

	/**
	 * ...
	 * @author LucasMarçal
	 */
	public class TwitterEvents extends Event
	{
		public static const PARSER_COMPLETO:String = "PARSERCOMPLETO";
		public static const DADOS_RECEBIDOS:String = "RECEBEU";

		public function TwitterEvents(tipo:String,bubbles:Boolean=false,cancel:Boolean=false)
		{
			super(tipo, bubbles, cancel);
		}

	}

}

Primeiro Frame do ser arquivo

  • Responsável por criar uma instancia da classe GetTweet, você pode criar uma classe e colocar esse código, optei por fazer assim por ser mais fácil para quem está iniciando
//SUPER IMPORTANTE
//Lembre-se que você tem que ter configurado
//para que o seu classPath seja "src"
//para isso vá em CTRL + F12 > Aba Flash> Settings > Botão de + e adicione "./src/"

//Importando as classes necessárias
import lmcosta.redesocial.twitter.GetTweet
import lmcosta.redesocial.twitter.event.TwitterEvents

//Criando uma instância da classe GetTweet
var rede:GetTweet =  new GetTweet();

/**
 * PARAMETROS INICIAIS
 * @param	_usuario:String  				Nome de usuário que você quer buscar
 * @param	_qtd:Number       				Quantidade de Tweets que você quer que retorne
 * @param	_palavra:String					Uma palavra específica
 * @param	_frase:String					Uma frase específica
 * @param	_qualquerPalavra:String			Qualquer uma dessas palavras
 * @param	_nenhumaPalavra:String			Nenhuma dessas palavras
 * @param	_tag:String						Uma Hastag específica
 * @param	_idioma:String					Idioma, verificar a lista de idioma e seus valores
 * @param	_twitterAmigo:String			Enviado para essa pessoa
 * @param	_refAmigo:String				Referênciando essa pessoa
 * @param	_cidade:String					Cidade específica
 * @param	_dataInicial:String				Data inicial formato (0000-00-00) sendo Ano-Mês-Dia
 * @param	_dataFinal:Stirng				Data Final formato (0000-00-00) sendo Ano-Mês-Dia
*/

var parametros:Object = {usuario:"lmcosta",
						 qtd:1,
						 palavra:"",
						 frase:"",
						 qualquerPalavra:"",
						 nenhumaPalavra:"",
						 tag:"",
						 idioma:"",
						 twitterAmigo:"",
						 refAmigo:"",
						 cidade:"",
						 dataInicial:"",
						 dataFinal:""
						 }

//Passando parametros iniciais, veja lista abaixo
rede.configuraPesquisa(parametros);

//Registrando um Listeners baseado na classe customizada de Eventos
//Toda vez que a busca retornar um resultado e os dados forem recebidos
//Esse Listener vai executar o código que estiver na função de callback
//Nesse caso a função onRecebe;
this.rede.addEventListener(TwitterEvents.DADOS_RECEBIDOS,onRecebe);

function onRecebe (e:TwitterEvents):void
{
	//Use essa forma para retornar o total re resultado
	trace("Total de Resultados: " + this.rede.total);
	for(var i:Number = 0; i < this.rede.dados.length; i++)
	{
		//Retornando Usuario
		trace("Usuario: " + this.rede.dados[i].usuario)
		//Retornando Datas
		trace("data: " + this.rede.dados[i].data)
		//Retornando Tweet
		trace("Tweets: " + this.rede.dados[i].tweet)
	}
}

  1. Esse código simplesmente não funciona. Precisa testar antes de postar alguma coisa que ache realmente útil. Só perda de tempo.

  2. Sr. Paulo
    O fato de você não conseguir copiar e colar um código do meu blog não quer dizer que ele não funcione, seu comentário foi desnecessário e mostra a sua real falta de capacidade!
    Abs!

  3. Excelente cara!

    Fiz uns testes aqui, implementei com uma outra classe que criei e consegui exibir os dados do twitter no palco.

    Valeu pelo post!

    Abraço!

  4. Maicon Rosairo da Cruz disse:

    Ta de Parabéns, funcionou Perfeitamente

  5. Ótimo código, funcionou no meu frame! Logo mais meu site está no ar e faço meu convite para ver o resultado!
    Seu site está no meus links de parceiros no meu blog!
    Parabéns!

  6. Guto Mendonça disse:

    Não funciona. Copiar e colar? MMM fail … Alguém capacitado me explica qual a mágica usada pra fazer funcionar? Só para registrar: vi um código bem igual no iMasters (funcionando) … Algum evento transcedental de compartilhamento de idéias? Busted ….

  7. Legal a classe, mas você podia fazer umas alterações que na minha opinião a deixariam melhor. Exemplo, ao invés de concatenar todos os parâmetros na url, coloca ele num URLVariables, fica mais organizado por causa da quantidade de argumentos.

    E você poderia deixar isso dinâmico…

    var vars:URLVariables = new URLVariables()
    for (var param:String in params)
    vars[param] = params[param]

    Isso já “popularia” nosso URLVariables com os argumentos passados no objeto “parametros”. E a nomenclatura deles seria a mesma da documentação da Search API do Twitter.

    Obs.:
    arrTweets[i] = … é mais rápido que arrTweets.push(…) ;)

  8. Salve Leo, legal essa dica, quando tiver um tempo eu faço!
    Quanto ao comentário do Guto Mendonça, cara faz um favor não precisa voltar aqui não!!!!

    Esse blog existe apenas para que eu compartilhe minhas idéias com PROFISSIONAIS ou estudantes de AS3, não sei se esse código tem alguma referência ou não porque a primeira vez que fiz ele foi em 2009 eu acho. enfim, se tem, só me avisar o link que com certeza será publicado!

    E Guto, vai pro inferno!!!! e fica por lá!

  9. Ola, muito bacana esta dica ja utilizei-a em diversos trabalhos, to me batendo aqui com o xml da api de dados do youtube, por acaso ja utilizou?

    http://code.google.com/intl/pt-BR/apis/youtube/reference.html#API_Request_XML_Element_Definitions

    simplesmente não estou conseguindo ler o xml, imagino que tenha a ver com os namespaces, se tivesse uma luz agradeceria muito.

    Minha intenção é fazer a consulta online de um canal determinado, para que a galeria de videos do site de meu cliente fique atualizada automaticamente.

    Abraço

    Maicon

  10. Gostei do post, mas preciso de algum script para bt em Flash do Twitter que mostre o resultado da pontuação de um Quiz (ao estilo “perguntas x respostas”), alguém sabe de algum pronto?

  11. Parabens muito simples e funcional a class.

  12. Testei e funcionou. Mas apareceu alguns campos em brancos.

    Para arrumar, adicionar na linha 77, do arquivo GetTweet.as:
    (…)
    if(twitterList[i]..*::name != undefined)
    (…)

Leave a Reply