1

我想知道是否有人可以帮助我理解下面的 Ruby 代码?我对 Ruby 编程很陌生,并且无法理解每个函数的含义。

当我使用我的 twitter 用户名和密码作为参数运行它时,我会得到一个 twitter 提要样本流。我需要对此代码做什么才能仅显示主题标签?

我试图每 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
4

2 回答 2

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

该行显示用户名,后跟推文的内容。

让我们退后一步。

散列标签出现在推文的内容中——这意味着它们在推文['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

tweet['text'].scan(/#\w+/)是一个字符串数组。你可以用这个数组做任何你想做的事情。假设您是 Ruby 新手,并且想要将哈希标签打印到控制台,这里有一个关于使用 puts 打印数组的简要说明:

puts array      # => "#foo\n#bar"
puts array.to_s # => '["#foo", "#bar"]'
于 2012-05-02T01:44:29.983 回答
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

这是来源正在做什么的评论版本。如果您只想要主题标签,则需要将 handle_tweet 重写为如下内容:

handle_tweet(tweet)
  tweet.scan(/#\w/) do |tag|
    puts tag
  end
end
于 2012-05-02T01:53:05.590 回答