FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

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らしくないコードだったので少し修正。