Con le nuove API di Twitter, giunte alla versione 1.1, sono state introdotte le Streaming API che permettono di tracciare specifiche keywords e seguire in tempo reale i tweet degli utenti. Con le streaming API, il nostro client rimane in ascolto in attesa che vengano pubblicati dei tweet che abbiano a che fare con le parole che vogliamo filtrare, una piccola porzione di questi tweet ci verrà restituita. In tutto ciò è bene tenere presente, che quando si lavora con le API di twitter, siamo limitati in certi parametri, ad esempio è possibile seguire un numero massimo di keywords, pari a 400 (se volete approfondire, date un’occhiata sulla documentazione ufficiale in inglese).

Il nostro scopo è quello di creare un client Java in grado di seguire e acquisire tweet che trattino certi argomenti per noi rilevanti.
Prepariamo il terreno per far funzionare correttamente il client java. Basta seguire questi step:

Step 1: Registrare un’app su Twitter dev.

Per farlo, andiamo nella sezione di twitter dedicata agli sviluppatori, e seguendo questa semplice guida, creiamo la nostra prima applicazione su twitter (PS. se non abbiamo un sito web da inserire durante la compilazione del modulo, inseriamone uno qualsiasi, non servirà tanto). L’applicazione ci permette di autenticarci e usare le API di twitter nel nostro client Java.
Per questo motivo, appuntiamoci dalla scheda API Keys, quelle che sono

Step 2: Scarichiamo Twitter4j e creiamo un nuovo progetto

E’ un pacchetto di librerie per poter interfacciarci alle API di Twitter, inoltre contiene i metodi per avviare una comunicazione in streaming e filtrare per keywords. Possiamo scaricarlo dal sito ufficiale di Twitter4j. Scaricato Twitter4j, creiamo un nuovo progetto sul nostro IDE preferito e importiamo le librerie di Twitter4j.

Step 3: Inseriamo le API Keys nel file twitter4j.properties

Il file twitter4j.properties è così composto:

debug=true
oauth.consumerKey=*********************
oauth.consumerSecret=******************************************
oauth.accessToken=**************************************************
oauth.accessTokenSecret=******************************************

Dobbiamo sostituire gli asterischi con le rispettive chiavi della nostra applicazione, quelle mostrate qua sotto in figura.

twitter_application

Il file twitter4j.properties va posizionato nella classpath del progetto java.

In alternativa possiamo anche inserire le credenziali direttamente nel codice sorgente, guardate qui per una serie di configurazioni alternative per Twitter4j.

Step 4: La configurazione è completata, incolliamo il codice del client.

La configurazione è completa, incolliamo il codice del client modificando l’array di chiavi keywords[] con quelle di cui ci interessa ottenere i tweets.

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.logging.Level;
import java.util.logging.Logger;
import twitter4j.FilterQuery;
import twitter4j.StallWarning;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterException;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.User;
 
/**
 * @author Yusuke Yamamoto - edit by Rocco Musolino
 */
public final class Tweets_Retriever {
    private static final String VERSION = "4.0.1";
    private static final String TITLE = "Twitter4J examples";
 
    private Tweets_Retriever() {
        throw new AssertionError();
    }
 
    public static String getVersion() {
        return VERSION;
    }
 
 
    public static void main(String[] args) throws TwitterException, FileNotFoundException {
 
        // IL FILE DI CONFIGURAZIONE è PRESENTE NEL CLASSPATH, nome: twitter4j.properties  
 
         // The factory instance is re-useable and thread safe.
    /*Twitter twitter = TwitterFactory.getSingleton();
    Query query = new Query("M5S");
    QueryResult result = twitter.search(query);
    for (Status status : result.getTweets()) {
        System.out.println("@" + status.getUser().getScreenName() + ":" + status.getText());
    }*/
 
 
        TwitterStream twitterStream = new TwitterStreamFactory().getInstance();
 
            OutputStream outstream = new FileOutputStream("elenco-tweets.txt");
            Writer output = new OutputStreamWriter(outstream);
	    final Writer outputz = new BufferedWriter(output);
 
 
        StatusListener listener = new StatusListener() {
 
            @Override
            public void onException(Exception arg0) {
                // TODO Auto-generated method stub
 
            }
 
 
            @Override
            public void onScrubGeo(long arg0, long arg1) {
                // TODO Auto-generated method stub
 
            }
 
 
 
            @Override
            public void onStatus(Status status) {
                User user = status.getUser();
 
                // gets Username
                String username = status.getUser().getScreenName();
                System.out.println(username);
                String profileLocation = user.getLocation();
                System.out.println(profileLocation);
                long tweetId = status.getId(); 
                System.out.println(tweetId);
                String content = status.getText();
                System.out.println(content +"\n");
 
                try {
                    outputz.write(content);
                    outputz.write("\n");
                    outputz.flush(); // scriviamo su file il tweet. (sarebbe meglio attualizzare il buffer su file ogni tot tweet e non per ogni tweet). In ogni caso, ogni tweet filtrato verrà salvato istantaneamente nel nostro file testuale.
 
                } catch (IOException ex) {
                    Logger.getLogger(Tweets_Retriever.class.getName()).log(Level.SEVERE, null, ex);
                }
 
            }
 
            @Override
            public void onTrackLimitationNotice(int arg0) {
                // TODO Auto-generated method stub
 
            }
 
            @Override
            public void onDeletionNotice(StatusDeletionNotice sdn) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
 
            @Override
            public void onStallWarning(StallWarning sw) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
 
        };
 
        FilterQuery fq = new FilterQuery();
 
        // FILTRI:
        String keywords[] = {"hacker","hack","hacking","hackerare","keyword"}; // fino a un massimo di 400
        String languages[] = {"it"}; // filtriamo per lingua, ITALIANA.
 
        fq.track(keywords);
        fq.language(languages);
 
        twitterStream.addListener(listener);
        twitterStream.filter(fq);
 
        //twitterStream.sample();
 
    }
}

Fine

L’esecuzione del programma non termina finchè non lo chiudiamo espressamente noi stessi. Ogni tweet che viene catturato, viene salvato nel file elenco-tweets.txt

Per qualsiasi dubbio, commentate!