Twitter API更新限制错误403

时间:2014-05-08 08:35:54

标签: java twitter

我正在尝试使用twitter4j api从twitter api中检索数据。检索数据一段时间后,我收到以下错误:

Exception in thread "main" 403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (https://support.twitter.com/articles/15364-about-twitter-limits-update-api-dm-and-following).
message - User has been suspended.
code - 63

我得出的结论是,上述错误导致了twitter api支持的调用限制。如何才能创建间隔以便等到可以从twitter获取数据?

例如我的代码如下:

            Long l = Long.parseLong(list.get(index));
            TwitterResponse response = twitter.getFollowersIDs(l);
            RateLimitStatus status = response.getRateLimitStatus();
            if (status.getRemaining() < 2) {
                try {
                    System.out.println("status.getSecondsUntilReset()");
                    Thread.sleep(status.getSecondsUntilReset());
                } catch (InterruptedException e) {
                    System.out.println(e);
                }
            }
            User user = twitter.showUser((l));
            //statuses = twitter.getUserTimeline(l);
            JSONObject features = new JSONObject();

            features.put("_id", l);
            score = kloutScore(l);

我的新代码包含一个if语句,用于检查status.getRemaining()是否接近零,然后等待15分钟,这实际上是限制持续时间。但是我遇到了TwitterResponse response = twitter.getFollowerIDs(l)的问题;我收到的消息是:

Exception in thread "main" 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

2 个答案:

答案 0 :(得分:3)

在每个回复中,您都可以致电getRateLimitStatus()获取RateLimitStatusRateLimitStats.getRemaining()会告诉您可用于该系列通话的剩余API请求数,如果达到零,则可以调用RateLimitStatus.getSecondsUntilReset(),并在拨打其他电话之前至少等待很长时间。

有关Twitters速率限制的信息,请访问:https://dev.twitter.com/docs/rate-limiting/1.1

这是一个基本的例子:

do {
    TwitterResponse response = twitter.getFollowersIDs(userId, cursor);
    RateLimitStatus status = response.getRateLimitStatus();
    if(status.getRemaining() == 0) {
        try {
            Thread.sleep(status.getSecondsUntilReset() * 1000);
        }
        catch(InterruptedException e) {
            // ...
        }
    }
} while(cursor > 0);

在您现在提供的代码中,您正在拨打2个电话,showUsergetUserTimeLine。您需要在这两次调用后检查速率限制状态(UserResponseList都延长TwitterResponse并具有速率限制信息)。这些调用属于2个不同的资源系列(usersstatuses),这两种方法都允许在每个速率限制窗口(15分钟)内调用180次。

答案 1 :(得分:1)

我遇到了同样的错误,升级到最新版本的twitter4j 3.0.5解决了我的问题。在这里获取最新信息http://twitter4j.org/en/index.html#download我应该提到我运行的版本是twitter4j 3.0.3。因此,通过转到3.0.5或3.0.6修复了我的问题。