Posted by Lucas Marçal in Redes Sociais, Tutoriais | 12 comments
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 + "¬s=" + 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)
}
}


Esse código simplesmente não funciona. Precisa testar antes de postar alguma coisa que ache realmente útil. Só perda de tempo.
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!
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!
Ta de Parabéns, funcionou Perfeitamente
Ó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!
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 ….
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(…)
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á!
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
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?
Parabens muito simples e funcional a class.
Testei e funcionou. Mas apareceu alguns campos em brancos.
Para arrumar, adicionar na linha 77, do arquivo GetTweet.as:
(…)
if(twitterList[i]..*::name != undefined)
(…)