过滤最新推文

时间:2013-11-29 11:49:32

标签: java processing twitter4j

我正在尝试使用sad, okay, joyful字样过滤最新的推文。

当一条内容中有任何一个词的推文时,我希望它能够打印那条推文。但我也希望打印的推文有延迟。所以每条推文之间大约有10秒的延迟。例如:

如果推文发出:@joker im so sad today 然后我希望它打印到屏幕,并显示以下消息

的System.out.println(“ * ** * ** * ** * ** * ** * ** * ** * ** *一个悲伤鸣叫“);

然后如果在此之后发出推文:@programmer im joyful 然后在最后一条推文发布10秒后,我希望通过以下消息将屏幕上的消息传来。

的System.out.println(“ * ** * ** * ** * ** * ** * ** * ** * ** *快乐鸣叫“);

等等。

下面,我已经制作了一些代码,允许您过滤推文,但我不确定如何为每条推文测试和打印单独的消息。我尝试将其存储在Arraylist中并使用消息检索每条推文,但这不起作用。有没有办法做到这一点? 我使用处理2和twitter4j 3 有什么建议?溶液

void GetTweetsByKeywords()
{

   List<String>mood = new ArrayList <String>();
   ConfigurationBuilder cb = new ConfigurationBuilder();
   cb.setOAuthConsumerKey("XXXX");
   cb.setOAuthConsumerSecret("XXX");
   cb.setOAuthAccessToken("XXXX");
   cb.setOAuthAccessTokenSecret("XXXX");

   TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance();
   StatusListener statusListener = new StatusListener()
   {
      private int count = 0;
      private long originalTweetId = 0;

      @Override
      public void onStatus(Status status)
      {

          System.out.println(status.getUser().getName() + " : " + status.getText());

      } //en of the onStatus()
      public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice)
      {
          // should really remove deleted tweets here ...
      }

      public void onTrackLimitationNotice(int numberOfLimitedStatuses)
      {
      }

      public void onScrubGeo(long userId, long upToStatusId) {
      // should really remove deleted location information here ...
      }

      public void onStallWarning(StallWarning stallWarning) {
      // should really do something about stalls here ...
      }
      @Override
      public void onException(Exception ex)
      {
        ex.printStackTrace();
      }

  }; //end of the listener
  String keywords[] = {"sad","okay","joyful"};
  for(int i=0; i<keywords.length; i++)
  {
      FilterQuery fq = new FilterQuery();

      fq.track(keywords);

      twitterStream.addListener(statusListener);
      twitterStream.filter(fq);
      mood.add(//here i want to add the filtered tweets);
      System.out.println("Heres a filter :" + mood.get(i));

      if (mood.get(i).equals("sad"))
      {
         System.out.println("*********************************************a sad tweet");
      }
      else if (mood.get(i).equals("joyful"))
      {
        System.out.println("*********************************************a joyfull tweet");
      }
      else if(mood.get(i).equals("okay"))
      {
        System.out.println("*********************************************okay tweet");
      }

}

}

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用单独的线程和队列。这样做:

final Queue<Status> queue = new LinkedBlockingQueue<Status>(10000);

new Thread(){
    // In your status listener, post tweets to the queue
    ...
        public void onStatus(Status status){
            queue.offer(status);
        }
    ...

    // Create TwitterStream instance, add query
    // and start listening
    twitterStream.filter(fq);
}.start();

while(!Thread.currentThread().isInterrupted()){
    Status nextTweet = queue.take();
    System.out.println("Do stuff with tweet");
}