Ошибка обновления API Twitter 403

Я пытаюсь получить данные из Twitter API с API Twitter4j. После некоторого времени восстановления данных я получаю следующую ошибку:

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

Я пришел к выводу, что вышеуказанная ошибка выводит пределы вызовов, которые поддерживает твиттер API. Как можно создать интервалы для ожидания получения данных из твиттера?

Например, мой код выглядит следующим образом:

            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 ответа

Решение

На каждый ответ вы можете позвонить getRateLimitStatus() чтобы получить RateLimitStatus, RateLimitStats.getRemaining() сообщит вам оставшееся количество запросов API, доступных для этого семейства вызовов, если оно достигнет нуля, вы можете RateLimitStatus.getSecondsUntilReset()и подождите хотя бы так долго, прежде чем делать дополнительные звонки.

Информацию об ограничениях скорости твиттеров можно найти здесь: 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 звонка в Twitter, showUser а также getUserTimeLine, Вам нужно проверить статус ограничения скорости после обоих этих звонков (оба User а также ResponseList простираться TwitterResponse и иметь информацию об ограничении скорости). Эти вызовы принадлежат 2 разным ресурсным семействам (users а также statuses) оба эти метода могут вызываться 180 раз за окно ограничения скорости (15 минут).

У меня была та же самая ошибка, и обновление до последней версии twitter4j 3.0.5 устранило мою проблему. Получить последнюю версию здесь http://twitter4j.org/en/index.html Я должен отметить, что версия, которую я использовал, была twitter4j 3.0.3. Поэтому, перейдя на версию 3.0.5 или 3.0.6, я решил проблему.

Другие вопросы по тегам