2012-02-22 18 views
5

Mi objetivo es recopilar todos los tweets que contengan las palabras "Francia" y "Alemania" y también recopilar metadatos asociados (por ejemplo, las coordenadas geográficas adjuntas al tweet). Sé que estos metadatos están disponibles, pero no entiendo cómo acceder a ellos con la biblioteca Java que estoy usando: "twitter4j".twitter4j - acceder a la información de tweets de Streaming API

Ok, entonces lo que tengo hasta ahora está tomado de muestras de código en el sitio de twitter4j. Imprime todos los tweets que contienen mis palabras clave elegidas, ya que la API de transmisión de Twitter los proporciona en tiempo real. Llamo al método de filtro en mi objeto TwitterStream, y esto proporciona la transmisión. Pero necesito más control. A saber, me gustaría poder:

1) escribir los tweets en un archivo; 2) solo imprime los primeros 1000 tweets; 3) acceder a otros metadatos adjuntos al tweet (el método de filtro solo imprime el nombre de usuario y el tweet mismo).

Aquí está el código que tengo hasta ahora:

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

Necesita una ayuda. Recibo este siguiente error. 'El tipo nuevo StatusListener() {} debe implementar el método abstracto heredado StatusListener.onStallWarning (StallWarning)' –

Respuesta

5

Después de mirar esto con ojos frescos me di cuenta de la solución (que era bastante obvio). Editar la siguiente parte del código:

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

me permite acceder a otros metadatos. Por ejemplo, si quiero acceder a la fecha del pío, que sólo tendrá que añadir lo siguiente:

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

El error 401 viene cuando la API está intentando acceder a cierta información que es No es posible obtener en la actualidad. Por lo tanto, debe verificar el permiso permitido en twitter. Cámbielo a READ, WRITE y ... para obtener acceso completo a la API. O puede haber un problema ya que podría estar usando el servidor proxy. Por lo tanto, mencione los detalles del proxy usando los siguientes comandos.

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

Para escribir tweets en archivo:

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(); 
    } 
} 
Cuestiones relacionadas