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

OK、私はあなたのためにあなたのコードを書き直すつもりはありません (また、誰かが SO でそれを行うことを期待すべきではありません) が、いくつかの問題を指摘し、いくつかのことを説明しようとします:

  1. まず、Twitter.searchループに入る前に呼び出してから、すぐに再度呼び出して、プロセスの最初の結果のバッチを破棄します。
  2. rate_limit_statusのドキュメントを参照してください。認証されたユーザーを使用していないように見えるため、この呼び出しは単に IP アドレスのレート制限を返しているだけです。これは、次の事実を除いて変更される可能性は低いです...
  3. オフタイムなしで繰り返し検索要求を呼び出しています。おそらく 1 分間に数千回です。この種の API からの即時の結果が実際に必要な場合は、Twitter の Streaming APIを調べてください。sleep(x)それ以外の場合は、呼び出しをループに投げる必要があります。API を悪用すると、IP がブロックされる可能性が高く、失礼な行為でもあります。
  4. 例外の詳細を取得するには、次のようにしてみてください。

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

    そして、あなたがそれに取り組んでいる間に、ruby​​ exceptionsを読んでください。

于 2012-08-16T14:02:33.493 に答える