Twitter 超过利率上限

Twitter 超过利率上限,twitter,twitter4j,Twitter,Twitter4j,我运行代码,得到了一些tweets,其中number=50000,但在得到其中一些tweets后,我得到了这个错误。我查看了错误消息中的以下链接,但没有得到任何帮助 [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 AP

我运行代码,得到了一些tweets,其中number=50000,但在得到其中一些tweets后,我得到了这个错误。我查看了错误消息中的以下链接,但没有得到任何帮助

[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)
错误的第二部分

[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

我发现了一些没有解决方案的类似帖子,除了一个我没有很好地理解,而且由于我的声誉,我无法写评论

在twitter4j中有一个对象。您可以在一些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();
        }
    }
}
希望这有帮助


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

在twitter4j中有一个对象。您可以在一些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();
        }
    }
}
希望这有帮助


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

可能的重复我没有能力评论,因为我在你写的链接中的声誉,所以我写了我的帖子,我没有得到很好的解决方案。如果你愿意,你能帮忙吗?你每15分钟可以收到900条推文,这是API的限制。如果你真的想加载50000条推文,需要840分钟=14hours@shiftpsh谢谢你的回复,很抱歉迟了回复。所以这个错误意味着我超过了根据时间应该发出的tweet的限制,对吗?但我如何控制编码时间以获得更多!?可能重复的我没有能力评论,因为我在你写的链接中的声誉,所以我写了我的文章,我没有得到很好的解决方案。如果你愿意,你能帮忙吗?你每15分钟可以收到900条推文,这是API的限制。如果你真的想加载50000条推文,需要840分钟=14hours@shiftpsh谢谢你的回复,很抱歉迟了回复。所以这个错误意味着我超过了根据时间应该发出的tweet的限制,对吗?但我如何控制编码时间以获得更多!?