Hatena::Grouptwitterircgateway

syonbori_techの日記

2009-06-25なぜかfriendsが全員取得できない問題

friends取得APIを叩くと次ページがあるのに99人とか98人とかの結果が返ってくる問題パッチ

14:54

以前から(恐らく自分だけ?)発症していた、follow中のfriendsを全員取得できないという問題。

調べてみると、「フォローしている:164人」なのに、APIhttp://twitter.com/friendsで数えてみると、162人しかいないということが発覚。

friendsのページでも、1ページ20人のはずが、たまに19人のページがある。恐らく、数としてはカウントされているが、friendsとしては認識されない不整合エントリでもいるのでしょうか…?

以前、

if (users.User.Length < 100)

の100を99にしたら動いていたのに、昨日あたりから動かなくなっていたのは、今まで1人ヌケが出ていたのが、2人ヌケになったからのようです。

コレに関して思い当たるのが、フォロー申請したがフォロー許可されていない(申請中)人がいるとこのように扱われるのではないか、という仮説です。

今後同じようなことが起こりそうな気がしたので、自分用パッチを作りました。

コンフィグに、FriendsPerPageThresholdという値を追加しています。

Index: trunk/TwitterIrcGatewayCore/Config.cs
===================================================================
--- trunk/TwitterIrcGatewayCore/Config.cs	(revision 601)
+++ trunk/TwitterIrcGatewayCore/Config.cs	(working copy)
@@ -121,6 +121,11 @@
         /// </summary>
         [Description("タイムラインの一回の取得につき何件取得するかを指定します。")]
         public Int32 FetchCount { get; set; }
+        /// <summary>
+        /// フォローしているユーザ一覧を取得する際、次のページが存在するか判断する閾値を指定します。
+        /// </summary>
+        [Description("フォローしているユーザ一覧を取得する際、次のページが存在するか判断する閾値を指定します。")]
+        public Int32 FriendsPerPageThreshold { get; set; }
 
         /// <summary>
         /// デフォルトの設定
@@ -137,6 +142,7 @@
             EnableOldStyleReply = false;
             FetchCount = 50;
             BufferSize = 250;
+            FriendsPerPageThreshold = 100;
 
             if (Default != null)
             {


Index: trunk/TwitterIrcGatewayCore/Session.cs
===================================================================
--- trunk/TwitterIrcGatewayCore/Session.cs	(revision 601)
+++ trunk/TwitterIrcGatewayCore/Session.cs	(working copy)
@@ -745,6 +745,7 @@
             _twitter.EnableRepliesCheck = _config.EnableRepliesCheck;
             _twitter.POSTFetchMode = _config.POSTFetchMode;
             _twitter.FetchCount = _config.FetchCount;
+            _twitter.FriendsPerPageThreshold = _config.FriendsPerPageThreshold;
             _twitter.RepliesReceived += new EventHandler<StatusesUpdatedEventArgs>(twitter_RepliesReceived);
             _twitter.TimelineStatusesReceived += new EventHandler<StatusesUpdatedEventArgs>(twitter_TimelineStatusesReceived);
             _twitter.CheckError += new EventHandler<ErrorEventArgs>(twitter_CheckError);


Index: trunk/TwitterIrcGatewayCore/TwitterService.cs
===================================================================
--- trunk/TwitterIrcGatewayCore/TwitterService.cs	(revision 601)
+++ trunk/TwitterIrcGatewayCore/TwitterService.cs	(working copy)
@@ -206,6 +206,14 @@
         }
 
         /// <summary>
+        /// フォローしているユーザ一覧を取得する際、次のページが存在するか判断する閾値を指定します。
+        /// </summary>
+        public Int32 FriendsPerPageThreshold {
+            get;
+            set;
+        }
+
+        /// <summary>
         /// 認証情報を問い合わせます。
         /// </summary>
         /// <return cref="User">ユーザー情報</returns>
@@ -312,7 +320,7 @@
                         else
                         {
                             usersList.AddRange(users.User);
-                            if (users.User.Length < 100)
+                            if (users.User.Length < FriendsPerPageThreshold)
                                 break;
                         }
                     }

swirhenswirhen2009/06/25 19:38TIGのヘビーユーザー集団ってfollowing1000越えとかザラにいて、Userlistの取得とかに余り重きを置いてる人がいないんでこういう問題は見過ごされがちですね。なんかまゆきち先生が別のやり方を考えてるようなので場当たり対処でお待ち下さい。