2013-11-15 33 views
5

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

+0

这是一个twitter问题,而不是Twitter4J问题。 Twitter4J只是调用Twitter API。您的Twitter帐户是否已被列入黑名单?它被禁止了吗?可能Twitter已停止向您提供太多电话的数据? –

+0

该帐户未被列入黑名单或被禁止。有可能twitter已停止向我提供超过一天的数据吗? – Matt

回答

9

Twitter API中有费率限制。您无法每15分钟给定一次给定的Twitter API端点(代表授权用户)。

发生在你身上的是你的代码必须很快达到速率限制(the endpoint to retrieve followers IDs对于给定的已认证用户每15分钟限制15个呼叫),所以你必须等待(904秒)才能再次尝试。

为了节省您的API调用并避免达到费率限制,请小心所调用的Twitter API端点(通过Twitter4J)。

如需进一步信息,看看上Twitter Developers这些资源,特别是在its documentation

+0

我知道Twitter API有限制,但我不明白为什么我会在一小时后收到相同的错误消息,同时我还没有使用Twitter API服务。 – Matt

+1

你在用户列表中有多少用户?正如我在回答中所说的,您每15分钟只能提出15个请求来检索关注者ID。因此,如果您的用户列表中至少有16个用户(15 + 1),则第16位成员将在不到15分钟的时间内向“GET followers/ids”端点发出第16次请求。 Twitter API将因此响应429,并且会引发异常。每次尝试执行代码时(如果'users'列表中的成员数大于15个),甚至在执行前一小时后都会发生这种情况。 –

+0

我在列表中只有一个用户。正如你可以在例子 – Matt

2

您不必等待解决费率限制问题。如果您有许多令牌对应不同的Twitter帐户,那么您可以续订当前使用的令牌,正确。想想大局。假设您在列表或数组对象中有25个不同的帐户(令牌),并且您每次遇到费率限制问题时都会获得其中一个帐户(令牌)。然后,当您到达列表标记列表中的最后一个项目时,您可以使用这25个标记帐户填充此列表,对。美丽的是,如果您拥有足够数量的账户(代币),每次补充循环,系统将自动等待恢复使用的账户,因此您不必担心费率限制,并且您的应用程序永远不会停止由于费率限制问题。我已经在我的项目中实现了这个机制,它的工作非常完美。 这是唯一最好的解决方案。

+1

嘿,你会怎样在一个循环中检查一个429的TwitterException,然后改变Twitter对象的标记? – nullwriter

+0

实际上,我正在检查错误消息是否包含“超出限制速度”。如果它包含,我更新当前令牌。这是我当时使用的唯一方法。也许,现在twitter4J有一个机制。我不知道。 – mgokhanbakal

+0

@MehmetGokhanBAKAL你还在吗?我有个问题。 – user3764893