C#でtwitterizerをつかってみた1 TwitterFriendShipクラスの挙動

はじめまして、メルサイアです。

これから、ちょっとずつはてなダイアリーをつけていこうかと思ってます。
たぶん内容は、ゲーム開発やC#プログラミングの話(主に自分や開発者向けのメモ&ソースコード添付用)になると思います。

=======================

twitterizerという、.NET用のTwitterライブラリを使ってみました。

結構便利なクラスなんですが、フォロワーの取得でいろいろつまずきました。

面倒なので、ここには結論とソースコードだけ書いておきます。

■結論
・TwitterFriendship.Followersは100人ずつしか取れないし、ループを回してもちゃんと取れない。
・TwitterFriendship.FollowersIdsは500人ずつしか取れないが、ループを回せば時間はかかるがちゃんと取れてる

試しに、@h_ototake さんのフォロワー数を取得するテスト
■テスト1回目
299人しか取れなかった。12807ミリ秒かかってる <= TwitterFriendship.Followersのループ
531075取れた。34920ミリ秒かかってる <= TwitterFriendship.FollowersIdsのループ

■テスト2回目
399人しか取れなかった。10115ミリ秒かかってる <= TwitterFriendship.Followersのループ
531078人取れた。33278ミリ秒かかってる <= TwitterFriendship.FollowersIdsのループ

■テスト3回目
399人しか取れなかった。10648ミリ秒かかってる <= TwitterFriendship.Followersのループ
531077人取れた。33269ミリ秒かかってる。 <= TwitterFriendship.FollowersIdsのループ

■テスト後
https://twitter.com/h_ototake
で確認してみたらちゃんと531079人に増えてた。減ったり増えたりをちゃんと取ってる?
やっぱり二つ目のは時間かかってるけどちゃんと取れてるね。


[追記]余談ですが、twitterAPIの仕様制限、1時間に150アクセスなんですね。かなり少ない…。
数十万もフォロワー居るアカウントの、全てのフォロワー取得なんて、あんまり実験するモノじゃないですね。。すみません。

=====================

ソースコード

フォロワーを取得するコードを一部載せておきます。

(わかりやすく変数・メソッド名の後にに日本語を付けています。読みにくかったらごめんなさい)

