単なるメモです。改めて書き起こす予定。
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 / キーワード指定の仕方は
- https://dev.twitter.com/docs/streaming-apis/parameters#follow
- http://rubydoc.info/gems/twitter/Twitter/Streaming/Client:filter
を確認してください。
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のツイートを表示してくれます。