Skip to content

Instantly share code, notes, and snippets.

@pix0r
Forked from damon/shared_followers.rb
Created February 23, 2010 19:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pix0r/312628 to your computer and use it in GitHub Desktop.
Save pix0r/312628 to your computer and use it in GitHub Desktop.
find shared twitter followers, then print all usernames
#!/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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment