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;
}
我正在使用以上方法。
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();
}
}
}
答案 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文档会很有帮助。
供参考,以下是其他一些可能提供更多想法的问题: