Twitter gemおよびTweetStream gemでストリーミングを受けてみる

単なるメモです。改めて書き起こす予定。

Twitter gem

key/secretなどはニセモノです。

#!/usr/bin/env ruby
# coding: utf-8
require 'twitter'

client = Twitter::Streaming::Client.new(
  consumer_key:         '9Gu1FiE1IfKi32bR8Fw',
  consumer_secret:      'QUnRDVcl5FNCZ9C1j80OAjUJlguMNVyqbdrOrnjtQ',
  access_token:         '2194235326-sm2SUkVRHMJ1CdwYG1f04klQMlxc4i05tkSbnZa',
  access_token_secret:  'oairK8FMvLZ8dqEVrCgh2brhyL0SCd5wpdkIoNxz62Jdi',
)

q = Queue.new

puts "start!"

#userstreamを受信してobjectへ入れる
Thread.start do
  client.user do |object|
    puts "recieve a message / class: #{object.class}"
    case object
    when Twitter::Tweet
      q.push(object.text)
    end
  end
end

# queueで通信できる
while true
  unless q.empty?
    puts q.pop
  end
end

これでTwitter gemでのStreamの受け方がだいたい分かるかと思います。

注意点としては

  • client.userブロックは永久ループなのでThreadに入れないと他の作業が行えない。
  • stream全項目が混ざって流れてくるので、必要な項目だけ(上記スクリプトだとTwitter::Tweetオブジェクト)を指定しておく必要がある

ことでしょうか。特に、userstreamは一番最初にフォローid全てのリストTwitter::Streaming::FriendListが送られてきます。

そのほか、検索の場合はTwitter::Streaming::Client#filterメソッドを使います。idまたはキーワードが使えます。キーワードにUTF-8の文字は使えますが、しかしCJK(中国語・日本語・韓国語)は使えません。

Non-space separated languages, such as CJK are currently unsupported.
https://dev.twitter.com/docs/streaming-apis/parameters#follow

id / キーワード指定の仕方は

を確認してください。

Tweetstream gem

同様に書き出します。
ただし設定の仕方などが異なります。

#!/usr/bin/env ruby
# coding: utf-8
require 'tweetstream'

TweetStream.configure do |config|
  config.consumer_key        = '9Gu1FiE1IfKi32bR8Fw'
  config.consumer_secret     = 'QUnRDVcl5FNCZ9C1j80OAjUJlguMNVyqbdrOrnjtQ'
  config.oauth_token         = '2194235326-sm2SUkVRHMJ1CdwYG1f04klQMlxc4i05tkSbnZa'
  config.oauth_token_secret  = 'oairK8FMvLZ8dqEVrCgh2brhyL0SCd5wpdkIoNxz62Jdi'
  config.auth_method        = :oauth
end

client = TweetStream::Client.new

# 稼働時の処理(ここではサーバ接続したことを表示)
client.on_inited do
  puts 'Connected...'
end

#接続時に送られるフォロワーリストを受けたときの処理
client.on_friends do |friends|
  puts "recieve a friends list"
end

#ツイート削除を含むメッセージを受けたときの処理
client.on_delete do |status_id, user_id|
  puts "recieve a delete message / status_id: #{status_id}, user_id: #{user_id}"
end

#ツイートなどを含むメッセージを受けたときの処理
client.on_timeline_status do |status|
  puts "recieve a TL status"
end

#その他のメッセージを受けたときの処理も同様に
#client.on… do |object|
#  do something
#end

#on設定を終えたあとにclient.userstreamメソッドを稼働させる
client.userstream do |object|
  puts "recieve a tweet / class: #{object.class}"
  puts object.text 
end

TweetStream::Client#userstreamメソッドは(Twitter::Streaming::Client#userメソッドとは対照的に)Twitter::Tweetオブジェクトしか拾い出しません。ツイート以外の(ふぁぼ・ツイート削除・フォロー/リムーブなど)Twitterサーバからのメッセージを受信する場合にはclient.on_…にブロックを与えることで処理を指示します。
また、TweetStream::Client#on_timeline_statusはTwitter::Tweetオブジェクトを受信したときに動くようですので、結局はTweetStream::Client#userstreamと同じになるようです。

なお、TweetStreamは背後でEventMachineベースのem-twitterが動いているので、並行処理を行う際にはEventMachineを使います。例えば

(前略)
EM.run do 
  EM::PeriodicTimer.new(5) do
    puts Time.now
  end

  client.userstream do |object|
    puts "recieve a tweet / class: #{object.class}"
    puts object.text 
  end
end

とすれば5秒おきに時刻を表示しつつTLのツイートを表示してくれます。