0

我写了一些 ruby​​ 代码来存档推文,但我有几个问题。

1.我的代码看起来效率低下,你能帮我重构一下吗?
2. 我不太明白如何处理 twitter 错误。我想打印出它抛出的具体错误,而不仅仅是我的标准文本。
3. 不明白限速状态码怎么用。我的代码总是吐出完全相同的东西:“在接下来的 59 分 59 秒内剩余 150 个 Twitter API 请求”

谢谢!

require 'twitter'

count = 1
query = "hello"
res = Twitter.search(query, :rpp => 1, :result_type => "recent", :page => 1).results
search_id = res.first.id

loop do
  begin
    res = Twitter.search(query, :rpp => 100, :result_type => "recent", :page => 1, :max_id => search_id).results
    res.each do |status|
      puts "#{status.id}, #{status.created_at}, #{status.from_user}, #{status.text}"

      puts count.to_s
      count = count+1
    end
    search_id = res.last.id-1

  rescue Twitter::Error => e
    rate_limit_status = Twitter.rate_limit_status
    puts "#{rate_limit_status.remaining_hits} Twitter API request(s) remaining for the next #{((rate_limit_status.reset_time - Time.now) / 60).floor} minutes and #{((rate_limit_status.reset_time - Time.now) % 60).round} seconds"

    puts "Error: No more tweets to collect."
    puts e.inspect
    puts "Last tweet collected at #{res.last.created_at}"
    break
  end
end
4

1 回答 1

1

好的,我不会为你重写你的代码(你也不应该期望任何人在 SO 上这样做),但我会指出一些问题并尝试解释一些事情:

  1. 首先,您Twitter.search在进入循环之前调用,然后立即再次调用它,丢弃该过程中的第一批结果。
  2. 您应该查看rate_limit_status的文档。由于您似乎没有使用经过身份验证的用户,因此此调用只是返回您的 IP 地址的速率限制,除了...
  3. 您正在重复调用搜索请求,没有任何停机时间,可能每分钟数千次。如果您确实需要 API 的这种即时结果,您应该查看Twitter 的 Streaming APIsleep(x)否则,您应该在循环中调用 to 。滥用 API 可能会导致您的 IP 被阻止,而且这也是不礼貌的。
  4. 要获取异常的详细信息,请尝试以下操作:

    rescue Twitter::Error => e
      puts "Oops I messed up"
      puts e.inspect
    end
    

    当您使用它时,请阅读ruby​​ exceptions

于 2012-08-16T14:02:33.493 回答