Use tweet para obter o status de construção do seu projeto

Use uma tarefa Ant customizada e autenticação aberta para atualizar uma conta do Twitter com status de construção concluída

Combine o já conhecido e consagrado Apache Ant com o badalado serviço Twitter para criar um sistema de notificação de construção que não depende de tarefa de mensagem do Ant. Ao receber atualizações de status através do Twitter depois da conclusão de uma construção Ant automatizada, os desenvolvedores e testadores de projeto são notificados imediatamente de que uma nova construção está disponível. Eles podem assinar e cancelar a assinatura do feed a seu critério.

Mr Joseph P. McCarthy, Software Developer, IBM

Photo of Joseph McCarthyJoseph McCarthy é desenvolvedor de Java no Laboratório de Software de Dublin da IBM. Passou a fazer parte da IBM em julho de 2002, depois de se formar pela Universidade de Limerick, com bacharelado em sistemas informatizados e graduação em engenharia da computação. Ele trabalhou intensivamente em tecnologia Java, desenvolvendo tarefas Ant customizadas, com várias APIs públicas, incluindo o Twitter.


nível de autor Contribuidor do
        developerWorks

26/Out/2010

A tarefa de mensagem integrada do Apache Ant pode enviar e-mails a uma lista de usuários fornecida para notificá-los da conclusão do processo de construção. No entanto, com o tempo, esse recurso vai se tornando menos útil conforme as pessoas trocam de endereço de e-mail, deixam o projeto, e assim por diante.

O Twitter.com fornece uma API pública para permitir que os usuários atualizem suas contas a partir de uma variedade de origens, como telefones celulares, TVs e consoles de jogos. Ao postar atualizações de conclusões de construção em uma conta do Twitter, sua equipe pode notificar os desenvolvedores e testadores de projeto da disponibilidade da nova construção imediatamente. Um benefício adicional é que os usuários relevantes podem assinar e cancelar a assinatura do feed, sem ter que envolver o engenheiro de construção.

Este artigo descreve como criar uma tarefa Ant do cliente do Twitter que — com a ajuda de uma biblioteca Java de software livre™ para interagir com o Twitter — atualize o status de uma conta do Twitter associada ao status de construção. O código de amostra do artigo está disponível para download.

Introdução ao Twitter

Para usar o Twitter no seu sistema de notificação de construção, você precisa criar uma conta do Twitter e depois registrar o aplicativo cliente.

Criar uma conta do Twitter

O OAuthcalypse

Antes de setembro de 2010, o Twitter permitia que aplicativos de terceiros usassem a autenticação HTTP básica para login em uma conta. Agora, somente aplicativos que usam OAuth (Open Authorization) são reconhecidos pelo servidor do Twitter. (Os usuários do Twitter chamaram esse evento de OAuthcalypse.) Com a OAuth, as informações sobre o nome de usuário e senha da conta do Twitter nunca são trocadas entre o aplicativo cliente e o servidor.

A primeira etapa é a mais simples. Navegue até o twitter.com e crie uma conta. Criei a conta chamada tweet_task para fins de demonstração. Você pode visualizar as atualizações de status até o momento em http://twitter.com/tweet_task.

Registrar o aplicativo cliente

Assim como todos os aplicativos clientes usados para atualizar o status de uma conta do Twitter, o que você irá construir neste artigo precisa ser registrado no Twitter antes que você possa usá-lo. Abra a página de registro do cliente OAuth do Twitter em http://twitter.com/oauth_clients/new e preencha o formulário, mostrado na figura 1:

Figura 1. Registro de um aplicativo no Twitter
Registro de um aplicativo no Twitter

Clique para ver a imagem maior

Figura 1. Registro de um aplicativo no Twitter

Registro de um aplicativo no Twitter

Você pode usar o campo Application Icon do formulário para inserir ou buscar uma imagem para usá-la como ícone do seu aplicativo cliente. — um arquivo GIF, JPG ou PNG menor que 700 k. Em Application Name você pode usar qualquer coisa, desde que não contenha a palavra twitter. (Lembre-se de que qualquer atualização que use esse cliente incluirá o nome do cliente como subtítulo. Escolhi o nome tweet_task_client para demonstração neste artigo, e você pode ver o subtítulo via tweet_task_client em todos os status.) Insira uma breve descrição do aplicativo no campo Description. Observe que o campo Application Website não pode ficar em branco, então insira uma URL (mesmo que não seja funcional) para o aplicativo. O campo Organization e o campo Website associado são opcionais. Selecione Client como Application Type e Read & Write como Default Access Type. Em Use Twitter for login:, selecione Yes, use Twitter for login.

Quando o aplicativo estiver registrado, você verá uma tela contendo os tokens Consumer key e Consumer secret. Anote essas informações e armazene-as de modo seguro.


Criar um objeto AccessToken

A Twitter4J é uma biblioteca de software livre não oficial de Java que apresenta suporte integrado a OAuth. Faça o download do último release no Web site da Twitter4J (consulte Recursos) e adicione-o ao seu caminho de classe.

