Twitter4j - 超出了限额

时间:2013-11-15 11:13:51

标签: java twitter twitter4j

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

  

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小时后运行代码并得到相同的错误消息。我不知道为什么。谢谢你的帮助。

2 个答案:

答案 0 :(得分:9)

Twitter API中有速率限制。您不能每15分钟拨打一次给定的Twitter API端点(代表未经授权的用户)。

您遇到的问题是您的代码必须非常快速地达到速率限制(对于给定的经过身份验证的用户,the endpoint to retrieve followers IDs限制为每15分钟15次调用),因此您必须等待(904秒)再试一次。

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

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

答案 1 :(得分:3)

你不必等待修正利率限制问题。如果您有许多令牌对应不同的Twitter帐户,那么您可以更新当前使用的令牌。想想大局。假设您在列表或数组对象中有25个不同的帐户(令牌),并且每次有速率限制问题时,您将获得其中一个帐户(令牌)。然后,当您到达列表标记列表中的最后一项时,您可以使用这25个令牌帐户重新填充此列表。美丽就是这样,如果你有足够多的账户(代币),每个补货循环,系统会自动等待恢复使用过的账户,所以你不必担心速率限制,你的申请永远不会停止因为速率限制问题。我已经在我的项目中实现了这个机制,它完美无缺。 这是唯一最好的解决方案。