|
#!/usr/bin/env ruby |
|
|
|
# Author: Damon Clinkscales |
|
# Modified 2010-02-23 by Mike Matz |
|
# Loop through all shared follower IDs to expose usernames. |
|
# Not recommended for people with a lot of followers! |
|
|
|
require 'rubygems' |
|
require 'hpricot' |
|
require 'net/http' |
|
require 'yaml' |
|
|
|
def get_followers(user) |
|
xml,url = "","" |
|
result = [] |
|
|
|
http = Net::HTTP.new('twitter.com', 80) |
|
|
|
http.start do |http| |
|
url = "/followers/ids/#{user}.xml" |
|
req = Net::HTTP::Get.new(url) |
|
req.basic_auth(CONFIG["USERNAME"], CONFIG["PASSWORD"]) |
|
response = http.request(req) |
|
xml = response.body |
|
doc = Hpricot(xml) |
|
followers = doc.search("//id") |
|
followers.each do |id| |
|
result << id.inner_text |
|
end |
|
end |
|
result.uniq |
|
end |
|
|
|
def get_username(user_id) |
|
http = Net::HTTP.new('api.twitter.com', 80) |
|
result = "" |
|
|
|
http.start do |http| |
|
url = "/1/users/show.xml?user_id=#{user_id}" |
|
req = Net::HTTP::Get.new(url) |
|
# Skip basic auth |
|
response = http.request(req) |
|
xml = response.body |
|
doc = Hpricot(xml) |
|
screen_name = doc.search("//screen_name") |
|
screen_name.each do |sn| |
|
result = sn.inner_text |
|
end |
|
end |
|
|
|
result |
|
end |
|
|
|
def shared_followers(user1,user2) |
|
puts "Computing shared follower % between #{user1} and #{user2}...\n" |
|
|
|
user1_followers = get_followers(user1) |
|
user2_followers = get_followers(user2) |
|
|
|
|
|
puts "#{user1} has #{user1_followers.size} followers." |
|
puts "#{user2} has #{user2_followers.size} followers." |
|
shared_followers = (user1_followers & user2_followers) |
|
|
|
puts "They share #{shared_followers.size} followers." |
|
puts "#{sprintf("%.2f", (shared_followers.size / user1_followers.size.to_f*100).to_s)}% of #{user1}" |
|
puts "#{sprintf("%.2f", (shared_followers.size / user2_followers.size.to_f*100).to_s)}% of #{user2}" |
|
|
|
shared_followers.each do |id| |
|
puts get_username(id) |
|
end |
|
end |
|
|
|
#################################################################### |
|
## shared_followers test ## |
|
#################################################################### |
|
CONFIG = YAML::load(IO.read(File.dirname(__FILE__) + '/config.yml')) |
|
|
|
if (ARGV[0] && ARGV[1]) |
|
user1 = ARGV[0] |
|
user2 = ARGV[1] |
|
else |
|
user1 = "jasonfried" |
|
user2 = "37signals" |
|
end |
|
|
|
shared_followers(user1,user2) |
|
|
|
#################################################################### |
|
## example run ## |
|
#################################################################### |
|
# $ shared_followers.rb |
|
# Computing shared follower % between jasonfried and 37signals... |
|
# jasonfried has 6104 followers. |
|
# 37signals has 10308 followers. |
|
# They share 2804 followers. |
|
# 45.94% of jasonfried |
|
# 27.20% of 37signals |