require 'net/https'
require "rexml/document"
require 'rubygems'
begin
gem 'json'
require 'json'
rescue Gem::LoadError
puts "the 'json' gem is missing. please run \"gem install json\""
exit
end
class Twitter
def initialize(username, password)
@username = username
@password = password
@http = Net::HTTP.new("twitter.com")
end
def get(url)
@http.start do |http|
req = Net::HTTP::Get.new(url, {"User-Agent" =>
"ruby net::http"})
req.basic_auth(@username, @password)
response = http.request(req)
resp = response.body
raise resp if response.is_a?(Net::HTTPNotFound)
raise resp if response.is_a?(Net::HTTPUnauthorized)
doc = REXML::Document.new(resp)
err = doc.elements["hash/error"]
raise err.text if err
doc
end
end
def friends_count
doc = get("/users/show/#{@username}.xml")
doc.elements["user/friends_count"].text.to_i
end
def followers_count
doc = get("/users/show/#{@username}.xml")
doc.elements["user/followers_count"].text.to_i
end
def friends
pages = (1..(friends_count / 100) + 1)
friends = []
pages.each do |page_number|
doc = get("/statuses/friends.xml?page=#{page_number}")
friends << doc.elements.to_a("//user/screen_name").map{|s|s.text}
end
friends.flatten
end
end
class FriendFeed
def initialize(username, password=nil)
@username = username
@password = password
@http = Net::HTTP.new("friendfeed.com")
end
def get(url)
@http.start do |http|
req = Net::HTTP::Get.new(url, {"User-Agent" =>
"ruby net::http"})
req.basic_auth(@username, @password)
response = http.request(req)
resp = response.body
raise resp if response.is_a?(Net::HTTPNotFound)
raise resp if response.is_a?(Net::HTTPUnauthorized)
JSON::parse(resp)
end
end
def friends
doc = get("/api/user/#{@username}/profile")
doc["subscriptions"].map {|s| s["nickname"]}
end
end
if ARGV.size != 2
puts "twitter/friendfeed sync."
puts "usage: #{$0} <twitter/friendfeed username> <twitter password>"
end
begin
username = ARGV[0]
twitter = Twitter.new(username, ARGV[1])
tw_friends = twitter.friends
puts "twitter user '#{username}: #{tw_friends.size} loaded"
ff = FriendFeed.new(ARGV[0])
ff_friends = ff.friends
missing_tw_friends = tw_friends - ff_friends
puts " #{missing_tw_friends.size} friends on twitter that are not on friendfeed: #{missing_tw_friends.join(',')}"
rescue SocketError
raise "Host " + host + " connection error"
rescue REXML::ParseException => e
print "error parsing XML " + e.to_s
end