giovedì 4 agosto 2016

Accedere a Twitter mediante le Streaming API e StreamR

Twitter mette a disposizione potenti API attraverso le quali è possibile interrogare lo stream dei tweet e filtrarli attraverso una grande varietà di opzioni quali la geolocalizzazione, gli hashtag, la lingua e così via.
Una panoramica generale sulel API di Twitter la trovate sul portale dedicato agli sviluppatori. Qui ci interessa spiegare i dettagli su come connettersi alle API di Twitter da una applicazione R adoperando la libreria StreamR. Le API di Twitter richiedono una connessione OAuth in cui è necessario innanzitutto accreditare la propria applicazione. Maggiori approfondimenti sul funzionamento di OAuth li potete trovare in un precedente articolo di questo blog.

1) Creare una nuova App. Per affrontare questo passaggio è necessario avere un account Twitter al quale saranno legate tutte le vostre applicazioni. Potrebbe essere il caso di creare un account ad hoc, ovvero di usare il vostro account personale per fare delle prove, siete liberi di giudicare caso per caso quale soluzione fa più al caso vostro. Una volta fatto login, andate all'URL https://apps.twitter.com/ e aggiungete una nuova applicazione (Create new App). Nella pagina successiva comparirà una form in cui inserire informazioni riguardo la vostra applicazione e accettare le policy di licenza di Twitter. A questo punto andate sul panel "Keys and Access Tokens" dove sono disponibili "Consumer Key" e "Consumer Secret" per la vostra App. Queste informazioni andranno inserite nell'applicazione e sono necessarie per effettuare l'handshake con le API. Ad esse vanno aggiunti il Token di accesso che vengono generati cliccando sul pulsante "Generate access token" nello stesso panel. Saranno così creati due nuovi codici "Access token" e "Access token secret" che serviranno sempre nelle operazioni di handshake.

2) OAuth handshake. A questo punto prepariamo lo script R che effettuerà l'handshake con Twitter. Dopo aver installato e caricato le librerie necessarie dal repository CRAN (TwitteR, RCurl, streamR, rjson e ROAuth) con le relative dipendenze, dichiariamo le variabili di accesso alla nostra App:

requestURL    <-  "https://api.twitter.com/oauth/request_token"
accessURL     <-  "https://api.twitter.com/oauth/access_token"
authURL       <-  "https://api.twitter.com/oauth/authorize"

l_consKey     <-  "la vostra consumer key";
l_consSecret  <-  "la vostra consumer secret";
l_token       <-  "il vostro access token";
l_tokenSecret <-  "la vostra access token secret";

download.file(url="http://curl.haxx.se/ca/cacert.pem", destfile="cacert.pem")
my_oauth <- OAuthFactory$new(consumerKey=l_consKey, consumerSecret=l_consSecret,
                             requestURL=requestURL, accessURL=accessURL,
                             authURL=authURL)
my_oauth$handshake(cainfo = system.file("CurlSSL","cacert.pem",
                             package = "RCurl"))

A questo punto, R chiederà di eseguire un passaggio di autenticazione via browser: dovrete eseguire il login a Twitter e vi sarà dato un pin numerico da riportare nella consolle di R allo scopo di autorizzare l'accesso della applicazione R al vostro account Twitter. Eseguito questo step viene popolato l'oggetto my_oauth contenente le informazioni di autenticazione alle API coi relativi token. Per non dover rifare ogni volta questo passaggio è consigliabile salvare queste informazioni in un file:

save(list="my_oauth", file="twitteR_credentials")

che può poi essere richiamato all'occorrenza:

load("twitteR_credentials") 

3) Accesso da un proxy. Se vi trovate a sviluppare in un ambiente protetto da proxy che magari richiede anche una autenticazione, è necessario premettere ai passaggi precedentemente descritti le necessarie configurazioni per permettere a curl di raggiungere l'endpoint di Twitter. Questa operazione può essere fatta come segue:

opts <- list(
  proxy         = "indirizzo del vostro proxy",
  proxyusername = "vostra username",  #se usate un dominio sarà 

                                       "dominio\\username"
  proxypassword = "vostra password",  #password di autenticazione al proxy
  proxyport     = porta del proxy
)

options(RCurlOptions = opts)


ATTENZIONE! C'è da dire che spesso l'operazione di handshake è problematica quando ci si trova dietro un proxy. Talvolta, in dipendenza dalle configurazioni del proxy stesso, lo scambio dei token fra client e endpoint non avviene correttamente a causa di firewall e callbacks col risultato che l'handshake fallisce (con un errore 407). Nel nostro caso, ad esempio, non siamo stati in grado di risolvere il problema di far avvenire l'handshake dietro al proxy, tuttavia abbiamo risolto con un workaround che consiste nell'aver generato l'oggetto my_oauth su una macchina non protetta dal proxy e successivamente nell'aver portato il file con l'oggetto salvato (nell'esempio è twitteR_credentials) nell'ambiente protetto. Il problema principale sta nel fatto che la libreria StreamR consente l'autenticazione solo mediante ROAuth, il quale è un metodo quasi del tutto deprecato in vantaggio di httr. Tuttavia, al mometo della scrittura di questo articolo, StreamR non funziona sotto httr, nonostante abbiamo aperto alcuni ticket nella community di Twitter non abbiamo ancora ricevuto risposta. Se qualcuno fra i nostri lettori dispone di una soluzione al problema lo incoraggiamo a suggerircela nei commenti. Portare il file di accesso nell'ambiente proxy invece ha fatto in modo che la nostra applicazione funzionasse correttamente.

4) Download e sfruttamento dei dati. Una volta in possesso dell'oggetto di autenticazione (che nell'esempio abbiamo chiamato my_oauth), possiamo usare la libreria streamR per scaricare (su disco o in memoria) i dati da twitter. Ad esempio, l'istruzione:



filterStream( file="tweets_rstats.json", track="rstats",
     locations=c(-74,40,-73,41), timeout=600, language="en", 
      oauth=my_oauth )

Apre uno stream che dura 600 secondi e scarica tutti i tweet in lingua inglese che menzionano il termine "rstats" e che sono inviati dalla regione di New York, identificata dalle coordinate espresse col vettore assegnato al parametro locations. Il risultato viene salvato in un file json.
Ulteriori esempi sono disponibili sulla guida del pacchetto streamR disponibile sul repository CRAN.



Nessun commento:

Posta un commento

I commenti di questo blog sono moderati. Pensa prima di scrivere...