Seções iMasters
APIs Twitter + Java

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

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.

Introdução ao status de construção do projeto

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.

Selecionando a conta no twitter e registrando o aplicativo cliente

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. 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.

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

tweetTask.jpg

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.

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.

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 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étodo loadAccessToken() 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().
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 na listagem 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

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.

Recursos

Aprender

Obter produtos e tecnologias

***

artigo publicado originalmente no developerWorks Brasil, por Joseph McCarthy

Joseph 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.

Comente também

1 Comentário

antonio

sport club nova visao.com.br que formando cotegorias de bases ambos sexos venhe resaltar que eata pagina realmente tenhe um poder de envio e veabelidade incrivel alguma coisa que nao entendo por que sou novato tenho a penas treis meses de navegaçao pois nao sabia o que era um teclado estou muitissimo grato pelo apoio do suporte que quando erramos ele nus leva indicaçaoes fertil que nus deixa sastifeitos confesso que nao apredi a mandar minhas fotos para meu site por que foi eu quem fiz aos poucos vou dar mais uma inlustrada nas paginas dele para ficar top 10 acredito em vcs abraços

Qual a sua opinião?