Created
May 10, 2010 09:45
-
-
Save sugamasao/395874 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'net/http' | |
require 'uri' | |
require 'pp' | |
require 'kconv' | |
require 'rubygems' | |
require 'pit' | |
require 'json' | |
#-------------------------- | |
# 取得した Streamデータを文字列として出力する。 | |
# Parser クラスには parse メソッドが実装されてればおk | |
#-------------------------- | |
class Parser | |
def parse(status) | |
if(status["friends"]) | |
friends status | |
elsif(status["user"]) | |
user status | |
elsif(status["delete"]) | |
delete status | |
elsif(status["event"] == "follow") | |
follow status | |
#elsif(status["target_object"]) | |
elsif(status["event"] == "retweet") | |
retweet status | |
elsif(status["event"] == "favorite") | |
favorite status | |
elsif(status["event"] == "unfavorite") | |
unfavorite status | |
#end | |
else | |
puts "unknown data." | |
pp status | |
end | |
end | |
:private | |
def user(status) | |
output "[Tweet]#{status['user']['screen_name']} : #{status['text']}" | |
end | |
def friends(status) | |
output "[friends] friends(follow count) => #{status['friends'].size}" | |
end | |
def delete(status) | |
output "[delete] userid:#{status['delete']['status']['user_id']} tweet_id:#{status['delete']['status']['id']}" | |
end | |
def follow(status) | |
output "[follow] #{status['source']['screen_name']} => #{status['target']['screen_name']}" | |
end | |
def favorite(status) | |
output "[fav] #{status['source']['screen_name']} => #{status['target']['screen_name']} / #{status['target_object']['user']['screen_name']} : #{status['target_object']['text']}" | |
end | |
def unfavorite(status) | |
output "[unfav] #{status['source']['screen_name']} => #{status['target']['screen_name']} / #{status['target_object']['user']['screen_name']} : #{status['target_object']['text']}" | |
end | |
def retweet(status) | |
output "[RT] #{status['source']['screen_name']} => #{status['target']['screen_name']} / #{status['target_object']['user']['screen_name']} : #{status['target_object']['text']}" | |
end | |
def output(str) | |
puts str.tosjis | |
end | |
end | |
#-------------------------- | |
# TwitterStream 取得クラス | |
#-------------------------- | |
class TwitterStream | |
def initialize(user, pass) | |
@user = user | |
@pass = pass | |
end | |
def parser=(parser) | |
@parser = parser.new | |
end | |
def parse(status) | |
@parser ||= Parser.new | |
@parser.parse(status) | |
end | |
def twitter_stream(uri) | |
Net::HTTP.start(uri.host, uri.port) do |http| | |
request = Net::HTTP::Get.new(uri.path) | |
request.basic_auth(@user, @pass) | |
http.request(request) do |res| | |
data = "" | |
res.read_body do |chunk| | |
begin | |
status = JSON.parse(chunk) | |
rescue | |
data << chunk | |
status = JSON.parse(data) rescue next | |
data = "" | |
end | |
yield status | |
end | |
end | |
end | |
end | |
end | |
#-------------------------------------- | |
# Twitter Strean 取得開始 | |
#-------------------------------------- | |
URL = 'http://chirpstream.twitter.com/2b/user.json' | |
ts = TwitterStream.new(Pit.get("twitter")["username"], Pit.get("twitter")["password"]) | |
# 出力を変更したかったら、以下のようにクラスを直接ぶっこんで。 | |
#ts.parser = Parser | |
ts.twitter_stream(URI.parse(URL)) do |status| | |
ts.parse(status) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment