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 に答える