2012-08-16 80 views
0

我寫了一些紅寶石代碼存檔推文,但我有幾個問題。

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 
+0

有一件事'while(true)'to'loop'因爲它看起來更好 – AJcodez 2012-08-16 08:02:04

回答

1

OK,我不打算重寫代碼爲你(也不應該你指望任何人這樣做對SO),但我會指出一些問題,並試着解釋幾件事情:

  1. 首先,您在進入循環之前調用Twitter.search,然後立即再次調用它,放棄該過程中的第一批結果。
  2. 您應該查看rate_limit_status的文檔。由於您似乎沒有使用經過身份驗證的用戶,因此此調用只是返回您的IP地址的速率限制,除了事實上不可能發生變化...
  3. 您正在重複呼叫搜索請求任何停工時間,可能每分鐘數千次。如果你真的需要API的這種直接結果,你應該看看Twitter's Streaming API。否則,您應該將撥打sleep(x)的電話投入您的循環。濫用API可能會阻止你的知識產權,這也是不禮貌的。
  4. 爲了得到異常的詳細信息,嘗試這樣的事情:

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

    ,雖然你在它上ruby exceptions閱讀起來。

+0

嘿,非常感謝。我知道。我需要爲第一個搜索設置正確的max_id。我只扔掉一條推文,因爲:rpp設置爲1.不認爲這會是一個問題。 2.我注意到,如果我足夠的時間運行我的代碼,它確實會改變。你會推薦我用我的憑證登錄來做這些查詢,即使它沒有必要嗎? 3.大約需要15秒才能打印出100條推文,因此每分鐘只能打幾個電話。這是我知道克服標準搜索的1500條推文限制的唯一途徑。收集最初的推文後,我可以設置流媒體。 – user1071182 2012-08-16 22:38:53

+0

看起來Twitter很快就會在所有情況下都要求授權,所以我會繼續添加它。祝你的代碼好運! – muffinista 2012-08-17 14:58:54