2017-06-18 87 views
0

我跑了我的代碼,得到了一些鳴叫與數= 50000鳴叫,但後得到他們中的一些我得到這個錯誤。我回顧了錯誤消息下面的鏈接,但無法得到任何幫助超出速率限制

[WARNING] 
429:Returned in API v1.1 when a request cannot be served due to the application's rate limit having been exhausted for the resource. See Rate Limiting in API v1.1.(https://dev.twitter.com/docs/rate-limiting/1.1) 
message - Rate limit exceeded 
code - 88 

Relevant discussions can be found on the Internet at: 
http://www.google.co.jp/search?q=d35baff5 or 
http://www.google.co.jp/search?q=12c94134 
TwitterException{exceptionCode=[d35baff5-12c94134], statusCode=429, 
message=Rate limit exceeded, code=88, retryAfter=-1, 
rateLimitStatus=RateLimitStatusJSONImpl{remaining=0, limit=180, 
resetTimeInSeconds=1497756414, secondsUntilReset=148}, version=3.0.3} 
at 
twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177) 

誤差的第2部分

[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven- 
plugin:1.6.0:java (default-cli) An exception occured while executing the Java class. 429:Returned in 
API v1.1 when a request cannot be served due to the application's rate 
limit having been exhausted for the resource. See Rate Limiting in API 
v1.1.(https://dev.twitter.com/docs/rate-limiting/1.1) 
[ERROR] message - Rate limit exceeded 

我發現沒有解決一些類似的帖子,除了一個,我沒有得到它好,而且由於我的聲譽,我無法寫評論!

+1

[Twitter4j - 超出限制速度]的可能副本(https://stackoverflow.com/questions/19999779/twitter4j-rate-limit-exceeded) – MWiesner

+0

由於我在鏈接中的聲望,我無法發表評論你寫了這麼寫我的帖子,我沒有得到好的解決方案。如果你願意,你能幫忙嗎? – prog

+0

您可以每15分鐘獲得900條推文,這是API限制。如果你真的想加載50,000條推文,需要840分鐘= 14小時 – shiftpsh

回答

1

in twitter4j還有RateLimitStatus對象。你可以在一些API調用後訪問這個對象。例如:

User user = twitter.showUser(userId); 
user.getRateLimitStatus(); 
//OR 
IDs followerIDs = twitter.getFollowersIDs(user.getScreenName(), -1); 
followerIDs.getRateLimitStatus(); 
//OR 
QueryResult result = twitter.search(query); 
result.getRateLimitStatus(); 

也許你可以使用一個函數來處理速率限制這樣的:

private void handleRateLimit(RateLimitStatus rateLimitStatus) { 
    //throws NPE here sometimes so I guess it is because rateLimitStatus can be null and add this condition 
    if (rateLimitStatus != null) { 
     int remaining = rateLimitStatus.getRemaining(); 
     int resetTime = rateLimitStatus.getSecondsUntilReset(); 
     int sleep = 0; 
     if (remaining == 0) { 
      sleep = resetTime + 1; //adding 1 more seconds 
     } else { 
      sleep = (resetTime/remaining) + 1; //adding 1 more seconds 
     } 

     try { 
      Thread.sleep(sleep * 1000 > 0 ? sleep * 1000 : 0); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

或也許這:

private void handleRateLimit(RateLimitStatus rateLimitStatus) { 
    int remaining = rateLimitStatus.getRemaining(); 
    if (remaining == 0) { 
     int resetTime = rateLimitStatus.getSecondsUntilReset() + 5; 
     int sleep = (resetTime * 1000); 
     try { 
      Thread.sleep(sleep > 0 ? sleep : 0); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

希望這有助於。

任何其他/更好的方法也將不勝感激。