前回のやつの改良型。フォローの数が100を越えても大丈夫になった。取得したユーザー数が100未満でループ脱出だと、ブロックしてるユーザーがいる場合(それも消えてない場合)にループを抜けてしまうっぽいので、取得したユーザー数が0になったときにループを抜けるようにした。ログインはメールアドレスではなくユーザー名でないと、このプログラムはうまく動作しない。それはfollowersとfriendsでスクリーン名を指定しているためである。
require 'net/http' require 'rexml/document' username = 'hoge' password = "hogehoge" class User attr_reader :id attr_reader :name attr_reader :screen_name attr_reader :description attr_reader :url attr_reader :followers_count attr_reader :friends_count attr_reader :statuses_count attr_reader :location attr_reader :profile_image_url def initialize(element) @id = element.elements['id'].text() @name = element.elements['name'].text() @screen_name = element.elements['screen_name'].text() @description = element.elements['description'].text() @url = element.elements['url'].text() @followes_count = element.elements['followers_count'].text() @friends_count = element.elements['friends_count'].text() @statuses_count = element.elements['statuses_count'].text() @location = element.elements['location'].text() @profile_image_url = element.elements['profile_image_url'].text() end end class Twitter TwitterServer = 'twitter.com' def initialize(username, password) @username = username @password = password end def friends(screen_name = @username, page = 1) request = Net::HTTP::Get.new("http://twitter.com/statuses/friends.xml?screen_name=#{screen_name}&page=#{page}") request.basic_auth(@username, @password) http = Net::HTTP.start(TwitterServer) response = http.request(request) return get_users(response.body) end def all_friends(screen_name = @username) n = 1 all = Array.new() while(true) users = friends(screen_name, n) if(users.size() == 0) break end all += users n += 1 end return all end def followers(screen_name = @username, page = 1) request = Net::HTTP::Get.new("http://twitter.com/statuses/followers.xml?screen_name=#{screen_name}&page=#{page}") request.basic_auth(@username, @password) http = Net::HTTP.start(TwitterServer) response = http.request(request) return get_users(response.body) end def all_followers(screen_name = @username) n = 1 all = Array.new() while(true) users = followers(screen_name, n) if(users.size() == 0) break end all += users n += 1 end return all end def get_users(body) users = Array.new() doc = REXML::Document.new(body) doc.get_elements('/users/user').each{|element| users << User.new(element) } return users end end twitter = Twitter.new(username, password) friends = Hash.new() twitter.all_followers().each{|user| friends[user.name] = user.name } twitter.all_friends().each{|user| if !friends.key?(user.name) puts user.name end }