速率限制预防 [Twitter4J]
Rate Limit Prevention [Twitter4J]
我目前正在实施一个程序,该程序要求我使用 Twitter4J 来收集推文并存储它们。但是,我确实意识到,使用 Twitter 的开发人员 API,您每 15 分钟只能发出 180 个请求。
因此,我创建了一种方法,该方法在收到 10 条推文后停止程序 15 分钟,同时我的消费者和访问密钥重置速率限制。但是,有时速率限制仍然设法在获取这 10 条推文之间 运行?所以我想做的是更改方法,使其因速率限制即将 运行 而停止。
例如...
if (rate limit = 0){
stop program until rate limit resets
}
但是,我刚才的方法只是实现了一个计数器,当计数器达到10时,它就停止了,这不是很经济或有效。我认为 10 条推文就足够了,但显然不够。
这是我的方法...
public void getRateLimit() throws TwitterException{
if (count == 10){
try {
System.out.println("Rate Limit is about to be exhausted for resource...");
System.out.println("Please wait for 15 minutes, while it resets...");
TimeUnit.MINUTES.sleep(15);
count = 0;
} catch (InterruptedException e) {
System.out.println(e);
}
}
我怎样才能改变它,以便它 运行 在速率限制即将 运行 结束时停止,并且仅在补充时开始。
感谢您的帮助。
我以前遇到过同样的问题,我尝试计算 1 个请求的时间花费。如果该请求少于 5500 毫秒,程序会等到 5500 毫秒,并且它对我来说非常有效,
你可以问为什么是 5500 毫秒,因为 180 个请求 15 分钟使得每个请求 5 秒。
这是我使用的代码,希望对您有所帮助。
do {
final long startTime = System.nanoTime();
result = twitter.search(query);
statuses = result.getTweets();
for (Status status : statuses) {
tweet = new Tweet(status);
userProfile = new UserProfile(status.getUser());
imageDownloader.getMedia(tweet.mediaEntities);
imageDownloader.getProfilePhoto(userProfile.ProfileImageUrl);
System.out.println(tweet);
System.out.println(userProfile);
}
final long duration = System.nanoTime() - startTime;
if ((5500 - duration / 1000000) > 0) {
logger.info("Sleep for " + (6000 - duration / 1000000) + " miliseconds");
Thread.sleep((5500 - duration / 1000000));
}
} while ((query = result.nextQuery()) != null);
我目前正在实施一个程序,该程序要求我使用 Twitter4J 来收集推文并存储它们。但是,我确实意识到,使用 Twitter 的开发人员 API,您每 15 分钟只能发出 180 个请求。
因此,我创建了一种方法,该方法在收到 10 条推文后停止程序 15 分钟,同时我的消费者和访问密钥重置速率限制。但是,有时速率限制仍然设法在获取这 10 条推文之间 运行?所以我想做的是更改方法,使其因速率限制即将 运行 而停止。
例如...
if (rate limit = 0){
stop program until rate limit resets
}
但是,我刚才的方法只是实现了一个计数器,当计数器达到10时,它就停止了,这不是很经济或有效。我认为 10 条推文就足够了,但显然不够。 这是我的方法...
public void getRateLimit() throws TwitterException{
if (count == 10){
try {
System.out.println("Rate Limit is about to be exhausted for resource...");
System.out.println("Please wait for 15 minutes, while it resets...");
TimeUnit.MINUTES.sleep(15);
count = 0;
} catch (InterruptedException e) {
System.out.println(e);
}
}
我怎样才能改变它,以便它 运行 在速率限制即将 运行 结束时停止,并且仅在补充时开始。 感谢您的帮助。
我以前遇到过同样的问题,我尝试计算 1 个请求的时间花费。如果该请求少于 5500 毫秒,程序会等到 5500 毫秒,并且它对我来说非常有效,
你可以问为什么是 5500 毫秒,因为 180 个请求 15 分钟使得每个请求 5 秒。
这是我使用的代码,希望对您有所帮助。
do {
final long startTime = System.nanoTime();
result = twitter.search(query);
statuses = result.getTweets();
for (Status status : statuses) {
tweet = new Tweet(status);
userProfile = new UserProfile(status.getUser());
imageDownloader.getMedia(tweet.mediaEntities);
imageDownloader.getProfilePhoto(userProfile.ProfileImageUrl);
System.out.println(tweet);
System.out.println(userProfile);
}
final long duration = System.nanoTime() - startTime;
if ((5500 - duration / 1000000) > 0) {
logger.info("Sleep for " + (6000 - duration / 1000000) + " miliseconds");
Thread.sleep((5500 - duration / 1000000));
}
} while ((query = result.nextQuery()) != null);