2014-10-17 52 views
0

我試圖在24小時內檢索某個關鍵字的推文數量的單個整數。 所以說關鍵字是「流量」我想在過去的24日內用「流量」這個詞來計算推文的數量,並將其存儲爲一個數字,用於生成其他內容。twitter4j - 計算24小時內的推文數量,返回一個整數

現在我可以使用query.setCount提供一個特定的數字,並在過去的24小時內檢索任意數量(1024)的推文,但我無法判斷這是否是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); 
    } 

} 

回答

0

你不能告訴鳴叫的確切數量爲特定的過濾器/搜索查詢, 這兩個API的是速率的限制。 您必須使用firehose才能獲取所有推文數據並獲得支付。

下面是摘錄形式的Twitter開發 -

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

0

這就是說(@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(); 
    } 
};