Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
This paste will be private.
# List the twitter friends that are not friendfeed friends # usage: ruby script_name.rb <twitter/friendfeed username> <twitter password> # 2008-July-6 Don Park 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 # puts "friendfeed user '#{username}': #{ff_friends.size} loaded" missing_tw_friends = tw_friends - ff_friends puts " #{missing_tw_friends.size} friends on twitter that are not on friendfeed: #{missing_tw_friends.join(',')}" # missing_ff_friends = ff_friends - tw_friends # puts " #{missing_ff_friends.size} friends on friendfeed that are not on twitter: #{missing_ff_friends.join(',')}" rescue SocketError raise "Host " + host + " connection error" rescue REXML::ParseException => e print "error parsing XML " + e.to_s end
From the Design Piracy series on my blog: