WEBCODELOG

free codes, enjoy

Tag: ‘twitter’

Autenticação e Autorização com a API do Twitter

without comments

O Twitter veio para ficar e isto eu não discuto e, este blog quando empolgado com o micro-blog público um exemplo simples de como utilizar o Twitter4j. Agora estou tentando mostrar uma forma mais avançada de comunicação com o Twitter, utilizando o modo de autenticação/autorização.

No exemplo anterior além de obter o Customer Key e Secret, você irá precisar do Usuário e Senha do Twitter, para assim obter a comunicação devida. Bem, nem todo mundo sente-se disposto a oferecer seus dados confidênciais para um software ou site qualquer. Portanto, este novo exemplo mostrará como você deve comunicar com o Twitter deixando a autenticação por parte do micro-blog e autorização por parte do próprio usuário.

Dando sequência ao assunto, inicialmente você precisará registrar uma aplicação no Twitter caso ainda não a tenha, guarde os dados Consumer Key e Secret. Existem dois tipos de aplicações a Client (Desktop) e Browser (Web), sendo que a segunda precisará de uma url que receberá o Token de autenticação.

Infelizmente, este post foi prejudicado pela falta de um web hosting que suporte Java, a Locaweb (atual host deste blog) cobra valores mensais absurdos, que inviabiliza blogs com intuito simplesmente acadêmico, como este, de realizar testes utilizando a linguagem Java.

Consegui descobrir lendo aqui, aqui e aqui que é possível configurar o seu localhost como Callback URL no Twitter, assim não será necessário ter um site publicado na internet para seus testes.

Web Autenticação

Durante o registro você irá informar o tipo de aplicação Browser e uma Callback URL, é para onde o navegador será redirecionado após a autorização do usuário. Já o campo Application Website, é a origem da sua aplicação web, ou seja, serão aceitas as chamadas feitas apenas a partir deste site.

O código abaixo irá fazer iniciar o processo de autenticação, o navegador vai ser redirecionado para a página de login do Twitter.

 final String CALLBACK_URL     = "http://127.0.0.1:8080/BlogTwitt4u/"; // a mesma configurada na aplicação
 final String CUSTOMER_KEY     = "6MWotGxvuNVGfK4lDqAqhg";
 final String CUSTOMER_SEC     = "oRH0YviLum2Rrii25ePj0DEk6VnmNjoTG0ESUpqSY";

 OAuthConsumer consumer         = new DefaultOAuthConsumer(CUSTOMER_KEY, CUSTOMER_SEC);
 OAuthProvider provider         = new DefaultOAuthProvider( "https://twitter.com/oauth/request_token",
 "https://twitter.com/oauth/access_token",
 "https://twitter.com/oauth/authorize" );

 //
 // Solicita a autorização
 //
 String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
 session.setAttribute("token",         consumer.getToken());
 session.setAttribute("tokenSecret", consumer.getTokenSecret());

 //
 //
 // Redireciona para  o Twitter solicitar o Usuário e Senha, e Autorização para a aplicação
 // Em seguida será redirecionado para a callback url
 response.sendRedirect(authUrl);

Após fazer o login e autorizar a sua aplicação, o navegador será redirecionado novamente para o seu site, com dois parâmetros preenchidos, como esta abaixo:


http://127.0.0.1:8080/BlogTwitt4u/?oauth_token=RQVPENBxDbQuI1bJ1rjELuVSyZhMYqr8Fcs5eqyZw&oauth_verifier=a8FuEeitfdCR2IfgisfsHopMAUevs4cDyRWkbZz4

Pronto, ai você já pode colher as informações que desejar, veja:

 if( oauthVerifier!=null && !oauthVerifier.trim().equals("") ){

 String token            = (String) session.getAttribute("token");
 String tokenSecret        = (String) session.getAttribute("tokenSecret");

 //
 consumer.setTokenWithSecret(token, tokenSecret);

 //
 //
 provider.setOAuth10a(true);
 provider.retrieveAccessToken(consumer, oauthVerifier);

 out.println("<h1>AUTORIZADO!</h1>");
 out.println("<pre>");
 out.println("token:\t\t" + consumer.getToken());
 out.println("tokenSecret:\t\t" + consumer.getTokenSecret());
 out.println("oauthVerifier:\t\t" + oauthVerifier);
 out.println("oauthToken:\t\t" + oauthToken);

 //
 //
 URL url                         = new URL("http://twitter.com/statuses/mentions.json");
 HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
 consumer.sign( urlConnection );
 urlConnection.connect();

 BufferedReader in    = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()) );
 String inputLine     = "";
 String content       = "";
 while ((inputLine = in.readLine()) != null){
     content += inputLine;
 }// while end
 in.close();

 int statusCode = urlConnection.getResponseCode();
 out.println("statusCode: " + statusCode);
 out.println("</pre>");

 JSONArray json = JSONArray.fromObject( content );

 out.println("<hr>");
 out.println("<h3>Mentions</h3>");
 out.println("<pre>");
 for(int i=0; i<json.size(); i++){

 JSONObject obj = (JSONObject) json.get(i);
 if( obj!=null ){
   // JSONString str = (JSONString) obj.get("text");
   out.println(obj.getString("text"));
 }

 }// for end
 out.println("</pre>");

 }

