2017-06-18 89 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(); 
     } 
    } 
} 

希望这有助于。

任何其他/更好的方法也将不胜感激。