2012-02-22 2 views
5

Моя цель - собрать все твиты, содержащие слова «Франция» и «Германия», а также собирать связанные метаданные (например, геокодировки, прикрепленные к твиту). Я знаю, что эти метаданные доступны, но я не могу понять, как получить доступ к нему с помощью библиотеки Java, которую я использую: «twitter4j».twitter4j - доступ к твиту информации от Streaming API

Хорошо, так что я до сих пор взят из образцов кода на сайте twitter4j. Он печатает все твиты, содержащие мои выбранные ключевые слова, так как они предоставляются в режиме реального времени через Streaming API Twitter. Я называю метод фильтра на моем объекте TwitterStream, и это обеспечивает поток. Но мне нужно больше контроля. А именно, я хотел бы иметь возможность:

1) написать твиты в файл; 2) распечатывать только первые 1000 твитов; 3) доступ к другим метаданным, прикрепленным к твиту (метод фильтра просто распечатывает имя пользователя и сам твит).

Вот код, который я до сих пор:

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

Нужна помощь. Я получаю следующую ошибку. 'Тип new StatusListener() {} должен реализовать наследованный абстрактный метод StatusListener.onStallWarning (StallWarning)' –

ответ

5

После глядя на это свежим взглядом, я понял, что решение (которое было довольно очевидно). Редактирование следующей части кода:

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

позволяет мне получить доступ к другим метаданным. Например, если я хочу, чтобы получить доступ к дате твит, я просто нужно добавить следующее:

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

Ошибка 401 возникает, когда API пытается получить доступ к некоторой информации, которая не в состоянии принести в настоящее время. Поэтому вам нужно проверить разрешение, которое разрешено в твиттере. Измените его на READ, WRITE и ... для полного доступа к API. Или может возникнуть проблема, поскольку вы можете использовать прокси-сервер. Поэтому укажите данные прокси, используя следующие команды.

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

Чтобы написать чириканье на файл:

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