(Ruby)(Twitter)(フォロワー一覧を取得する)(100人オーバー対応版)(ただしBasic認証版)

 以前 書いた RubyGemsの「Twitter」を利用して フォロワー一覧を取得するサンプルは
実は100人以内でないときちんと取得してくれないことが判明 笑)

 ということで今回は 「Gemsを使わずに 自力で取得するならば」というのを目標に書いてみました
ただ OAuth認証版で書いてみたかったんですが まだまだ 勉強不足なので
Basic認証版と言う事になります、 いっ いずれは OAuth版をば・・・・
#!ruby -Ku
# このファイルの文字コードUTF-8 で作成してます
#
# WindowsXP Pro 32bit
# ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mswin32]
# の環境で作成しました

require 'open-uri'
require 'rexml/document'

# ログイン ID と パスワードを設定します
ID_PASS = ['TwitterID', 'TwitterPass']

# 予想外のエラーで無限ループに陥らないようにするため ループ回数制限をしてます
# 一度のリクエストで取得できるメンバは100人までで
# 100人を超える場合は何度かに分けて取得する必要があります
# よって 「指定した回数×100」 が 取得できる最大人数になります
# 現在のフォロワーの人数に応じて適切な値にしてください
MaxLoop = 2

# フォロワーの情報を一時保存するバッファです
buf = ''

# cursorの値を元に フォロワー一覧のページを辿っていきます
# 最初は -1 を渡すと 次のページのcursorの値が XMLに含まれて返ってきます
# XML内の next_cursor が その値になります
# 次のページが無い場合は 0 が返ってきます
c = '-1'

# Twiterへアクセスし フォロワー一覧を取得します
MaxLoop.times{
	begin

		# フォロワー一覧を取得し RubyXMLのデータとして扱えるようにします
		xml = REXML::Document.new(
			open(
				'[]http://twitter.com/statuses/followers.xml?cursor=[]' << c,
				{ :http_basic_authentication => ID_PASS }
			).read()
		)

		# 次のページの cursor を取得します
		c = xml.elements['users_list/next_cursor'].text

		# id と screen_name と name を 取得します
		# TSV(TabSeparateValue)で保存されます
		xml.elements.each('users_list/users/user'){|usr|
			buf <<
			usr.elements['id'].text << "\t" <<
			usr.elements['screen_name'].text << "\t" <<
			usr.elements['name'].text << "\n"
		}
	rescue
		# Twitterへのアクセス中 や xmlの処理中にエラーが発生した場合
		# 完全なデータは得られないと考えられますので
		# buf に 「Error」、c に 「0」 を セットして
		# ループから抜けるようにします
		buf = 'Error'
		c = '0'
	end

	# cursor が 0 になったらループから抜けます
	if c == '0'
		break
	end

	# 連続アクセスするのでウエイトを入れます
	sleep(3)
}

# リストを標準出力します、 リダイレクトすればファイルに保存できます
# または 必要に応じて ファイルへ書き出したりなどの処理を書き足してください
puts(buf)
OAuth認証版は → http://d.hatena.ne.jp/morakana/20100802/1280691220