Pular para o conteúdo principal

Uma forma de usar Twitter4J com OAuth

Já faz bastante tempo que escrevi um post sobre como enviar tweets através de uma aplicação Java usando a biblioteca Twitter4J e de lá para cá tivemos algumas atualizações e uma delas foi o fato de não ser mais possível usar autenticação básica como eu coloquei de exemplo.

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 ConsumerSecret
Você 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:
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);
    }
}
Quando você executa este código, com as ConsumerKey e ConsumerSecret corretas, você receberá uma Authorisation URL na console, como abaixo:

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.

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

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
Faça login pela a aplicação registrada e envie seus tweets
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

Ana,

excelente post.

Tem algum lugar que podemos baixar os fontes do seu exemplo?

Abs!
Ana Abrantes disse…
Jeff,

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
Alex Coqueiro disse…
Muito legal Ana.

Acabei de testar e funcionou. ótima iniciativa.
Unknown disse…
Muito Bom Ana.
Testei aqui, funcionou também!
Ótimo post!
[]'ss

@JeanDonato
Unknown disse…
Show de bola...resolveu o meu problema do lance de como persistir a chave do Token :D

Postagens mais visitadas deste blog

10 reasons why we love JSF

1. One-slide technology: it's so simple that I can explain basic JSF with one slide. 2. Easy to extend: components, listeners, render kit, Events, Controller, etc. 3. Real-world adoption: JBoss, Exadel, Oracle, IBM, ... 4. Architecture model: you can choose between more than 100 different architecture. 5. Open-mind community: using JSF you are going to meet very interesting people. 6. We are using JSF the last 5 years and we found very good market for JSF in Brazil 7. Progress: look to JSf 1.1 to JSF 1.2, JSF 1.2 to JSF 2.0. People are working really hard! 8. Many professionals now available 9. It's a standard. It's JCP. Before complain, report and help! 10. Ed Burns, spec leader, is an old Globalcode community friend! EXTRA: My wife is specialist in JSF. She's my F1 for JSF :) Nice job JSF community! -Vinicius Senger

Palestras do TDC Business Disponíveis Online

🚨 Atenção, TDC Lovers! O TDC Business em São Paulo acabou, mas os conteúdos mal começaram!  Não pô de aproveitar a STADIUM ao vivo? Não tem problema, porque trouxemos ela até você. Todas as palestras da STADIUM, palco principal do TDC, já estão no ar e liberadas para qualquer pessoa assistir. Essa Trilha incrível conta com palestras de Trilhas Premium e temas variados de forma GRATUITA para você poder maratonar de casa!  Aproveite para prestigiar seu evento de TI favorito com pipoca direto do seu sofá. 🎥 🍿 Gravação da STADIUM, 22 a 24 de Agosto de 2022, disponível aqui: https://www.globalcode.com.br/videos/tdc-2022-business/  Todas as demais trilhas do TDC Business serão publicadas gradualmente nas próximas semanas, fique atento aos nossos e-mails, você será notificado por lá quando sua Trilha estiver disponível. Acompanhe nossas redes sociais para não perder nada e ficar por dentro de todas as novidades do TDC!

TDC ONLINE: SUA PLATAFORMA DE PALESTRAS GRAVADAS DO TDC DISPONÍVEL

Além do conteúdo ao vivo transmitido online nas edições do TDC, agora você pode ter acesso à centenas de palestras gravadas, através da nossa nova plataforma de vídeos - o TDC Online, que reúne todas as Trilhas premium, Stadium e Salas dos Patrocinadores das edições anteriores de 2022, TDC Innovation e TDC Connections.  Para acessar, basta clicar na edição em que você participou ( TDC Innovation ou TDC Connections ); Fazer o mesmo login (com e-mail e senha) cadastrados na hora de adquirir ou resgatar o seu ingresso no TDC; E clicar na Trilha de sua opção, e de acordo com a modalidade do seu ingresso. Logo em seguida, você será direcionado para a seguinte página com a lista de todas as palestras por Trilha: Pronto! Agora você tem acesso à centenas de palestras gravadas da sua área de interesse, para assistir como e quando quiser! Caso tenha esquecido a senha, clique na opção "Esqueci a senha" , insira o e-mail que você realizou para o cadastro no evento, e aparecerá a op

TDC INNOVATION lança University Pass

Modalidade de ingresso tem como objetivo ajudar na capacitação dos universitários Uma pesquisa realizada em 2020 pela Associação Brasileira das Empresas de Tecnologia da Informação e Comunicação (Brasscom) diz que até o ano de 2024 o Brasil precisará de cerca de 420 mil profissionais na área de Tecnologia da Informação. Porém, por ano, a mesma pesquisa diz que o país forma apenas 46 mil profissionais capacitados no nicho. Pensando nisso, para ajudar na formação e capacitação desses jovens profissionais, o TDC INNOVATION, segunda edição do ano do The Developer's Conference, lança o University Pass, modalidade de ingresso que possibilita aceso digital gratuito a todas as palestras do evento, ou com 50% de desconto para quem preferir ir pessoalmente. Com o tema central “Desafios para a criação do futuro Digital”, o TDC INNOVATION ocorrerá entre 1 e 3 de junho, de forma híbrida: presencialmente no Centro de Convenções CentroSul, em Florianópolis, e com transmissão simultaneamente pela

Inspire a mudança com a liderança ágil

A liderança ágil é essencial para que uma organização realize mudanças de negócios significativas. Ser líder é uma tarefa desafiadora, especialmente em um cenário de constantes transformações, principalmente na forma de lidar com a relação empresa e pessoal. Pesquisas sobre liderança na era digital revelam que algumas soft skills têm sido substituídas por outras, o profundo conhecimento na área de negócio, ser referência nas tecnologias utilizadas, ter foco total no prazo e nas entregas e conhecer um arsenal de técnicas e ferramentas, têm dado espaço a habilidades, como: empatia; adaptabilidade; senso de equipe; visão e propósito; engajamento constante. A colaboração entre pessoas de todos os níveis hierárquicos são vitais, afinal, as equipes estão trabalhando para o mesmo objetivo: o encantamento e atendimento das necessidades do cliente que proporcionarão um crescimento sustentável da organização. Com propósito claro, estratégia e prioridades definidas, os times desfrutam de uma ma

Facelets ainda mais divertido! Parte II

De volta ao Facelets , na primeira parte mantive o foco na utilização de templates e técnicas de reutilização visando maior agilidade para desenvolver telas com JSF , mas o Facelets vai bem além disso! Nesse post vou comentar e mostrar um pouco sobre a criação de componentes UI (User Interface) usando xht ml - na minha opinião esse é o grande diferencial da tecnologia. Com esse recurso é possível customizar / padronizar componentes usando xhtml + tags JSF + JavaScript + Css, sem código Java. A ideia é bem próxima ao Tag File em uma rápida comparação com JSP (JavaServer Pages), mas no caso do Facelets feito de uma forma ainda mais simples e com aderência a (infra)estrutura do JSF. Vou descrever o mesmo cenário da primeira parte, um sistema composto por vários cadastros ( C reate R ead U pdate D elete). Pensando especificamente em cada formulário, usando como exemplo um rascunho ou protótipo para o cadastro de Fornecedores, podemos assumir o seguinte formato: campos para preenchi