如何处理LinqtoTwitter Rate(v2.1)限制超出错误

时间:2014-04-09 10:36:24

标签: c#-4.0 twitter linq-to-twitter

1.Hi SO,我创建了一个类,用于在屏幕名称的帮助下从twitter获取用户的推文。我的问题是我很快就超出了限速率。

2.我已经为屏幕名称创建了表格,我将保存所有屏幕名称和

3.我创建了另一个表来存储用户的推文。

以下是我的代码:

 public List<TwitterProfileDetails> GetAllTweets(Func<SingleUserAuthorizer> AuthenticateCredentials,string screenname)
    {
        List<TwitterProfileDetails> lstofTweets = new List<TwitterProfileDetails>();
        TwitterProfileDetails details = new TwitterProfileDetails();
        var twitterCtx = new LinqToTwitter.TwitterContext(AuthenticateCredentials());
        var helpResult =
            (from help in twitterCtx.Help
             where help.Type == HelpType.RateLimits &&
             help.Resources == "search,users,socialgraph"
             select help)
            .SingleOrDefault();

        foreach (var category in helpResult.RateLimits)
        {
            Console.WriteLine("\nCategory: {0}", category.Key);

            foreach (var limit in category.Value)
            {
                Console.WriteLine(
                    "\n  Resource: {0}\n    Remaining: {1}\n    Reset: {2}\n    Limit: {3}",
                    limit.Resource, limit.Remaining, limit.Reset, limit.Limit);
            }
        }

            var tweets = from t in twitterCtx.Status
                         where t.Type == StatusType.User && t.ScreenName == screename && t.Count == 15
                         select t;

            if (tweets != null)
            {
                foreach (var tweetStatus in tweets)
                {
                    if (tweetStatus != null)
                    {
                        lstofTweets.Add(new TwitterProfileDetails { Name = tweetStatus.User.Name, ProfileImagePath = tweetStatus.User.ProfileImageUrl, Tweets = tweetStatus.Text, UserID = tweetStatus.User.Identifier.UserID, PostedDate = Convert.ToDateTime(tweetStatus.CreatedAt),ScreenName=screename });
                    }
                }
            }
            return lstofTweets;
    }
  1. 我正在使用以上方法。

        foreach (var screenObj in screenName)
        {
            var getTweets = api.GetAllTweets(api.AuthenticateCredentials, screenObj.UserName);
    
            foreach (var obj in getTweets)
            {
                using (DBcontext = new DBContext())
                {
                    tweets.Name = obj.Name;
                    tweets.ProfileImage = obj.ProfileImagePath;
                    tweets.PostedOn = obj.PostedDate;
                    tweets.Tweets = obj.Tweets;
                    tweets.CreatedOn = DateTime.Now;
                    tweets.ModifiedOn = DateTime.Now;
                    tweets.Status = EntityStatus.Active;
                    tweets.ScreenName = obj.ScreenName;
                    var exist = context.UserTweets.Any(user => user.Tweets.Equals(obj.Tweets));
                    if (!exist)
                        context.UserTweets.Add(tweets);
                    context.SaveChanges();
                }
            }
        }
    

1 个答案:

答案 0 :(得分:2)

我看到您找到了Help / RateLimits查询。您可以采取各种方法。例如在查询之间添加延迟,如果超出限制则延迟下一个查询,或者捕获异常并延迟到下一个15分钟窗口。

如果要以交互方式进行监控,可以查看每个查询的速率限制。用于执行查询的TwitterContext实例包含在每次查询后填充的RateLimitXxx属性。您需要在查询后读取这些值,这些值似乎位于GetAllTweets方法中。你必须以某种方式将这些值暴露给你的循环,通过返回对象,输出参数,静态字段或你认为必要的任何逻辑。

// the first time through, you have the whole rate limit for the 15 minute window

foreach (var screenObj in screenName)
{
    var getTweets = api.GetAllTweets(api.AuthenticateCredentials, screenObj.UserName);

    // your processing logic ...

    // assuming you have the RateLimitXxx values in scope
    if (rateLimitRemaining == 0)
        Thread.Sleep(CalculateRemainingMilliseconds(RateLimitReset));


}

RateLimitRemaining 是您在当前15分钟窗口中可以执行的查询次数,而 RateLimitReset 是在速率限制重置之前剩余的epoch seconds次数(当你可以再次开始查询。)

Rate Limiting上查看Twitter文档会很有帮助。

供参考,以下是其他一些可能提供更多想法的问题: