python-twitterでFriendsを全て獲得する

python-twitterにはGetFriends()というメソッドがあり、Friendsを獲得することができます。
しかし、apiの制限上最大100件までしかFriendsを獲得することができません。
そこで、このGetFriendsを変更することで、全てのFriendsを獲得することができるようにしました。

まず、twitterapiの仕様を確認すると、pageというパラメータを投げることで、指定したページ(page=2なら101-200人目)を獲得できると書いてあります。
まずはGetFriendsにpageという引数を追加し、pageを指定できるようにしてみました。
ところが何故かpageを指定しても、最初の100人しか獲得できませんでした。
原因はよく分かりませんが、http://code.google.com/p/python-twitter/issues/detail?id=113&q=GetFriendsによると、pgaeはうまく機能しないようです。

上記のページによるとcursorというパラメータを投げることで対応するのがいいようです。
上記のページの解説では、GetFollowersの返り値から、next_cursorの値を取り出して、これをGetFllowersに引数として与えています。
しかし、現在のpython-twitterの仕様では、GetFriendsやGetFollowersはUserのインスタンスのリストを返してくるので、この方法では実現できません。
仕方ないので、python-twitterを書き換えることになります。

まあ、ここまで分かってしまえば、後は簡単で

    parameters['cursor'] = cursor    
    friends = []
    
    while  parameters['cursor'] != 0:
      json = self._FetchUrl(url, parameters=parameters)
      data = self._ParseAndCheckTwitter(json)
      friends += [User.NewFromJsonDict(x) for x in data['users']]
      parameters['cursor'] = data['next_cursor']
    return friends

とやってしまえば、全部のFriendsが返ってきます。
まず、apiに投げるパラメータのcursorは、この位置から100件返しなさい、ということになっています。-1の場合は先頭になります。ただし、このcursorの値はuse_idらしく、普通には扱いが面倒です。
一方、apiでFriendsを習得すると返されるJSONの中には、next_cursorやprev_cursorという値があります。これは次や前のリストが存在する場合にそのcursorの位置を教えてくれるようです。
そこで、このnext_cursorの値を次のcursorに与えてやれば、今回取得したリストの次のリストを獲得できます。
あとは、毎回獲得したFriendsをリストに突っ込んでおいて、最後にreturnすればOKです。

あんまりしっかりは確認してませんが、GetFollowersも同様の手順でうまくいくはずです。