Criando um cliente para Twitter – Parte 2
Foi mal a demora pessoal, o tempo tah foda aqui…
Se você caiu de paraquedas nesse post eu sugiro a leitura do post anterior: Criando um cliente para Twitter – Parte 1.
Segunda parte do nosso tutorialzinho!
Agora iremos criar:
- Um formulário para realizar o login (sem utilizar o OAuth)
- Um formulário para:
- mostrar os ultimos tweets da timeline
- possibilitar o envio de um tweet
Vamos lá então, crie um novo projeto no NetBeans e adicione o twitter4j nas bibliotecas.
Adicione um JFrame e deixe parecido com este:
O campo para usuário é um JTextField com o nome jTF_Nome.
O campo para a senha é um JPasswordField com o nome jPF_Senha.
O JButton não tem nada de mais, só coloquei o passarinho ai pra ficar mais bonitinho. ^^
O JPasswordField é mais do que um JTextField que mascara as letras, existem todo um esquema de segurança por trás deste componente. Tanto que a recuperação do que foi digitado é um pouco mais chatinha: ao invés de uma String, é recuperado um objeto do tipo char[]. Como o login é exige duas strings (usuário e senha) como parâmetro, fiz um método para realizar a conversão.
Vamos ao código do botão responsável pelo login:
public String pegaSenha() { char[] senha = jPF_Senha.getPassword(); String str = ""; for (int i = 0; i < senha.length; i++) { str += senha[i]; } return str; } public void EfetuarLogin() { String usu = jTF_Usuario.getText(); String senha = pegaSenha(); try { Twitter t = new TwitterFactory().getInstance(usu, senha); User u = t.verifyCredentials(); Principal p = new Principal(t,u); p.setLocationRelativeTo(null); p.setVisible(true); this.dispose(); } catch (TwitterException e) { if (e.getStatusCode() == 401) { JOptionPane.showMessageDialog(this, "Usuário e/ou senha inválidos!"); } } }
Nada muito novo em relação ao post anterior. É criado um novo objeto Twitter com os dados que foram digitados. Para garantir que os dados estão corretos existe o método verifyCredentials() que em caso de sucesso retorna um objeto User que referencia o usuário que acabou de se logar. Se estiver tudo certo então chama o próximo JFrame (Principal) e retira o formulário de login da memória (uma vez que ele não será mais usado).
Em caso de falha, é jogada uma exceção do tipo TwitterException. Se o status code da exceção for 401 significa que o usuário e/ou senha estão errados, daí é só avisar o usuário.
O próximo formulário é um pouco mais complexo… Adicione um novo JFrame ao projeto e chame de Principal.java. Deixe ele parecido como este:
Segue a lista dos componentes:
JLabel jL_Foto –> tamanho 48×48
JTextArea jTA_Status –> pra digitar a mensagem
JLabel jL_Restantes –> vai indicar quantos caracteres ainda restam
JScrollPane jScrollPane2 –> a borda foi mudada para ficar mais legal como esta na figura (Ultimos Tweets)
JPanel jP_Tweets –> este panel vai receber os ultimos tweets, ele fica dentro do jScrollPane2. O layout desse panel é do tipo BoxLayout (layout de caixa) com a propriedade eixo setada em Y.
Vamos lá então! Exibindo os últimos tweets:
public class Principal extends javax.swing.JFrame { private Twitter t; private User eu; Image foto; /** Creates new form Principal */ public Principal(Twitter t, User eu) { this.t = t; this.eu = eu; initComponents(); recuperarDados(); } private void recuperarDados() { this.foto = this.getToolkit().getImage(eu.getProfileImageURL()); jL_Foto.setIcon(new ImageIcon(foto)); carregaTimeline(); } public void carregaTimeline() { try { JPanel pane; JLabel novaFoto; JTextArea msg; int i = 0; jP_Tweets.removeAll(); for (Status s : t.getFriendsTimeline()) { i++; //cria o panel pane = new JPanel(new FlowLayout(FlowLayout.LEFT)); pane.setBorder(new LineBorder(Color.black, 1)); pane.setSize(370, 50); //cria o label com a foto novaFoto = new JLabel(new ImageIcon(this.getToolkit().getImage(s.getUser().getProfileImageURL()))); //cria o textarea com o texto msg = new JTextArea(3, 27); msg.setEditable(false); msg.setText(s.getText()); msg.setLineWrap(true); pane.add(novaFoto); pane.add(msg); jP_Tweets.add(pane); } } catch (TwitterException ex) { JOptionPane.showMessageDialog(this, "Erro recuperando a timeline: " + ex.getMessage()); } } ... }
A classe possui 3 atributos que eu considero completamente autoexplicativos mas vamos dar uma pequena passada por eles:
- Twitter t –> velho conhecido nosso não é…
- User eu –> para guardar as informações de quem está logado
- Image foto –> para guardar a imagem de perfil do usuário
Logo quando o formulário é criado, o método recuperarDados() é chamado, a foto do usuário é carregada e então o método carregaTimeline() é invocado.
O carregaTimeline() cria dinamicamente a lista com os ultimos tweets. O código está todo comentado e está bem fácil de entender.
Vale ressaltar que para a lista ficar certinha (um tweet por linha) o layout do panel jP_Tweets deve ser BoxLayout!
Vamos para a próxima parte então: Atualizando o status.
Mude a propriedade lineWrap do jTA_Status para true, com isso a linha não vai ultrapassar os limites do text area e o texto vai ficar dentro dela.
Para fazer a contagem dos caracteres restantes vamos utilizar de uma funcionalidade bem interessante do text area: O evento caretUpdate é chamado toda vez que uma tecla é adiciona ou deletada, sendo assim, adicione o seguinte código neste evento caretUpdate do jTA_Status:
private void jTA_StatusCaretUpdate(javax.swing.event.CaretEvent evt) { jL_Restantes.setText(String.valueOf(140 - jTA_Status.getText().length())); }
Próximos passos: não deixar o usuário digitar mais do que 140 caracteres e postar a mensagem.
O que vamos fazer é o seguinte: se o usuário for digitar o 141º a gente simplesmente cancela ele. Podemos tratar as duas funções no evento keyTyped do jTA_Status.
Segue o código:
private void jTA_StatusKeyTyped(java.awt.event.KeyEvent evt) { if (jTA_Status.getText().length() == 140) { evt.setKeyChar((char) KeyEvent.VK_CLEAR); } if (evt.getKeyChar() == KeyEvent.VK_ENTER) { try { t.updateStatus(jTA_Status.getText()); jTA_Status.setText(""); carregaTimeline(); } catch (TwitterException ex) { JOptionPane.showMessageDialog(this, "Erro atualizando o status: " + ex.getMessage()); } } }
Muito tranquilo. Pouco código e muitas funcionalidades.
Agora nosso cliente já está com uma cara bem legal. Eu implementei mais algumas frescurinhas e ele ficou assim:
Ali embaixo da minha foto tem um label que mostra um pedacinho do ultimo post… embaixo da lista mostra quantos tweets foram carregados… enfim, um monte de frescura que eu nem mostrei aqui…
Quem quiser conferir o projeto completo pode pegar aqui.
Sugestões para quem quiser aperfeiçoar um pouco mais esse humilde cliente de Twitter:
- De 5 em 5 minutos recarregar a lista de tweets. Dica: utilizando Threads fica facinho.
- Ao clicar na foto da pessoa, uma janela abre com as informações da pessoa.
- Adicionar um botão para retwittar a mensagem.
Quem quiser tem como brincar bastante com isso ai…
Valew pessoal,
[]s e até a próxima.
Saab.
14 Responses so far
Mitia
maio 3rd, 2010
20:55
Oi, tudo bem? Achei seu site pelo google pesquisando sobre API. Não sei se poderá me ajudar…eu tenho um Samsung JET e tento usar twitter por programa pelo celular e consegui baixar alguns programas, mas, qndo conecto e tento fazer qq coisa ele diz que precisa do API e desliga o programa. Vc tem alguma idéia do que possa ser e como consigo essa informação?
obrigada
Saab
maio 3rd, 2010
22:04
Mitia,
Pergunta dificil em…
Supondo que estes programas sejam feitos em Java, vc coloca só o .jar no celular não é… Ai já complico pq vc (geralmente) não tem o código fonte no .jar e fica dificil saber qual API ele utiliza e como colocar a API no lugar certo…
Procurei rapidinho na Internet e achei algo que possa te ajudar nesse site: http://www.kakoholder.com/2009/11/samsung-jet-ganha-atualizacao-de-firmware/
Uma atualização de firmware para o Jet que adiciona a funcionalidade do Twitter, Facebook e MySpace. Dê uma boa lida e tenha certeza que seu celular pode ser atualizado.
Boa sorte!
Viris
junho 24th, 2010
13:42
Ola…
Podes dizer como farias os threads para actualizar a pagina de 5 em 5 segundo ou 10 em 10….
Obrigada
Saab
junho 24th, 2010
20:23
Você pode tentar assim:
Depois que o usuário conseguir se logar, dê start em uma nova Thread que será responsável por isso.
Você pode criar uma nova classe que herde da classe Thread, ou vc pode criar uma nova classe que implemente a interface Runnable (dos dois jeitos vc consegue criar uma nova thread).
Segue um possível exemplo:
//…..
Thread atualizacao = new Thread(){
public void run() {
try {
//recupera os novos tweets
//atualiza a lista
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
};
atualizacao.start();
//……..
Com isso vc vai ter uma thread rodando até a tua aplicação ser finalizada…
[]s
Thiago Marinho
agosto 12th, 2010
22:00
Que Maravilha de Posts Felipe ^^
meus parabéns! mto legal mesmo!
vou baixar esse projeto seu e estudar, gostei mto!
ae já ta no meu blog roll (na próxima atualização no meu blog) ^^
abraços!! t+
ps. tinha algumas coisas complexas para o meu nível, mas ficou bem explicado ^^
show().
[]‘s
Saab
agosto 13th, 2010
10:43
Valew Thiago,
Boa sorte com os estudos ae, qualquer duvida é só dar um toque.
[]s
MasterFoca
setembro 6th, 2010
19:44
Olá Saab, achei esse artigo excelente e já comecei estudar o código, porém no meu netbeans tem uma linha que ficou com erro:
66 -> for (Status s : t.getFriendsTimeline()) {
Erro: [ Incompatible types require: twitter4j.status found: java.lang.Object ]
Por acaso você sabe o que pode estar acontecendo ????
Desde já agradeço e parabéns pela inciativa, Seu site já esta nos meus favoritos.
Abs.
Saab
setembro 7th, 2010
15:50
Então MasterFoca,
Estranho o erro viu… Só de olhar isso eu fico meio indeciso sobre o que pode estar acontecendo cara…
Pelo jeito parece que a biblioteca Twitter4J já está no classpath né…
Complicado falar sem fazer uns testes, mas o que parece é que o NetBeans não tá reconhecendo o tipo do objeto “s” como sendo Status e sim como se fosse Object.
Tenta reiniciar a IDE ai e veja se muda alguma coisa…
Boa sorte cara.
[].
Emanoel
setembro 24th, 2010
2:30
Muito bom o artigo, me ajudou pacas!
Mas tbm estou com esse mesmo problema na linha 66 …
Vlw cara, congratulations!
Jhoseph
novembro 5th, 2010
12:22
Olá Saab,
belo artigo mnt didático, porém na hora de logar aparece o erro de usuario e senha inválidos, mesmo eu colocando tudo certinho. O que poderá está acontecendo?
Saab
novembro 13th, 2010
22:09
Poxa Joseph,
Não sei mesmo…
Me parece que daqui a algum tempo esse modo de conectar com o Twitter sem usar o OAuth não será mais possível, então não sei mesmo o que pode estar acontecendo.
henrique
dezembro 19th, 2010
17:21
fala cara beleza? so desenvolvedor achei o projeto bem interessante mas na hora de fazer login da erro 401 mesmo inserindo os dados corretos tentei com varias contas do orkut tem noção do que possa ser?
Rildomar
agosto 22nd, 2011
17:58
Caro amigo, gostaria que se voce pudesse entrasse em contato comigo, gostaria de umas dicas suas.. e como poderia me judar.. pode ser??
Aguardo uma resposta por email.. nem que seja um “Cara, nao posso.. to muito ocupado.. ” rsrsrs
Obrigado.
christian
novembro 1st, 2011
14:28
Cara achei incrível este seu post para o twitter mais eu preciso de criar um igual a este so que para telefone e tem que ser no eclipse, você pode me dar uma ajudinha?
Obrigado.
Leave a comment