Desktop Autenticação

Este é um exemplo comum, muito conhecido em qualquer pesquisa no Google, para utiliza-lo você deve ter uma aplicação do tipo Client.

O código pede para que o usuário abra o navegador, acesse uma determinada URL e depois informe o código númerico no programa, nada eficaz né? Muitos programadores utilizam uma maneira nada elegante que é a de “hackear” esta página e pegar o código automáticamente, facilitando a vida de todo mundo. Faça isto por sua conta e risco. Perceba que quando comparado ao código de autenticação Web a única mudança é a utilização do código PIN, que não necessário informar na web.

<pre>
<pre><pre>// Lembre-se de modificar estes valores para os seus
//
final String CUSTOMER_KEY = "6MWotGxvuNVGfK4lDq";
final String CUSTOMER_SEC = "oRH0YviLum2Rrii25ePj0DEk6VnmNjoTG0ESUp";

try {
HttpURLConnection request = null;
URL url = null;
OAuthConsumer consumer = new DefaultOAuthConsumer(CUSTOMER_KEY, CUSTOMER_SEC);

OAuthProvider provider = new DefaultOAuthProvider( <a href="https://twitter.com/oauth/request_token">https://twitter.com/oauth/request_token</a>,
"https://twitter.com/oauth/access_token",
"https://twitter.com/oauth/authorize");

String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);
//
// URL Que irá retornar o PIN, necessário para formar o Token
System.out.println(authUrl);

String pinCode = JOptionPane.showInputDialog("Acesse o endereço:\n" + authUrl + "\nE Informe o PIN:");
System.out.println("PIN Code: " + pinCode);

//
provider.retrieveAccessToken(consumer, pinCode);

String tokenKey = consumer.getToken();
String tokenSec = consumer.getTokenSecret();

System.out.println("Token Key : " + tokenKey);
System.out.println("Token Sec : " + tokenSec);

consumer.setTokenWithSecret(tokenKey, tokenSec);

url  = new URL(<a href="http://twitter.com/statuses/mentions.xml">http://twitter.com/statuses/mentions.xml</a>);
 request = (HttpURLConnection) url.openConnection();
// sign the request
consumer.sign(request);

// send the request
request.connect();

// response status should be 200 OK
int statusCode = request.getResponseCode();
System.out.println("Status Code : " + statusCode);

} catch (OAuthMessageSignerException e) {
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
e.printStackTrace();
} catch (OAuthCommunicationException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

Foram utilizadas as seguintes bibliotecas:
Apache Commons BeansUtil 1.8
Apache Commons Codec 1.4
Apache Http Client 3.1
Apache Commons Lang 2.4
ezmorph 1.0.6
json-lib 2.3

Faça download do projeto, que contêm ambos exemplos de autenticação.

Written by Luciano

fevereiro 13th, 2010 at 9:27 pm

Conhecendo a API do Twitter

with one comment

Incentivado por este post do Blog do Élcio que demonstrou a utilização da API do Twitter no ubuntu de uma maneira muito fácil e simples, então procurei saber um pouco mais sobre ela.

Existem algumas bibliotecas prontas para diversas linguagens, escolhi pela Twitter4j antes de mexer na API do Twitter mesmo, e não me arrependi com algumas poucas linhas de código é possível atualizar seu status e até receber as últimas atualizações, veja como é simples.


import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;

public class Twittando {

public static void main(String[] args) {
// usuário e senha do twitter
String usr = "lucianosilva";
String pwd = "ABCDEFGHIJKL";

try {

Twitter twitter = new Twitter(usr, pwd);
// atualizando o status do twitter
Status status   = twitter.update("Twitter4J, muuito fácil de usar, recomendo!");
System.out.println("Result: " + status.getText() );

} catch (TwitterException e) {
e.printStackTrace();
}
}
}

Não esqueça de fazer o download da biblioteca Twitter4j aqui. E se você for uma pessoa “caprichosa” assim como o Elcio, criaria um UPBox, mas… no meu caso fiz um exemplo mais simples para demonstrar a lista de updates, veja o scriptlet:


<style type="text/css">
#box{
font-family:tahoma,arial;
font-size:10px;
border:1px #000000 solid;
background-color:#ffffff;
width: 300px;
height: 400px;
overflow: auto;
}
</style>
...
<div id="box">
<%
Twitter twitter = new Twitter();
twitter.setUserId("lucianosilva");
twitter.setPassword("ABCDEFGHIJKL");

ArrayList<status> listUpdates = (ArrayList<status>) twitter.getFriendsTimeline();
for(Status status : listUpdates){
User user = status.getUser();
%>
<p><img src="<%= user.getProfileImageURL() %>" border=2/>
&amp;amp;amp;amp;nbsp;:&amp;amp;amp;amp;nbsp;<%= status.getText() %></p>
<%
}// for each end
%>
</div>

Bacana né? Divirta-se.

Written by Luciano

janeiro 21st, 2009 at 9:32 am