2012-02-22 31 views
5

Il mio obiettivo è raccogliere tutti i tweet contenenti le parole "Francia" e "Germania" e anche raccogliere i metadati associati (ad es. Le coordinate geografiche allegate al tweet). So che questi metadati sono disponibili, ma non riesco a capire come accedervi con la libreria Java che sto usando: "twitter4j".twitter4j - accedere alle informazioni tweet dall'API Streaming

Ok, quindi quello che ho finora è preso da campioni di codice sul sito twitter4j. Stampa tutti i tweet contenenti le mie parole chiave scelte, poiché sono fornite in tempo reale dall'API di streaming di Twitter. Chiamo il metodo di filtro sul mio oggetto TwitterStream e questo fornisce lo stream. Ma ho bisogno di più controllo. Vale a dire, vorrei essere in grado di:

1) scrivere i tweet in un file; 2) stampa solo i primi 1000 tweet; 3) accedere ad altri metadati allegati al tweet (il metodo di filtro stampa solo il nome utente e il tweet stesso).

Ecco il codice che ho finora:

import twitter4j.FilterQuery; 
import twitter4j.Status; 
import twitter4j.StatusDeletionNotice; 
import twitter4j.StatusListener; 
import twitter4j.TwitterException; 
import twitter4j.TwitterStream; 
import twitter4j.TwitterStreamFactory; 
import twitter4j.conf.ConfigurationBuilder; 

public class Stream { 
    public static void main(String[] args) throws TwitterException { 

    ConfigurationBuilder cb = new ConfigurationBuilder(); 
    cb.setDebugEnabled(true); 
    cb.setOAuthConsumerKey("bbb"); 
    cb.setOAuthConsumerSecret("bbb"); 
    cb.setOAuthAccessToken("bbb"); 
    cb.setOAuthAccessTokenSecret("bbb"); 

    TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance(); 
    StatusListener listener = new StatusListener() { 

     public void onStatus(Status status) { 
      System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText()); 
     } 

     public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) { 
      System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId()); 
     } 

     public void onTrackLimitationNotice(int numberOfLimitedStatuses) { 
      System.out.println("Got track limitation notice:" + numberOfLimitedStatuses); 
     } 

     public void onScrubGeo(long userId, long upToStatusId) { 
      System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId); 
     } 

     public void onException(Exception ex) { 
      ex.printStackTrace(); 
     } 
    }; 

    FilterQuery fq = new FilterQuery(); 
    String keywords[] = {"France", "Germany"}; 

    fq.track(keywords); 

    twitterStream.addListener(listener); 
    twitterStream.filter(fq);  
} 
} 
+0

Serve un aiuto. Sto ottenendo questo errore seguente. 'Il tipo new StatusListener() {} deve implementare il metodo astratto ereditato StatusListener.onStallWarning (StallWarning)' –

risposta

5

Dopo aver guardato questo con occhi nuovi mi sono reso conto la soluzione (che era abbastanza evidente). Modifica la seguente parte del codice:

public void onStatus(Status status) { 
     System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText()); 
    } 

mi consente di accedere ad altri metadati. Per esempio, se voglio accedere la data del Tweet, ho semplicemente bisogno di aggiungere quanto segue:

System.out.println(status.getCreatedAt()); 
0

L'errore 401 viene quando l'API sta tentando di accedere ad alcune informazioni che è in grado di recuperare in questo momento. Quindi è necessario controllare il permesso che sono consentiti su Twitter. Cambialo in READ, WRITE e ... per l'accesso completo all'API. Oppure potrebbe esserci un problema poiché potresti utilizzare il server proxy. Quindi menzionare i dettagli del proxy usando i seguenti comandi.

System.getProperties().put("http.proxyHost", "10.3.100.211"); 
     System.getProperties().put("http.proxyPort", "8080"); 
0

Per scrivere tweets in archivio:

FileWriter file = new FileWriter(....); 

public void onStatus(Status status) { 
    System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText() + " -> "+ status.getCreatedAt()); 
    try { 
     file.write(status.getUser().getScreenName() + " - " + status.getText() + " -> "+ status.getCreatedAt() +"\n"); 
     file.flush(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
Problemi correlati