2012-02-22 13 views
5

Moim celem jest zebranie wszystkich tweetów zawierających słowa "Francja" i "Niemcy" oraz zbieranie powiązanych metadanych (np. Współrzędne geograficzne dołączone do tweeta). Wiem, że te metadane są dostępne, ale nie wiem, jak uzyskać do nich dostęp za pomocą biblioteki Java, której używam: "twitter4j".twitter4j - dostęp do informacji tweetowych z Streaming API

OK, więc to, co do tej pory otrzymałem, pochodzi z próbek kodu na stronie twitter4j. Wyświetla wszystkie tweety zawierające wybrane przeze mnie słowa kluczowe, ponieważ są one dostarczane w czasie rzeczywistym przez Twitterowy interfejs API strumieniowania. Wywołuję metodę filtrowania na moim obiekcie TwitterStream, co zapewnia strumień. Ale potrzebuję większej kontroli. Mianowicie chciałbym móc:

1) napisać tweety do pliku; 2) wydrukować tylko pierwszych 1000 tweetów; 3) dostęp do innych metadanych dołączonych do tweeta (metoda filtru po prostu wypisuje nazwę użytkownika i tweet).

Oto kod mam tak daleko:

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

Potrzebujesz pomocy. Otrzymuję następujący błąd. "Typ new StatusListener() {} musi implementować odziedziczoną metodę abstrakcyjną StatusListener.onStallWarning (StallWarning)" –

Odpowiedz

5

Po patrząc na to świeżym okiem zdałem sobie sprawę, roztwór (co było dość oczywiste). Edytowanie następującej części kodu:

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

pozwala mi uzyskać dostęp do innych metadanych. Na przykład, jeśli chcesz uzyskać dostęp datę tweet jest, po prostu trzeba dodać co następuje:

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

Błąd 401 przychodzi gdy API próbuje uzyskać dostęp do pewnych informacji, które nie jest w stanie pobrać w chwili obecnej. Musisz więc sprawdzić uprawnienia, które są dozwolone na Twitterze. Zmień go na READ, WRITE i ... dla pełnego dostępu API. Lub może być problem, ponieważ możesz używać serwera proxy. Wymień szczegóły serwera proxy, używając następujących poleceń.

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

Aby napisać tweets na pliku:

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(); 
    } 
} 
Powiązane problemy