FLYING

/* TODO: 気の利いた説明を書く */

Ruby Twitter Gemでfriendsやfollowersを全件取得

http://twitter.rubyforge.org/を利用すると,RubyからHTTPリクエストやJSON/XMLのパースを意識することなくTwitter APIにアクセスすることができる。日本語でのドキュメントはRoute 477が詳しい。

現在のTwitter APIでは自身のfriends(followingのこと)やfollowersを取得する際に"friends"や"followers"というそのまんまのAPIにアクセスする必要があるが,これらのAPIはデフォルトだとfriend/followerを直近の100件しか返してくれない。以前はこれらのAPIに"page"というパラメータがあり,これを必要な分だけインクリメントしてAPIにアクセスすることにより簡単に全件のデータを取得することができたが,現在ではパラメータ"page"は廃止され,代わりに"cursor"というパラメータを利用する方式に切り替わっている。

細かいことはおいておくと,とりあえず以下のような関数fetchを定義することにより,比較的簡単にRuby Twitter Gemを用いてfriends/followingを全件取得することができるようになる。

def fetch(instance, method, name, query)
	next_cursor = -1
	while true
		query['cursor'] = next_cursor
		instance.__send__(method, query).each{|key, value|
			if key == name
				value.each{|v| yield(v) }
			elsif key == "next_cursor"
				next_cursor = value.to_i
			end
		}
		break if next_cursor <= 0
	end
end

関数fetchは,初回のAPI呼び出しのみcursorパラメータに-1を指定してアクセスし,それ以外のAPI呼び出しでは前回のAPI呼び出しで返ってきたnext_cursorパラメータをcursorパラメータに指定してアクセスする。APIから返ってきたnext_cursorパラメータが0であれば,それ以上アクセスする必要はないのでループから脱出している。

使い方

username="your twitter username"
password="your twitter password"
httpauth = Twitter::HTTPAuth.new(username, password)
twit = Twitter::Base.new(httpauth)

# 自身のfriendsを全件取得して表示
puts "my friends"
fetch(twit, :friends, "users", {}) {|v|
	puts "id: #{v.id}, screen_name: #{v.screen_name}"
}
# 自身のfollowersを全件取得して表示
puts "my followers"
fetch(twit, :followers, "users", {}) {|v|
	puts "id: #{v.id}, screen_name: #{v.screen_name}"
}
# 任意アカウントのfriends_idを全件取得して表示
puts "specified user's friends' ids"
fetch(twit, :friend_ids, "ids", {'id' => "username"}) {|v|
	puts "id: #{v}"
}
# 任意アカウントのfollower_idを全件取得して表示
puts "specified user's followers' ids"
fetch(twit, :follower_ids, "ids", {'id' => "username"}) {|v|
	puts "id: #{v}"
}

取得したユーザーデータもしくはIDに対して行いたい処理を関数fetchにブロックで渡して処理を行う。

実行例

my friends
id: 10557722, screen_name: asshuku
id: 99110288, screen_name: hatsune_bot
my followers
id: 11425382, screen_name: tondol
specified user's friends' ids
id: 10557722
id: 99110288
specified user's followers' ids
id: 11425382

こんな感じで,friend/follower関係にあるユーザーのデータを簡単に取得できる。サンプルの実行例ではfriend/followerが共に少ないユーザーを対象に実行したため普通にRuby Twitter Gemを利用した場合と変わらない結果になっているが,friend/followerが100を超えるユーザーについても同様に全件のデータを取得できるはずである。

Twitter APIの使いすぎはあなたのTwitterライフを損なう可能性があります。ご利用は計画的に。

追記20100915

Basic認証の有効期限が切れたのでここのコードは動かなくなりました。

追記20130619

Rubyらしくないコードだったので少し修正。