(2102年12月17日19:00現在最新版)

        public static int getFollowerID・フォロワーのIDを取得(int _twitterID, int _folowerNo・何番目のフォロワーか)
        {
            int _followerID = 0;
            return _followerID;
        }
        /// <summary>
        ///  フォロワー(フォローされている人)のtwitterID(@ではじまるやつ)リストを取得します。
        ///  
        /// ※現時点では、不安定です。
        /// </summary>
        /// <param name="_twitterID_アットマークで始まる英数字や記号のやつ_TwitterUser_Name"></param>
        /// <returns></returns>
        public static List<Decimal> getFollowerTwitterUserIDs・フォロワーの識別数値IDを全て取得_高速版(string _twitterID_アットマークで始まる英数字や記号のやつ_TwitterUser_Name)
        {
            string _twitterId = _twitterID_アットマークで始まる英数字や記号のやつ_TwitterUser_Name;
            List<Decimal> _followers_TwitterUserIDs = new List<Decimal>();

            // この処理だと、一回に5000フォロワーしか呼びだせない
            //TwitterResponse<UserIdCollection> _userResponce = TwitterFriendship.FollowersIds(p_token);
            //UserIdCollection _users = _userResponce.ResponseObject;

            // 参考: http://ameblo.jp/funlife-v-v/entry-11388989280.html
            //TwitterFriendship.FollowersIdsは一度に5000件しか取得できません。
            //5000件以上フォロワーがいる場合は困ってしまいます。
            // 
            //そこでUserIdsOptionsを利用してやります。
            // 
            //UserIdsOptions.Cursorに、UserIdCollection.NextCursorを指定して
            //再度TwitterFriendship.FollowersIdsを実行します。
            // 
            //こんな感じです。	
            Decimal _userId = getUserID_ByTwitterID_UserName・twitterIDからユーザIDを取得(_twitterId);
            UsersIdsOptions _options = new UsersIdsOptions()
            {
                UserId = _userId
            };
            // 取れなくなるまで調べる
            while (true)
            {
                // とりあず5000個まで呼びだす
                TwitterResponse<UserIdCollection> _res = TwitterFriendship.FollowersIds(p_token, _options);
                // リストに追加
                if (_res.Result == RequestResult.Success)
                {
                    int _idsCount = _res.ResponseObject.Count;
                    for (int i = 0; i < _idsCount; i++)
                    {
                        _followers_TwitterUserIDs.Add(_res.ResponseObject[i]);
                    }
                    // まだあるか調べる
                    UserIdCollection obj = _res.ResponseObject;
                    // 先頭に戻るとCursorが0となる
                    if ((_options.Cursor = obj.NextCursor) == 0)
                    {
                        // おわった〜
                        break;
                    }
                    // まだあるから、もっかい実行
                }
                else
                {
                    // もうないか、失敗したかやから、おわり
                    break;
                }
            }


            return _followers_TwitterUserIDs;

        }
        /// <summary>
        ///  フォロワー(フォローされている人)のtwitterID(@ではじまるやつ)リストを取得します。
        ///  
        /// </summary>
        /// <returns></returns>
        public static List<string> getFollowerID・フォロワーのIDを全て取得(string _twitterID_アットマークで始まる英数字や記号のやつ)
        {
            string _twitterId = _twitterID_アットマークで始まる英数字や記号のやつ;
            List<string> _followerTwitterIDs = new List<string>();

            // 現状では、数値IDをリストで取得した後、一個一個を数値ID→文字列twitterIDに変換してる
            List<Decimal> _userIds = getFollowerTwitterUserIDs・フォロワーの識別数値IDを全て取得_高速版(_twitterId);
            foreach (Decimal _id in _userIds)
            {
                _twitterId = getTwitterID_ByUserID・ユーザIDからTwitterIDを取得(_id);
                _followerTwitterIDs.Add(_twitterId);
            }

            return _followerTwitterIDs;
        }

他の開発者の方の少しでも参考になれば幸いです。

パブリックドメイン著作権放棄します。ご自由にコピー・改変してお使いください。

■MyTwitterTools.cs
なお、現在、ヘボヘボですが、Twitterizerを日本語風にわかりやすくラッピング(?)した、

「MyTwitterTools.cs」というTwitter関連機能寄せ集めクラスっぽいものを作ってます。

ソース全文をダウンロードしたい方は以下からお気軽にどうぞ。

(※VisualStudio2010用なので、文字コードUTF-8です)。
dropbox.com/home/Public/minRPG_みんつくプロジェクト 
https://www.dropbox.com/home/Public/minRPG_%E3%81%BF%E3%82%93%E3%81%A4%E3%81%8F%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88
(※VisualStudio2010用なので、文字コードUTF-8です)。
上記URL → ソースコード → 最新日付 → 「***.zip」をダウンロード&解凍
→ その中の「minRPG/_NET4_0Program_Twitterアプリ/NET4_0_Toolsプログラミングツール系」
   というフォルダの中に、「MyTwitterTools.cs」が入っています。(.NET Framework4.0が必要)
   なお、動かしたい場合は「MyTools.cs」というファイルも必要です。(このファイルのメソッドを使っているため)


その他、転載するなとか連絡してよとかとか固いことは何にも言いませんので、じゃんじゃんお使いください。


twitterAPIを使って、これからちょっとずつ面白いものを作っていこうと思ってます。


参考記事: 

http://mimumimu.net/blog/2011/11/23/twitterizer-%E3%81%A7-userstream-%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%82/

http://www.satsukifactory.net/twitter/twitter-client/twitterizer-asyncmemo/ 

http://cannotdebug.blog.fc2.com/

など他多数。感謝。


PS:ソースコードの貼りつけ。「>|cs|〜<||」だけでいいだなんて。

http://hatenadiary.g.hatena.ne.jp/keyword/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%89%B2%E4%BB%98%E3%81%91%E3%81%97%E3%81%A6%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B%EF%BC%88%E3%82%B7%E3%83%B3%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88%EF%BC%89

昔はインデントとかも大変だったのに…いい時代になりましたね。