【问题标题】:Twitter4j - Rate limit exceededTwitter4j - 超出速率限制
【发布时间】:2013-11-15 11:13:51
【问题描述】:

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

连接错误异常 ... 超出速率限制

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

【问题讨论】:

  • 这是一个 Twitter 问题,而不是 Twitter4J 问题。 Twitter4J 只是调用 Twitter API。你使用的推特账号是否被列入黑名单?它被禁止了吗?也许 Twitter 已停止为您提供太多通话的数据?
  • 该帐号未被列入黑名单或被封禁。是否有可能 twitter 已经停止为我提供超过一天的数据?

标签: java twitter twitter4j


【解决方案1】:

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

发生在您身上的是您的代码必须很快达到速率限制(the endpoint to retrieve followers IDs 对于给定的经过身份验证的用户,每 15 分钟限制为 15 次调用),因此您必须等待(904 秒)才能重试.

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

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

【讨论】:

  • 我知道 Twitter API 有限制,但我不明白为什么我在一小时后收到相同的错误消息,同时我还没有使用 Twitter API 服务。
  • 您的users 列表中有多少用户?正如我在回答中所说,您每 15 分钟只能发出 15 个请求来检索关注者 ID。因此,如果您的users 列表至少有 16 个用户 (15 + 1),则第 16 个成员将在 15 分钟内向GET followers/ids 端点发出第 16 个请求。 Twitter API 将因此响应 429 并引发异常。每次尝试执行您的代码时都会发生这种情况(当然,如果 users 列表有 > 15 个成员),即使在上一次执行后一小时也是如此。
  • 列表中只有一个用户。正如您在示例中看到的“TechCrunch”
  • 我认为您不了解您的代码真正做了什么。首先它在 Twitter 上搜索“TechCrunch”用户。然后它检索关注者 ID 和每个人的贡献者。看起来你的研究给你带来的回报远远不止一个用户。我对 Web 界面 (twitter.com/search?q=TechCrunch&src=typd&mode=users) 进行了研究,它返回给我的用户数量超过了要求的速率限制:@TechCrunch(当然!)、@TCFR、@TechCrunchOnion、@TechCrunchTV、@RSS_TechCrunch、@TechCrunchItaly, @TechCrunchIndia、@TC_Europe、@alexia...
  • 这些链接现在已经改变,这里是更新的:速率限制:developer.twitter.com/en/docs/basics/rate-limits.html,响应代码:developer.twitter.com/en/docs/basics/response-codes
【解决方案2】:

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

【讨论】:

  • 嘿,您如何在循环期间检查 429 TwitterException 以更改 twitter 对象的标记?
  • 实际上,我正在检查错误消息是否包含“超出速率限制”。如果它包含,我更新当前令牌。这是我当时唯一使用的方法。也许,现在 twitter4J 有一个机制。我不知道。
  • @MehmetGokhanBAKAL 你还在吗?我有一个问题。
  • 好的,你可以问你的问题。
  • 您上面提到的解决方案对于使用该应用程序的单个用户来说是有意义的。但是,如果有 10.000 个用户同时使用该应用程序怎么办?只有 25 个无法处理的帐户(令牌),对吧?
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2012-08-10
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多