【问题标题】:How to handle LinqtoTwitter Rate(v2.1) limit exceeded Error如何处理 LinqtoTwitter 速率(v2.1)超出限制错误
【发布时间】:2014-04-12 02:32:24
【问题描述】:

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();
                }
            }
        }
    

【问题讨论】:

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


    【解决方案1】:

    我看到您找到了 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 文档会很有帮助。

    作为参考,这里有几个其他问题可能会提供更多想法:

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 2015-08-19
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多