Categoria: ‘Redes Sociais’
Autenticação e Autorização com a API do Twitter
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.
Usando a API LastFm em Java
A LastFm é a queridinha das rádios online, mesmo com diversos concorrentes de alto nível como iLike, Pandora, Imeem, e outros tantos, aqui no Brasil a LastFm é um grande sucesso, seus milhões de usuários brasileiros ignoraram o bloqueio de alguns recursos e continuam fazendo scrobbling de seus áudios diáriamente.
Além de um database music, o LastFm é uma rede social e grande parte de suas informações são públicas e podem ser acessadas facilmente através de sua API.
Vamos dar inicio a um exemplo de como consumir os dados utilizando a library para Java lastfm-java. Antes de tudo, se você não tiver uma conta no LastFm, crie-a agora e depois obtenha a API Key. Neste mesmo link você encontrará a documentação da API, que detalha claramente a funcionalidade de cada método disponível e como é o seu acesso e se necessita ou não de autenticação.
Em nosso primeiro exemplo vamos fazer uma página web que irá listar as últimas faixas ouvidas e a lista de amigos de um usuário específico, com isto, você perceberá que nenhuma autenticação é necessária pois os dados são públicos.
Criei a classe LastFmClient, para facilitar os casts necessários e centralizar as chamadas da API.
public class LastFmClient {
// altere para a sua api key
private static final String APIKEY = "XyZaBc001";
private String uName = null;
/**
*
* @param uName
*/
public LastFmClient(String uName){
this.uName = uName;
}
/**
*
* @return User/Friends List
*/
public ArrayList<User> getFriends(){
return (ArrayList<User>) User.getFriends(uName, APIKEY);
}
/**
*
* @return Tracks List
*/
public ArrayList<Track> getTracks(){
return (ArrayList<Track>) User.getRecentTracks(uName, APIKEY);
}
}
Isto é o suficiente para você montar a lista como descrito acima, veja:
String userName = request.getParameter("username");
if( userName!=null && !userName.trim().equals("") ){
// instancia a classe de backend
LastFmClient client = new LastFmClient(userName);
// seu código aqui
}
Ouvidas recentemente.
<table border="0" cellpadding="2" cellspacing="1">
<% for(Track t : tracks){ %>
<tr>
<td valign="top" align="left">
<br/><strong><%=t.getAlbum() %></strong>
<br/><em><%=t.getArtist() %></em>
</td>
</tr>
<% }// for end tracks %>
</table>
Lista de amigos.
<table border="0" cellpadding="2" cellspacing="1">
<tr>
<%
ArrayList<User> friends = client.getFriends();
int count = 1;
for(User f : friends){
%>
<td valign="top" align="center">
<% if( f.getImageURL()!=null ){ %><img src="<%= f.getImageURL() %>"><% } %>
<br><strong><%=f.getName() %></strong>
<br><a href="<%= f.getUrl() %>"><%= f.getUrl() %></a>
<br/>
</td>
<%
if( count%5==0 ) out.print("</tr><tr>");
count++;
}// for end friends
}//
%>
Faça download do código completo.
Pronto, você conseguiu acessar dados do LastFm, usando o caminho correto e fácil, sem autenticação. Mas alguns dados são restritos e necessitam da autorização do usuário, informações básicas como a quantidade de músicas ouvidas, data de cadastro, nome, etc. são de acesso restrito.
Conhecendo a API do Twitter
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;nbsp;:&amp;amp;amp;nbsp;<%= status.getText() %></p>
<%
}// for each end
%>
</div>
Bacana né? Divirta-se.