5

我想让关注者getFollowersIds()在 Twitter4j 中使用,但我得到了

ConnectionErrorException ... 超出速率限制

public static void main(String[] args) {
        try {
            Twitter twitter = TwitterFactory.getSingleton();
            String[] srch = new String[]{"TechCrunch"};
            ResponseList<User> users = twitter.lookupUsers(srch);
            for (User user : users) {

                UserHarvest us = new UserHarvest(6017542);
                us.getFollowersIds();
                try {
                    us.getContributors();
                } catch (ConnectionErrorException ex) {
                    Logger.getLogger(UserHarvest.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (TwitterException ex) {
            Logger.getLogger(UserHarvest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

错误信息:

Exception in thread "main" harvest.twitterharvest.ConnectionErrorException: Connection could not have been established
    at harvest.twitterharvest.WrapperTwitter4J.getFollowersIDs(WrapperTwitter4J.java:75)
    at harvest.twitterharvest.UserHarvest.getFollowersIds(UserHarvest.java:106)
    at harvest.twitterharvest.UserHarvest.main(UserHarvest.java:140)
Caused by: 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=92c30ec6 or
    http://www.google.co.jp/search?q=19e1da11
TwitterException{exceptionCode=[92c30ec6-19e1da11], statusCode=429, message=Rate limit exceeded, code=88, retryAfter=-1, rateLimitStatus=RateLimitStatusJSONImpl{remaining=0, limit=15, resetTimeInSeconds=1384512813, secondsUntilReset=904}, version=3.0.4}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:162)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:89)
    at twitter4j.TwitterImpl.get(TwitterImpl.java:1894)
    at twitter4j.TwitterImpl.getFollowersIDs(TwitterImpl.java:409)
    at harvest.twitterharvest.WrapperTwitter4J.getFollowersIDs(WrapperTwitter4J.java:73)
    ... 2 more

我明白了secondsUntilReset=904。我在 1 小时后运行代码并收到相同的错误消息。我不知道为什么。谢谢你的帮助。

4

2 回答 2

10

Twitter API 中有速率限制。您每 15 分钟调用给定 Twitter API 端点的次数不能超过给定次数(是否代表经过身份验证的用户)。

发生在您身上的是您的代码必须非常快地达到速率限制(对于给定的经过身份验证的用户,检索关注者 ID 的端点限制为每 15 分钟 15 次调用),因此您必须等待(904 秒)才能重试.

请注意您正在调用(通过 Twitter4J)的 Twitter API 端点,以节省您的 API 调用,从而避免达到速率限制。

有关更多信息,请查看Twitter Developers上的这些资源,尤其是其文档

于 2013-11-15T15:57:15.423 回答
3

您不必等待修复速率限制问题。如果你有很多代币对应不同的推特账号,那么你可以更新你当前使用的代币,对吧。想想大局。假设您在列表或数组对象中有 25 个不同的帐户(令牌),并且每次遇到速率限制问题时都会获得其中一个。然后,当您到达列表令牌列表中的最后一项时,您可以使用这 25 个令牌帐户重新填充此列表,对。美妙之处在于,如果您有足够数量的账户(代币),每次充值循环,系统会自动等待恢复已使用的账户,因此您不必担心速率限制,您的应用程序将永远不会停止因为速率限制问题。我已经在我的项目中实现了这个机制,并且效果很好。

于 2013-11-19T04:46:48.573 回答