2012-05-02 166 views
1

我在想如果有人能幫我理解下面的Ruby代碼嗎?我對Ruby編程很陌生,無法理解每個函數的含義。瞭解Ruby代碼?

當我用我的twitter用戶名和密碼作爲參數運行這個時,我得到一個twitter feed樣本流。我需要用這段代碼才能顯示標籤?

我試圖每隔30秒收集一次哈希標籤,然後從最少出現到最常出現的哈希標籤進行排序。

不尋找解決方案,但想法。謝謝!

require 'eventmachine' 
require 'em-http' 
require 'json' 

usage = "#{$0} <user> <password>" 
abort usage unless user = ARGV.shift 
abort usage unless password = ARGV.shift 

url = 'https://stream.twitter.com/1/statuses/sample.json' 

def handle_tweet(tweet) 
    return unless tweet['text'] 
    puts "#{tweet['user']['screen_name']}: #{tweet['text']}" 
end 

EventMachine.run do 
    http = EventMachine::HttpRequest.new(url).get :head => { 'Authorization' => [ user, password ] } 

    buffer = "" 

    http.stream do |chunk| 
    buffer += chunk 
    while line = buffer.slice!(/.+\r?\n/) 
     handle_tweet JSON.parse(line) 
    end 
    end 
end 
+2

這是關於Ruby的問題,還是關於Twitter的API?你沒有得到如何從API獲取哈希標籤,或者你不明白調用API的Ruby代碼? – jefflunt

+0

它是兩個。我需要了解Ruby代碼是如何工作的,以便弄清楚如何修改代碼來獲取井號標籤。 – fokusfocus

回答

1
puts "#{tweet['user']['screen_name']}: #{tweet['text']}" 

那行顯示了一個用戶名,然後鳴叫的內容。

讓我們退後一秒。

哈希標籤出現在推文的內容 - 這意味着他們在推文['文本']。散列標籤總是採用#後跟一堆非空格字符的形式。使用正則表達式很容易。 Ruby的核心API通過String#scan來實現。例如:

"twitter is short #foo yawn #bar".scan(/\#\w+/) # => ["#foo", "#bar"] 

你需要的是這樣的:。

def handle_tweet(tweet) 
    return unless tweet['text'] 
    # puts "#{tweet['user']['screen_name']}: #{tweet['text']}" # OLD 
    puts tweet['text'].scan(/\#\w+/).to_s 
end 

鳴叫[ '文本']掃描(/#\ w + /)是一個字符串數組。你可以做任何你想要的陣列。假如你是新來的Ruby和要打印的哈希標籤到控制檯,這裏是關於印刷陣列,放一個簡短的說明:

puts array  # => "#foo\n#bar" 
puts array.to_s # => '["#foo", "#bar"]' 
+0

謝謝!我現在開始明白了......我還有一些問題: 所以tweet是handle_tweet的一個參數。但tweet ['user'] ['screen_name']如何返回用戶名和tweet ['text']返回tweet的內容? 另外,.to_s從哪裏來? – fokusfocus

+0

確定另一個問題......每當我嘗試運行此代碼時,它都會不斷打印twitter流......打破循環並退出命令提示符的好方法是什麼? 我在mac中使用終端 – fokusfocus

+0

右,tweet是handle_tweet的一個參數。 tweet ['user']意味着推文的類型是哈希或集合。你可以在函數中使用「puts tweet.class」來識別推文的類。所以,代碼調用tweet ['user'] ['screen_name'],這意味着tweet ['user']可能也是哈希,並且這兩個嵌套像Matryoshka娃娃。 –

0
#Load Libraries 
require 'eventmachine' 
require 'em-http' 
require 'json' 


# Looks like this section assumes you're calling this from commandline. 
usage = "#{$0} <user> <password>" # $0 returns the name of the program 
abort usage unless user = ARGV.shift # Return first argument passed when program called 
abort usage unless password = ARGV.shift 

# The URL 
url = 'https://stream.twitter.com/1/statuses/sample.json' 

# method which, when called later, prints out the tweets 
def handle_tweet(tweet) 
    return unless tweet['text'] # Ensures tweet object has 'text' property 
    puts "#{tweet['user']['screen_name']}: #{tweet['text']}" # write the result 
end 

# Create an HTTP request obj to URL above with user authorization 
EventMachine.run do 
    http = EventMachine::HttpRequest.new(url).get :head => { 'Authorization' => [ user, password ] } 

    # Initiate an empty string for the buffer 
    buffer = "" 

    # Read the stream by line 
    http.stream do |chunk| 
    buffer += chunk 
    while line = buffer.slice!(/.+\r?\n/) # cut each line at newline 
     handle_tweet JSON.parse(line) # send each tweet object to handle_tweet method 
    end 
    end 
end 

這裏的來源是什麼在做一個註釋版本。如果你只是想要hashtag,你會想要重寫handle_tweet到這樣的事情:

handle_tweet(tweet) 
    tweet.scan(/#\w/) do |tag| 
    puts tag 
    end 
end 
+0

謝謝! 我還是不明白這個代碼雖然 #按行讀取流 http.stream do | chunk | 緩衝液+ =塊 而線= buffer.slice!(/.+ \ r嗎?\ n /)#切斷每條線在換行 handle_tweet JSON.parse(線)#發送每個鳴叫目的是handle_tweet方法 端 JSON.parse(線)是什麼意思? – fokusfocus

+0

頂部的URL是一個RESTful Web服務。當您使用EventMachine發送HTTP請求時,Web服務以JSON(JavaScript對象表示法)形式的文本進行響應。 'JSON.parse'採用JSON格式的文本並將其轉換爲ruby對象,這就是爲什麼您可以擁有帶'text'和'user'屬性的'tweet'對象。從本質上講,它只是將JS對象轉換爲Ruby對象,因此您可以使用它們而不必自己分析文本。 – andrewheins