Skip to content

Instantly share code, notes, and snippets.

@sugamasao
Created May 10, 2010 09:45
Show Gist options
  • Save sugamasao/395874 to your computer and use it in GitHub Desktop.
Save sugamasao/395874 to your computer and use it in GitHub Desktop.
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