Hoje eu vi a Yara citar no Twitter este meu post como exemplo de uso e responderam a ela que não funcionava mais assim, então resolvi pesquisar e colocar aqui no blog a solução que encontrei.
Buscando na internet, encontrei rapidamente este artigo em inglês no blog da EMC, e como está bem explicado, peço licença ao autor Nileesha Bojjawar para colocar aqui traduzido para o português e compartilhar com vocês.
Neste texto, além de mostrar como autenticar usando OAuth, também dá a dica de como registrar uma aplicação para editar a timeline de uma conta do Twitter. Vamos ao passo a passo então:
"...
Crie uma conta no Twitter
Crie a conta do Twitter que você quer usar da sua aplicação. No exemplo eu usei uma conta de teste que eu criei.
Registre a aplicação
Faça login no Twitter e registre uma nova aplicação com twitter neste link.
Assim que tiver registrado a aplicação, você pode editá-la e vê-la da sua conta do Twitter, através da página settings -> connections.
Por favor, note: para que este exemplo funcione, você tem que selecionar Application Type como “Client”. Application Type como “Browser” espera que você tenha um website com um servlet call-back para o qual o Twitter possa enviar o token de acesso.
Obtenha ConsumerKey e ConsumerSecretVocê receberá a ConsumerKey e ConsumerSecret nesta página. Você pode armazenar isto de forma persistente, para simplicidade, você pode usar um arquivo de properties.
Obtenha Access Token e Access Secret
Para usar OAuth a aplicação deve usar o login do Twitter usando uma Access Token. Obter a access token e a token secret é um processo que se faz uma única vez para cada ConsumerKey e ConsumerSecret e todos estes valores podem ser armazenados juntos num mesmo arquivo.
A maioria dos exemplos que encontramos por aí usam um call-back Servlet/URL para conseguir o token. Eu pessoalmente acho que isto é demais, criar um call-back Servlet só para obter os Access Tokens. É mais fácil obter isto usando uma aplicação cliente e armazená-los. O código cliente de exemplo está aqui:
Quando você executa este código, com as ConsumerKey e ConsumerSecret corretas, você receberá uma Authorisation URL na console, como abaixo:import java.io.BufferedReader;import java.io.InputStreamReader;import twitter4j.Status;import twitter4j.Twitter;import twitter4j.TwitterException;import twitter4j.TwitterFactory;import twitter4j.http.AccessToken;import twitter4j.http.RequestToken;public class OAuthSetup {/**
* @param args*/public static void main(String args[]) throws Exception {// The factory instance is re-useable and thread safe.Twitter twitter = new TwitterFactory().getInstance();
//insert the appropriate consumer key and consumer secret here
twitter.setOAuthConsumer("ZDuEJCn23jw3NuFcElaqw","OkhinXH6EaymMUzlfbq0xWrablNBkUwfz7eLDPxmwk");RequestToken requestToken = twitter.getOAuthRequestToken();AccessToken accessToken = null;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));while (null == accessToken) {System.out.println("Open the following URL and grant access to your account:");System.out.println(requestToken.getAuthorizationURL());System.out.print("Enter the PIN(if aviailable) or just hit enter.[PIN]:");String pin = br.readLine();try{if(pin.length() > 0){accessToken = twitter.getOAuthAccessToken(requestToken, pin);}else{accessToken = twitter.getOAuthAccessToken();}} catch (TwitterException te) {if(401 == te.getStatusCode()){System.out.println("Unable to get the access token.");}else{te.printStackTrace();}}}//persist to the accessToken for future reference.System.out.println(twitter.verifyCredentials().getId());System.out.println("token : " + accessToken.getToken());System.out.println("tokenSecret : " + accessToken.getTokenSecret());//storeAccessToken(twitter.verifyCredentials().getId() , accessToken);Status status = twitter.updateStatus(args[0]);System.out.println("Successfully updated the status to [" + status.getText() + "].");System.exit(0);}}
Open the following URL and grant access to your account:
https://twitter.com/oauth/authorize?oauth_token=trVYjyf0r1jeuildLedHSSQMKmdKXdDEfI5ffiuQmcM
Enter the PIN(if aviailable) or just hit enter.[PIN]:
Pegue esta URL e cole-a no browser e permita o acesso.Em seguida, o Twitter te dará um número de pin, que você deve copiar e retornar para sua aplicação e digitar no prompt.
https://twitter.com/oauth/authorize?oauth_token=trVYjyf0r1jeuildLedHSSQMKmdKXdDEfI5ffiuQmcM
Enter the PIN(if aviailable) or just hit enter.[PIN]:6829121
A aplicação vai então gerar seu token e tokenSecret como a seguir:
Open the following URL and grant access to your account:
https://twitter.com/oauth/authorize?oauth_token=trVYjyf0r1jeuildLedHSSQMKmdKXdDEfI5ffiuQmcM
Enter the PIN(if aviailable) or just hit enter.[PIN]:6829121
119319081
token : 119319081-Q3l4OThX7LDHkd6voqI6sZ1oDCJsvcCxavXhVZjK
tokenSecret : 6ypMga7IL8fR7zH2BBLBdIt5VlYuCLb2d1Orco1bqI
Persista estes dados em algum arquivo properties ( como você persiste e assegura isto é sua escolha )
Tudo que este código faz é- Criar uma instância da classe Twitter
- Setar a OAuth Consumer nesta instância
- Gerar uma authorisation URL que você deve colar no browser e permitir acesso da sua conta do twitter para a aplicação
- Isto te dará um número de pin, que você tem que digitar no código cliente em execução
- Então vai gerar suas access token e access token secret que você pode ou não persistir
A última coisa a fazer é usar este OAuth Login para enviar tweets da sua aplicação. A instância do Twitter para enviar tweets pode ser criada como segue:
private Twitter twitter;twitter = new TwitterFactory().getInstance();twitter.setOAuthConsumer(consumerKey, consumerSecret);AccessToken accessToken = new AccessToken(twitterToken, twitterTokenSecret);twitter.setOAuthAccessToken(accessToken);
Espero que seja útil.
..."
Bom, esta foi a tradução que fiz, espero que tenha ficado razoável, que tenha dado para entender pelo menos.Não se esqueça que precisa ter o Twitter4J no classpath para funcionar, é só baixar o jar neste link.
Para complementar, vou colocar abaixo a classe completa de teste que usei como se fosse a aplicação que registrei na minha conta do Twitter:
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;
public class TwitterTester {
public static void main (String[] args){
String consumerKey = "ZDuEJCn23jw3NuFcElaqw";
String consumerSecret = "OkhinXH6EaymMUzlfbq0xWrablNBkUwfz7eLDPxmwk";
String twitterToken = "119319081-Q3l4OThX7LDHkd6voqI6sZ1oDCJsvcCxavXhVZjK";
String twitterTokenSecret = "6ypMga7IL8fR7zH2BBLBdIt5VlYuCLb2d1Orco1bqI";
Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);
AccessToken accessToken = new AccessToken(twitterToken, twitterTokenSecret);
twitter.setOAuthAccessToken(accessToken);
try{
twitter.updateStatus("Testando...");
System.out.println("Tweet enviado!");
} catch(TwitterException e){
System.out.println("Erro ao enviar o tweet");
}
}
}
[]s
Ana Abrantes
twitter.com/anabrant
Comentários
excelente post.
Tem algum lugar que podemos baixar os fontes do seu exemplo?
Abs!
A classe para conseguir os tokens é esta que coloquei aí, a OAuthSetup, depois é só usar na sua aplicação o segundo trecho de código.
Só faltou eu mencionar que precisa ter o Twitter4J no classpath para funcionar, é só baixar o jar neste link: http://twitter4j.org/en/index.html#download
Mais tarde, vou colocar o código da classe que usei para testar, acho que fica mais claro, né?
[]s
Ana
Acabei de testar e funcionou. ótima iniciativa.
Testei aqui, funcionou também!
Ótimo post!
[]'ss
@JeanDonato