繁体   English   中英

如何确定我的应用程序在达到Twitter API的速率限制之前可以发出多少个请求?

[英]How to determine how many more requests my app can make before it hits the Twitter API's rate limit?

我的应用程序习惯性地向Twitter API请求用户的时间轴(用户的推文)。

顺便说一句,我正在使用twitter gem并配置了Twitter客户端,以使我的应用能够发出请求:

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = ENV["TWITTER_CONSUMER_KEY"]
  config.consumer_secret     = ENV["TWITTER_CONSUMER_SECRET"]
  config.access_token        = ENV["TWITTER_ACCESS_TOKEN"]
  config.access_token_secret = ENV["TWITTER_ACCESS_TOKEN_SECRET"]
end

端点 -我正在做一个请求https://api.twitter.com/1.1/statuses/user_timeline.json -具有每15分钟900所请求的速率限制。

如果我正确理解它,可以通过两种常用方法确定我的应用是否达到了速率限制-但我都不需要:

第一种方法:

这是我写的一个函数,试图向用户发送tweet请求,如果应用程序具有速率限制,则会引发异常。

def get_tweets_from_TwitterAPI(twitter_handle)
  tweets = []
  begin
    tweets = CLIENT.user_timeline(twitter_handle)
  rescue Twitter::Error::TooManyRequests => error
    raise error
  end
  return tweets
end

这种方法的问题是,我想在我向Twitter API发出请求之前 ,找出我的应用程序可以安全发出的更多请求 我担心这种方法会使我的应用在达到速率限制后很长一段时间就对Twitter API进行ping操作,这会使我的应用受到Twitter惩罚性行为的影响(例如,我的应用被列入黑名单)。

第二种方法第二种方法是向该Twitter端点发出请求-https : https://api.twitter.com/1.1/application/rate_limit_status.json该请求将有关给定速率限制的应用程序状态的数据发送回去。

但是同样,此端点也有自己的速率限制(每15分钟有180个请求)-并不是很高。 我的应用程序将超过该限制。 在理想的情况下,我想确定我的应用程序当前的限速状态,然后再向API提出请求。 所以:

def start_tweets_fetch
  number_of_requests_in_last_15 minutes = WHERE DO I GET THIS NUMBER FROM??
  if number_of_requests_in_last_15 minutes <= 900
    get_tweets_from_TwitterAPI(twitter_handle)
  end
end

我在想我必须增加一些我坚持到数据库中的数字,以跟踪对API的请求。 还是有更简单的方法?

编辑

这是对安迪·派珀(Andy Piper)的回答的回应 ,我认为这是跟踪其余电话的最简单方法。

假设您正在使用此Twitter gem ,则好像来自该gem的每个响应都将使用Andy建议的速率限制标头中的信息填充Twitter::RateLimit对象

您应该能够像这样访问该信息:

tweets = CLIENT.user_timeline(twitter_handle)

remaining_calls = tweets.rate_limit.remaining

您可以从那里保存该值,以在下次要发出请求时进行检查。 如何保存和检查取决于您自己,但是我的其余回答可能仍然有用。


注意:我以前没有尝试过这种方法,但是如果我不永久存储请求日志,这是在您遇到的情况下要尝试的第一件事。

一种方法可能是使用Rails内置的Cache API 这将允许您将所需的任何值存储在高速缓存存储中,该值应该比数据库更快更轻。

number_of_requests_in_last_15 = Rails.cache.fetch("twitter_requests", expires_in: 15.minutes) { 0 }
if number_of_requests_in_last_15 minutes <= 900
  get_tweets_from_TwitterAPI(twitter_handle)
  Rails.cache.increment("twitter_requests")
end

让我们分解一下

Rails.cache.fetch("twitter_requests", expires_in: 15.minutes) { 0 }

  • Rails.cache上的fetch方法将尝试提取键twitter_requests的值。
  • 如果键不存在,它将评估该块并将返回值设置为键的新值,然后将其返回。 在这种情况下,如果键twitter_requests不存在,则新键值将为0
  • 传递给fetch方法的expires_in: 15.minutes选项表示每15分钟自动清除一次此键( twitter_requests )。

Rails.cache.increment("twitter_requests")

  • twitter_requests键中的值增加1。

笔记

  • 默认情况下,Rails将使用内存数据存储。 这应该可以正常工作,但是每次重新启动Rails服务器时,存储在缓存中的所有值都会被重置。
  • 缓存的后端是可配置的,可以更改为其他流行的系统(例如,memcache,redis),但这些也需要运行并可由Rails访问。
  • 您可能需要在调用API之前增加缓存,以减少在检查缓存和递增缓存之间缓存过期的机会。 增加不存在的键将返回nil

我不能说您正在使用的gem,但是无需额外调用rate_limit_status端点即可跟踪请求限制的一种方法是检查每个API调用X-Rate-Limit-Remaining标头 不过,我不知道该数据是否在您使用的Ruby gem上可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM