twitter4j - подсчитать количество твитов за 24 часа, вернуть целое число

Я пытаюсь получить одно целое число из числа твитов определенного ключевого слова в течение 24 часов. Итак, скажите, что ключевым словом является "трафик". Я хочу посчитать количество твитов со словом "трафик" за последние 24 года и сохранить его как число, которое будет использоваться для генерации других вещей.

Прямо сейчас я могу указать конкретное число с помощью query.setCount и получить произвольное число (1024) твитов за последние 24 часа, но я не могу сказать, ВСЕ ли это твиты в течение 24 часов, все, что мне действительно нужно, это номер, мне не нужен фактический текст или другая информация твитов. Кроме того, по мере появления новых твитов обновляйте этот номер.

Как я мог сделать это?

Вот мой метод getNewTweets:

    void getNewTweets(){
    SimpleDateFormat sdf = new SimpleDateFormat("y-M-d");

  Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, -24);

  String yesterday = sdf.format(calendar.getTime());

Query query = new Query("traffic"); 
  query.setSince(yesterday);
  int numberOfTweets = 1024;
  long lastID = Long.MAX_VALUE;
  while (tweets.size () < numberOfTweets) {
    if (numberOfTweets - tweets.size() > 100)
      query.setCount(100);
    else 
      query.setCount(numberOfTweets - tweets.size());
    try {
      QueryResult result = twitter.search(query);
      tweets.addAll(result.getTweets());
      println("Gathered " + tweets.size() + " tweets");
      for (Status t: tweets) 
        if(t.getId() < lastID) lastID = t.getId();

    }

    catch (TwitterException te) {
      println("Couldn't connect: " + te);
    }; 
    query.setMaxId(lastID-1);
  }

}

2 ответа

Тем не менее (ответ @mbaxi) Я думаю, что для не очень популярного слова Stream API подойдет для этой задачи. Я запускаю этот код в течение 5 минут, используя очень популярную "любовь", и пока не получил предупреждений, также получил около 25000 твитов в любви... Я сделал этот очень простой и не точный таймер только для примера... Хотя вы сказали, что не хотите, чтобы текст был напечатан на консоли...

Вот пример

import twitter4j.util.*;
import twitter4j.*;
import twitter4j.management.*;
import twitter4j.api.*;
import twitter4j.conf.*;
import twitter4j.json.*;
import twitter4j.auth.*;
int startTime;
int tweetNumber;
PFont f ;
String theWord = "love";


TwitterStream twitterStream;

void setup() {     
  size(800, 100);    
  background(0); 
  f  = createFont("SourceCodePro-Regular", 25);
  textFont(f);
  openTwitterStream();
  startTime = minute();
}  


void draw() {     
  background(0);
  int passedTime = minute() - startTime;
  text("Received " + nf(tweetNumber, 5) + " tweets with the word: " + theWord, 30, height - 50); 
  text("in last " +  nf(passedTime, 3) + " minutes", 30, height - 25);
}  



// Stream it
void openTwitterStream() {  

  ConfigurationBuilder cb = new ConfigurationBuilder();  
  cb.setOAuthConsumerKey("-----FILL-----");
  cb.setOAuthConsumerSecret("-----FILL-----");
  cb.setOAuthAccessToken("-----FILL-----");
  cb.setOAuthAccessTokenSecret("-----FILL-----"); 

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

  FilterQuery filtered = new FilterQuery();

  // if you enter keywords here it will filter, otherwise it will sample
  String keywords[] = {
    theWord
  };

  filtered.track(keywords);

  twitterStream.addListener(listener);

  if (keywords.length==0) {
    // sample() method internally creates a thread which manipulates TwitterStream 
    twitterStream.sample(); // and calls these adequate listener methods continuously.
  } else { 
    twitterStream.filter(filtered);
  }
  println("connected");
} 


// Implementing StatusListener interface
StatusListener listener = new StatusListener() {

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

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

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

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

  //@Override
  public void onStallWarning(StallWarning warning) {
    System.out.println("Got stall warning:" + warning);
  }

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

Вы не можете сказать точное количество твитов для определенного фильтра / поискового запроса. Оба API имеют ограниченную скорость. Вы должны будете использовать пожарный шланг, чтобы получить все данные твитов, и это оплачивается.

Ниже приведен отрывок из формы Twitter Dev -

Before getting involved, it’s important to know that the Search API is focused on relevance and notcompleteness. This means that some Tweets and users may be missing from search results. If you want tomatch for completeness you should consider using a Streaming API instead

Пожалуйста, прочитайте следующие ссылки для более полного понимания ограничения скорости потокового API - https://twittercommunity.com/t/how-much-data-returned-when-using-streaming-api/8407

Другие вопросы по тегам