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を超えるユーザーについても同様に全件のデータを取得できるはずである。
追記20100915
Basic認証の有効期限が切れたのでここのコードは動かなくなりました。
追記20130619
Rubyらしくないコードだったので少し修正。