マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

フォローしているけど、フォローされてない人を探してみる その2

前回のやつの改良型。フォローの数が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
}