follower/followingを全件取得する

年末ぐらい?からpage=番号指定では100人以上取得できなくなってて、cursor=-1を指定してnext_cursorを辿っていく仕様になってたので、follower/following取得を修正した。
最後のページにはnext_cursorが無いので無くなるまでループする。



http://bitbucket.org/shokai/bot-ahokai/changeset/0fcc0d7dc269/
Twitterers.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'open-uri'
require 'rexml/document'

class Twitterers

  def initialize(user,pass)
    @user = user
    @pass = pass
  end
  
  def followers
    puts 'getting followers list'
    get_users("http://twitter.com/statuses/followers.xml")
  end
  
  def friends
    puts 'getting friends list'
    get_users("http://twitter.com/statuses/friends.xml")
  end
  
  def get_users(uri)
    results = Array.new
    
    cursor = -1
    while true do
      print "reading cursor:#{cursor}..."
      begin
        page = open("#{uri}?cursor=#{cursor}",
                    :http_basic_authentication => [@user, @pass]).read()
      rescue
        puts "error!"
        break
      end
      break if !(page =~ /<user>/)
      doc = REXML::Document.new(page)
      REXML::XPath.each(doc, '//user/screen_name()'){ |name|
        results << name.text
      }
      puts " #{results.length} users"
      cursor = REXML::XPath.first(doc, '//next_cursor()').text.to_i
      break if !cursor or cursor == 0
      sleep 5
    end
    puts 'finished!'
    return results
  end
  
end

follow返し
refollow.rb

#!/usr/bin/env ruby
require 'rubygems'
require 'yaml'
gem 'twitter'
require 'twitter'
require File.dirname(__FILE__) + '/Twitterers.rb'


config = YAML::load open(File.dirname(__FILE__) + '/config.yaml')

tws = Twitterers.new(config["user"], config["pass"])
followers = tws.followers
friends = tws.friends

twit = Twitter::Base.new(Twitter::HTTPAuth.new(config["user"], config["pass"]))

i = 0
(followers-friends).each{ |u|
  i+=1
  puts "follow #{u} (#{i}/#{(followers-friends).size})"
  begin
    twit.friendship_create(u)
  rescue
    puts '!follow error'
  end
  sleep 5
}