L’importanza che i social media hanno raggiunto nell’attuale panorama mondiale va ben oltre l’aspetto informatico: le due piattaforme social più diffuse rappresentano ormai il principale mezzo di informazione per una parte significativa del pianeta. In questo articolo vedremo come si possa far interagire Java con le API di Twitter, la piattaforma social di microblogging più diffusa e conosciuta
Twitter4J
Twitter è un servizio gratuito di social networking e microblogging che fornisce agli utenti una pagina personale aggiornabile tramite messaggi di testo con una lunghezza massima di 140 caratteri (120 nel caso si inserisca un link o un’immagine).
Figura 1 – Twitter è una piattaforma di microblogging che ha assunto in pochi anni grandissima importanza.
Twitter4J è una libreria non ufficiale di Java con cui è possibile integrare le applicazioni Java con il servizio offerto da Twitter. La libreria può essere scaricata dal suo sito internet [1].
Figura 2 – Twitter4J è una libreria non ufficiale, ma ciò non toglie che essa possa fornire un valido supporto agli sviluppatori.
Le caratteristiche di Twitter4J
Le caratteristiche di Twitter4J sono:
- 100% compatibilità con Java;funziona su tutte le piattaforme Java 1.5 o successive;
- pronta per Android e Google App Engine;
- zero dipendenze: non servono altri JAR per farla funzionare;
- supporto OAuth incorporato;
- supporto GZIP predefinito;
- 100% compatibile con le API Twitter 1.1.
Recuperare le chiavi per sviluppare applicazioni
Dopo aver scaricato e installato la libreria, possiamo metterci all’opera, recuperando tutto quello che ci serve per poterla utilizzare.
Innanzi tutto, quello che ci serve sono le chiavi autore e gli accessToken. Per recuperare queste chiavi, andiamo sul sito app.twitter.com e, se non siamo registrati a Twitter, registriamoci perchè ci verranno chiesti user e password.
Figura 3 – Twitter Apps.
Creiamo quindi una nuova app.
Figura 4 – Creare un’applicazione.
Otteniamo poi la ConsumerKey, che ci servirà per avanzare nel nostro processo di autenticazione.
Figura 5 – Ottenere la Consumer Key.
Impostiamo a questo punto i permessi di scrittura, lettura e messaggi diretti per avere il controllo totale sulla nostra applicazione.
Figura 6 – Impostare i permessi.
Otteniamo adesso le Consumer Secret, AccessToken e AccessToken Secret.
Figura 7 – Ecco le chiavi che ci servono…
Figura 8 – …con il nostro Access Token e Access Token Secret.
E concludiamo quindi il nostro processo OAuth.
Figura 9 – La OAuth Signature.
All’opera!
Ora siamo pronti per metterci all’opera. Le chiavi che abbiamo ottenuto nei passi precedenti andranno inserite nel codice Java.
public class Main { public static void main(String[] args) { ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true) .setUser("XXX") .setPassword("XXX") .setOAuthConsumerKey("XXX") .setOAuthConsumerSecret("XXX") .setOAuthAccessToken("XXX") .setOAuthAccessTokenSecret("XXX"); TwitterFactory tf = new TwitterFactory(cb.build()); Twitter twitter = tf.getInstance(); // FAI QUALCOSA } catch (TwitterException e) { } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Postare un tweet
Come ogni programmatore che si rispetti, dobbiamo stampare il nostro bel messaggio “Ciao mondo!” su Twitter. Per fare questo useremo la funzione updateStatus().
Twitter twitter = TwitterFactory.getSingleton(); Status status = twitter.updateStatus(latestStatus); System.out.println("Successfully updated the status to [" + status.getText() + "].");
Retweet
Per ripubblicare dal nostro account un tweet già inviato da qualche altro utente, dobbiamo conoscere l’id del tweet e poi possiamo invocare la funzione retweetStatus().
twitter.retweetStatus(id);
Ottenere la TimeLine
La TimeLine è composta da uno o più tweet che sono inviati dai nostri follower. In Twitter abbiamo diverse TimeLine come la Home, la Mention dove qualcuno cita i nostri tweet, la ReTweet e la User.
Per ottene la TimeLine desiderata è necessario utilizzare la funzione getXXTimeLine(). Nel caso specifico:
- HomeTimeLine
- MentionsTimeLine
- RetweetOfMe
- USerTimeLine
Di seguito, riportiamo un esempio:
Twitter twitter = TwitterFactory.getSingleton(); List statuses = twitter.getHomeTimeline(); System.out.println("Showing home timeline."); for (Status status : statuses) { System.out.println(status.getUser().getName() + ":" + status.getText()); }
Inviare e ricevere messaggi diretti
Su Twitter è possibile anche inviare o ricevere messaggi diretti, in forma privata, a uno specifico utente attraverso le funzioni getDirectMessages e sendDirectMessage.
Twitter twitter = TwitterFactory.getSingleton(); Query query = new Query("source:twitter4j yusukey"); QueryResult result = twitter.search(query); for (Status status : result.getTweets()) { System.out.println("@" + status.getUser().getScreenName() + ":" + status.getText()); }
Ricercare tweet
Ricercare dei tweet o degli #hashtag in twitter può risultare molto utile, ad esempio per fare delle indagini di mercato, oppure semplicemente per trovare persone che hanno gli stessi nostri interessi in modo tale da seguirle.
La ricerca avviene attraverso la funzione Search() contenuta nella classe Query di Twitter4J.
Twitter twitter = TwitterFactory.getSingleton(); Query query = new Query("source:twitter4j yusukey"); QueryResult result = twitter.search(query); for (Status status : result.getTweets()) { System.out.println("@" + status.getUser().getScreenName() + ":" + status.getText()); }
API asincrone
È possibile effettuare delle chiamate asincrone attraverso TwitterListeners. La chiamata al metodo effettivo sarà fatta attraverso un thread separato, e la risposta avviene attraverso l’interfaccia TwitterListeners. Per capire in pratica questo meccanismo, passiamo a vedere il codice che lo implementa.
TwitterListener listener = new TwitterAdapter() { @Override public void updatedStatus(Status status) { System.out.println("Successfully updated the status to [" + status.getText() + "]."); } @Override public void onException(TwitterException e, int method) { if (method == TwitterMethods.UPDATE_STATUS) { e.printStackTrace(); } else { throw new AssertionError("Should not happen"); } } } AsyncTwitterFactory factory = new AsyncTwitterFactory(); AsyncTwitter asyncTwitter = factory.getInstance(); asyncTwitter.addListener(listenrer); asyncTwitter.updateStatus(args[0]);
Controlli sulle pagine
Le funzioni che regolano il flusso delle pagine e gestiscono la relazione tra numero di pagine e TimeLine sono caratterizzate da i seguenti parametri:
- Page: pagina;
- Cont: numero di pagina;
- Since_id: restituisce gli elementi che sono più grandi di un specifico id;
- Max_id: restituisce gli elementi che sono più piccoli di uno specifico esempio.
È possibile utilizzare la classe Paging per specificare i parametri, ma bisogna fare attenzione perchè alcuni dei parametri riportati sopra non sono accettati da tali API .
Twitter twitter = TwitterFactory.getSingleton(); // voglio 2 pagine e 40 elementi per pagina Paging paging = new Paging(2, 40); List statuses = twitter.getFriendsTimeline(paging); for (Status status : statuses) { System.out.println(status.getUser().getScreenName() + ":" + status.getText()); } // richiedo pagina 3 con id non più lungo di 1000 statuses = twitter.getFriendsTimeline(new Paging(3).sinceId(1000l)); for (Status status : statuses) { System.out.println(status.getUser().getScreenName() + ":" + status.getText()); }
Conclusioni
Twitter4J fa benissimo quello che deve fare e lo fa in maniera davvero immediata: il codice e le funzioni risultano piuttosto semplici e comprensibili. Con una libreria del genere, è possibile ad esempio creare dei bot che rispondono automaticamente a particolari tweet; si potrebbero anche gestire funzioni automatiche di Twitter, quali l’invio di un messaggio di cortesia per ogni nuovo follower, o il retweet automatico dei contenuti di determinati utenti che seguiamo. Le possibilità sono molteplici e quindi… buon lavoro!