Antes que o cliente possa atualizar um status de conta, a conta precisa obter permissão para isso. A listagem 1 é um programa pequeno para gerar a URL de autorização para um aplicativo para uma conta:

Listagem 1. Twitter4JRegister.java
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;
import twitter4j.http.RequestToken;

public class Twitter4JRegister {


  public static void main(String args[]) throws Exception {

    Twitter twitter = new TwitterFactory().getInstance();
    twitter.setOAuthConsumer("consumer key", "consumer secret");
    RequestToken requestToken = twitter.getOAuthRequestToken();
    AccessToken accessToken = null;
    BufferedReader bufferedReader = 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 generated PIN:");
      String pin = bufferedReader.readLine();
      try {
        if (pin.length() > 0) {
          accessToken = twitter
              .getOAuthAccessToken(requestToken, pin);
        } else {
          accessToken = twitter.getOAuthAccessToken();
        }

      } catch (TwitterException e) {
        if (401 == e.getStatusCode()) {
          System.out.println("Unable to get the access token.");
        } else {
          e.printStackTrace();
        }
      }
    }
    storeAccessToken(accessToken);
    Status status = twitter.updateStatus("Client installed");
    System.out.println("Successfully updated the status to ["
        + status.getText() + "].");
    System.exit(0);
  }

  private static void storeAccessToken(AccessToken accessToken) {

    try {
      FileOutputStream fileOutputStream = new FileOutputStream(
          "token.txt");
      ObjectOutputStream objectOutputStream = new ObjectOutputStream(
          fileOutputStream);
      objectOutputStream.writeObject(accessToken.getToken());
      objectOutputStream.flush();
      fileOutputStream = new FileOutputStream("tokenSecret.txt");
      objectOutputStream = new ObjectOutputStream(fileOutputStream);
      objectOutputStream.writeObject(accessToken.getTokenSecret());

      objectOutputStream.flush();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

}

Insira o código na listagem 1 em um arquivo chamado Twitter4JRegister.java, substituindo os espaços reservados para chave do consumidor e segredo do consumidor por sua própria chave e seu próprio segredo, e compile o código. Execute o código e depois insira a URL gerada na barra de endereços do seu navegador. Faça o login com o nome de usuário e senha da conta do Twitter que você criou anteriormente. Quando o PIN for gerado e exibido, insira-o no console.

O token e os objetos de segredo do token são serializados em dois arquivos separados, chamados token.txt e tokenSecret.txt. Esses objetos serão usados no cliente para autenticar a conta em todas as transações futuras. Mantenha um backup desses arquivos; se eles forem excluídos, você precisará reexecutar o programa para gerar uma nova URL para recriá-los. Observe que o nome de usuário e senha da conta nunca são usados no código. O token e o segredo do token podem ser persistidos em qualquer lugar (como um banco de dados ou registro); serializá-los em um arquivo é apenas uma solução sugerida neste artigo.


Usar tokens para atualizar status

Agora que os tokens estão disponíveis para o usuário, você pode gravar o aplicativo cliente para testar o uso e atualizar o status da conta. A listagem 2 mostra o código do aplicativo cliente, chamado Twitter4JUpdate:

Listagem 2. Twitter4JUpdate.java
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;

public class Twitter4JUpdate {

  public static void main(String args[]) throws Exception {

    TwitterFactory factory = new TwitterFactory();
    AccessToken accessToken = loadAccessToken();
    Twitter twitter = factory.getOAuthAuthorizedInstance("consumer key",
        "consumer secret", accessToken);
    Status status = twitter.updateStatus("Client registered");
    System.out.println("Successfully updated the status to ["
        + status.getText() + "].");
    System.exit(0);
  }

  private static AccessToken loadAccessToken() {
    String token = null;
    String tokenSecret = null;
    try {
      FileInputStream fileInputStream = new FileInputStream("token.txt");
      ObjectInputStream objectInputStream = new ObjectInputStream(
          fileInputStream);
      token = (String) objectInputStream.readObject();
      fileInputStream = new FileInputStream("tokenSecret.txt");
      objectInputStream = new ObjectInputStream(fileInputStream);
      tokenSecret = (String) objectInputStream.readObject();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return new AccessToken(token, tokenSecret);

  }

}

Como anteriormente, substitua a chave e o segredo do consumidor na listagem 2 pelos seus próprios. Se você persistiu o token e o objeto de segredo do token em algum lugar diferente dos arquivos sugeridos, você precisará regravar o métodoloadAccessToken() para recuperá-los.

Compilar Twitter4JUpdate.java. Para confirmar que o status da conta será atualizado corretamente, use este comando com a atualização de status que você quer que apareça:

java Twitter4JUpdate update

Confirme em twitter.com se a atualização que você inseriu aparece corretamente.


Gravar uma tarefa Ant customizada para atualizar o status da conta

Gravar uma tarefa Ant customizada é simplesmente uma questão de estender a tarefa org.apache.tools.ant.Task e substituir o método execute() (consulte Recursos). Qualquer variável de tempo de execução é definida como atributo de classe privada, com métodos de configuração e obtenção apropriados. Em vez de usar o parâmetro da linha de comandos para configurar o status da conta, você configurará um valor de sequência no arquivo de construção e a tarefa usará o valor de sequência para atualizar o status.

Insira o código da listagem 3 em um arquivo chamado TweetTask.java, substituindo a chave e o segredo do consumidor como anteriormente:

Listagem 3. TweetTask.java
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

import org.apache.tools.ant.Task;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;

public class TweetTask extends Task {

  private String status;

  public void execute() {

    try {

      TwitterFactory factory = new TwitterFactory();
      AccessToken accessToken = loadAccessToken();
      Twitter twitter = factory.getOAuthAuthorizedInstance(
          "consumer key", "consumer secret", accessToken);
      Status updatedStatus = twitter.updateStatus(status);
      System.out.println("Updated status to: "
          + updatedStatus.getText());

    } catch (TwitterException e) {

      e.printStackTrace();

    }

  }

  private AccessToken loadAccessToken() {

    String token = null;
    String tokenSecret = null;
    try {
      FileInputStream fileInputStream = new FileInputStream(
          "accessToken.txt");
      ObjectInputStream objectInputStream = new ObjectInputStream(
          fileInputStream);
      token = (String) objectInputStream.readObject();
      fileInputStream = new FileInputStream("accessTokenSecret.txt");
      objectInputStream = new ObjectInputStream(fileInputStream);
      tokenSecret = (String) objectInputStream.readObject();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return new AccessToken(token, tokenSecret);

  }

  public String getStatus() {
    return status;
  }

  public void setStatus(String status) {
    this.status = status;
  }

}

Observe que a listagem 3 refatora o método main() da listagem 2 para o método execute() da tarefa. E também que ela refatora o método loadAccessToken() simplesmente removendo o modificador static , para mudá-lo de um método de classe para um método de instância. (Se você persistiu o token e os objetos de segredo do token em algum lugar diferente dos arquivos sugeridos, reutilize o mesmo método que você usou nalistagem 2.) Compile TweetTask.java.

Agora grave o arquivo Ant build.xml file, mostrado na listagem 4, para testar a classe customizada TweetTask :

Listagem 4. build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project default="default" basedir=".">

  <taskdef name="tweet"
     classname="TweetTask"
     classpath="Twitter4J Jar file" />

  <target name="default">
  
    <tstamp>
      <format property="build.completed" 
        pattern="HH:mm:ss z dd-MM-yyyy" />
    </tstamp>
    <tweet status="build completed at ${build.completed}" />
    
  </target>
  
</project>

Observe que o mesmo arquivo JAR transferido por download do Web site da Twitter4J é adicionado ao caminho de classe da tarefa customizada. Substitua o valor do atributo classpath pelo nome do arquivo transferido por download. Se você colocou o arquivo TweetTask.java em um pacote, como mypackage.customtasks, então o atributo classname deve refletir isso. Se você seguiu a sugestão deste artigo e serializou o token e os objetos de segredo do token em arquivo locais, então os arquivos token.txt e tokenSecret.txt precisam estar no mesmo diretório que esse arquivo build.xml para que a construção seja concluída com sucesso.

Executar o arquivo build.xml com Ant. Quando a execução estiver concluída, verifique a conta do Twitter para confirmar se a tarefa customizada atualiza o status da conta com construção concluída em hora data, como mostrado na figura 2:

Figura 2. Uma atualização de construção concluída no Twitter
Uma atualização de construção concluída no Twitter

Agora todas as partes relevantes do seu projeto podem seguir o feed do Twitter para serem notificadas quando a construção estiver concluída.


Conclusão

Este artigo mostrou como usar o mecanismo OAuth no Twitter para atualizar o status de uma conta de um programa Java cliente. Essa técnica libera os engenheiros de construção em projetos de software livre da tarefa de manter e atualizar uma lista de e-mails de uma construção — uma tarefa que não deveria mesmo ser de sua responsabilidade. Desenvolvedores, testadores e qualquer interessado no projeto podem assinar (ou "seguir") a conta do Twitter para serem notificados instantaneamente quando a construção for concluída. Caso o twitter.com esteja indisponível, ou se a conta do projeto estiver comprometida, a tarefa de mensagem pode ser usada como método de fallback para alertar os usuários sobre o status da construção.

O Twitter teve um crescimento exponencial de uso nos últimos quatro anos, levando à criação de microblogs alternativos, como o status.net, Jaiku e NotePub. A expansão da tarefa de atualização deste artigo poderia usar esses serviços, bem como atualizar o status de um projeto do Facebook.


Download

DescriçãoNomeTamanho
Sample code for this articlej-tweettask.zip7KB

Recursos

Aprender

Obter produtos e tecnologias

Discutir

  • Participe da comunidade do My developerWorks. Entre em contato com outros usuários do developerWorks, ao mesmo tempo em que explora blogs, fóruns, grupos e wikis direcionados aos desenvolvedores.

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Tecnologia Java
ArticleID=556584
ArticleTitle=Use tweet para obter o status de construção do seu projeto
publish-date=10262010