Ошибка обновления 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, я решил проблему.