コード例 #1
0
 public RateLimitingStatusDto(TwitterRateLimitStatus status)
 {
     HourlyLimit = status.HourlyLimit;
     RemainingHits = status.RemainingHits;
     ResetsInMinutes = (int) (status.ResetTime - DateTime.Now).TotalMinutes;
     ResetTime = status.ResetTime.ToUniversalTime();
 }
コード例 #2
0
 public RateLimitingStatusDto(TwitterRateLimitStatus status)
 {
     HourlyLimit     = status.HourlyLimit;
     RemainingHits   = status.RemainingHits;
     ResetsInMinutes = (int)(status.ResetTime - DateTime.Now).TotalMinutes;
     ResetTime       = status.ResetTime.ToUniversalTime();
 }
コード例 #3
0
ファイル: TweetRequester.cs プロジェクト: danielrmay/Twiddler
 private void UpdateLimit(TwitterRateLimitStatus status)
 {
     _requestLimitStatus.HourlyLimit = status.HourlyLimit;
     _requestLimitStatus.PeriodEndTime = status.ResetTime;
     _requestLimitStatus.PeriodDuration = 1.Hour();
     _requestLimitStatus.RemainingHits = status.RemainingHits;
 }
コード例 #4
0
        public override async Task OnWork(DateTime time)
        {
            var atmms = await Twitter.ts.ListTweetsMentioningMeAsync(new TweetSharp.ListTweetsMentioningMeOptions {
                Count = 5, IncludeEntities = true
            });

            TwitterRateLimitStatus rate = Twitter.ts.Response.RateLimitStatus;

            Abbybot.print("You have used " + rate.RemainingHits + " out of your " + rate.HourlyLimit);

            var tsmm = atmms.Value.ToArray();

            foreach (var tmm in tsmm)
            {
                var test = await AbbybotMentionSql.GetLatestMentionIdsAsync((ulong)tmm.Id);

                if (test.Count > 0)
                {
                    continue;
                }
                await AbbybotMentionSql.AddLatestMentionIdAsync((ulong)tmm.Id);

                var tmt = Regex.Replace(tmm.Text, @"http[^\s]+", "");
                var t   = Regex.Replace(tmt, @"@[^\s]+", "");
                //var twitteruser = AbbybotUser.GetUserFromTwitterUser(tmm.Author.ScreenName);
                //AbbybotTwitterCommandArgs atca = new AbbybotTwitterCommandArgs();
                //atca.Message = t;
                //atca.abbybotUser = (AbbybotUser)twitteruser;

                Abbybot.print($"[\n{t}\n]");
            }
        }
コード例 #5
0
        protected static TimeSpan GetSleepTime(TwitterRateLimitStatus rls, IScheduler sched)
        {
            if (rls.HourlyLimit == -1)
                return TimeSpan.Zero;

            TimeSpan timeTillReset = rls.ResetTime - sched.Now;
            int remainingHits = rls.RemainingHits == 0 ? 1 : rls.RemainingHits;
            var secondsOfSleepTime = timeTillReset.TotalSeconds / remainingHits;
            return TimeSpan.FromSeconds(secondsOfSleepTime);
        }
コード例 #6
0
ファイル: Program.cs プロジェクト: 9nick9/MRPCode
        static bool LimitExceeded(OAuthTokens tokens)
        {
            TwitterResponse <TwitterRateLimitStatus> response = TwitterRateLimitStatus.GetStatus(tokens);

            if (response.RateLimiting.Remaining == 0)
            {
                Console.Out.WriteLine($"Twitter rate limit hit. Will resume pulling @ {response.RateLimiting.ResetDate.ToString("hh:mm:ss")}");
            }

            return(response.RateLimiting.Remaining == 0);
        }
コード例 #7
0
ファイル: TwitterFeedBase.cs プロジェクト: codeyu/Rx-Demo
        protected static TimeSpan GetSleepTime(TwitterRateLimitStatus rls, IScheduler sched)
        {
            if (rls.HourlyLimit == -1)
            {
                return(TimeSpan.Zero);
            }

            TimeSpan timeTillReset      = rls.ResetTime - sched.Now;
            int      remainingHits      = rls.RemainingHits == 0 ? 1 : rls.RemainingHits;
            var      secondsOfSleepTime = timeTillReset.TotalSeconds / remainingHits;

            return(TimeSpan.FromSeconds(secondsOfSleepTime));
        }
コード例 #8
0
        protected TimeSpan GetSleepTime(TwitterRateLimitStatus rateLimitStatus)
        {
            if (rateLimitStatus.HourlyLimit == -1)
            {
                return TimeSpan.FromMilliseconds(UserThrottleMs);
            }

            // let's send a message if the limit is not infinite
            Messenger.Default.Send(new TwitterStatusMessage
            {
                HourlyLimit = rateLimitStatus.HourlyLimit,
                RawSource = rateLimitStatus.RawSource,
                RemainingHits = rateLimitStatus.RemainingHits,
                ResetTime = rateLimitStatus.ResetTime,
                ResetTimeInSeconds = rateLimitStatus.ResetTimeInSeconds
            });

            var timeTillReset = rateLimitStatus.ResetTime - Scheduler.Now;
            var remainingHits = rateLimitStatus.RemainingHits == 0 ? 1 : rateLimitStatus.RemainingHits;
            var secondsOfSleepTime = timeTillReset.TotalSeconds / remainingHits;
            Console.WriteLine("sleep time: " + secondsOfSleepTime);
            return TimeSpan.FromSeconds(secondsOfSleepTime).Add(TimeSpan.FromMilliseconds(UserThrottleMs));
        }
コード例 #9
0
        protected TimeSpan GetSleepTime(TwitterRateLimitStatus rateLimitStatus)
        {
            if (rateLimitStatus.HourlyLimit == -1)
            {
                return(TimeSpan.FromMilliseconds(UserThrottleMs));
            }

            // let's send a message if the limit is not infinite
            Messenger.Default.Send(new TwitterStatusMessage
            {
                HourlyLimit        = rateLimitStatus.HourlyLimit,
                RawSource          = rateLimitStatus.RawSource,
                RemainingHits      = rateLimitStatus.RemainingHits,
                ResetTime          = rateLimitStatus.ResetTime,
                ResetTimeInSeconds = rateLimitStatus.ResetTimeInSeconds
            });

            var timeTillReset      = rateLimitStatus.ResetTime - Scheduler.Now;
            var remainingHits      = rateLimitStatus.RemainingHits == 0 ? 1 : rateLimitStatus.RemainingHits;
            var secondsOfSleepTime = timeTillReset.TotalSeconds / remainingHits;

            Console.WriteLine("sleep time: " + secondsOfSleepTime);
            return(TimeSpan.FromSeconds(secondsOfSleepTime).Add(TimeSpan.FromMilliseconds(UserThrottleMs)));
        }
コード例 #10
0
        private Dictionary<string, TwitterRateLimitStatus> GetBucketLimits(JObject limits)          
        {
            if (limits == null || limits.Count <= 0)
                return null;

            var bucketLimits = new Dictionary<string, TwitterRateLimitStatus>();

            foreach (var limit in limits)                                           // /followers/list, /followers/ids or /account/verify_credentials, /account_settings
            {
                var bucketLimit = new TwitterRateLimitStatus();                     // limit, remaining, reset
                bucketLimits.Add(limit.Key, bucketLimit);

                JObject limitValues = JObject.Load(limit.Value.CreateReader());
                bucketLimit.RawSource = limitValues.ToString();

                bucketLimit.HourlyLimit = limitValues.GetValue("limit").Value<int>();
                bucketLimit.RemainingHits = limitValues.GetValue("remaining").Value<int>();
                bucketLimit.ResetTime = limitValues.GetValue("reset").Value<long>().FromUnixTime();

                var remainingSeconds = Convert.ToInt64((bucketLimit.ResetTime - DateTime.UtcNow).TotalSeconds);
                bucketLimit.ResetTimeInSeconds = remainingSeconds < 0 ? -1 : remainingSeconds;
            }

            return bucketLimits;
        }
コード例 #11
0
        private static List <CorpusDataRow> SearchTweets(string keyword, Sentiment sentiment, int count, TwitterService service, string outputPath)
        {
            List <CorpusDataRow> outputCorpus = new List <CorpusDataRow>();
            long?lastId    = null;
            int  index     = 0;
            int  skipCount = 0;

            keyword += sentiment == Sentiment.Positive ? " :)" : " :(";

            while (skipCount == 0 && outputCorpus.Count < count)
            {
                // Fetch the tweet.
                var statusList = service.Search(new SearchOptions()
                {
                    Q = keyword, Lang = "en", IncludeEntities = false, Count = count, MaxId = lastId
                });
                lastId = statusList.Statuses.Last().Id;
                foreach (var status in statusList.Statuses)
                {
                    if (!status.Text.StartsWith("RT") && !status.Text.Contains(":P") &&
                        !((status.Text.Contains(":)") || status.Text.Contains(":-)") || status.Text.Contains(": )") || status.Text.Contains(":D") || status.Text.Contains("=)")) &&
                          (status.Text.Contains(":(") || status.Text.Contains(":-(") || status.Text.Contains(": ("))) &&
                        outputCorpus.Where(c => c.Tweet.Text == status.Text).Count() == 0)
                    {
                        status.Text = status.Text.Replace(",", " ");
                        status.Text = status.Text.Replace("\n", " ");
                        status.Text = status.Text.Replace("\r", " ");
                        status.Text = status.Text.Replace("\t", " ");
                        status.Text = status.Text.Replace(":)", " ");
                        status.Text = status.Text.Replace(":-)", " ");
                        status.Text = status.Text.Replace(": )", " ");
                        status.Text = status.Text.Replace(":D", " ");
                        status.Text = status.Text.Replace("=)", " ");
                        status.Text = status.Text.Replace(":(", " ");
                        status.Text = status.Text.Replace(":-(", " ");
                        status.Text = status.Text.Replace(": (", " ");

                        if (service.Response.StatusCode == System.Net.HttpStatusCode.OK)
                        {
                            // Convert the TwitterStatus to a Tweet DTO.
                            CorpusDataRow row = new CorpusDataRow();
                            row.Id        = status.Id;
                            row.Keyword   = keyword;
                            row.Tweet     = Mapper.Map <TwitterStatus, Tweet>(status);
                            row.Sentiment = sentiment;

                            // Save the result to file.
                            SaveResult(row, outputPath);

                            outputCorpus.Add(row);

                            if ((index + 1) % 50 == 0)
                            {
                                Console.WriteLine("Processed " + (index + 1) + " tweets.");
                            }
                        }
                        else
                        {
                            // Check the rate limit.
                            TwitterRateLimitStatus rateSearch = service.Response.RateLimitStatus;
                            if (rateSearch.RemainingHits < 1)
                            {
                                DateTime resetTime = rateSearch.ResetTime + TimeSpan.FromMinutes(1);

                                Console.WriteLine("Rate Limit reached. Sleeping until " + resetTime);
                                Thread.Sleep(resetTime - DateTime.Now);

                                // Try this record again.
                                index--;
                            }
                            else
                            {
                                // Some other error. Maybe 404. Skip this record.
                                skipCount++;
                                Console.WriteLine("Skipped " + skipCount + " records. Got " + service.Response.StatusCode + ".");
                            }
                        }
                    }
                }
            }

            Console.WriteLine("Saved " + outputCorpus.Count + ", Skipped " + skipCount + ".");

            return(outputCorpus);
        }
コード例 #12
0
        public static void TwitterUpdate()
        {
            Rust.TwitterAccount        = "RustUpdates";
            Warcraft.TwitterAccount    = "Warcraft";
            Overwatch.TwitterAccount   = "PlayOverwatch";
            Starcraft.TwitterAccount   = "Starcraft";
            Diablo.TwitterAccount      = "Diablo";
            Hearthstone.TwitterAccount = "PlayHearthstone";
            Heroes.TwitterAccount      = "BlizzHeroes";

            if (hardreset)
            {
                if (resetTime >= 15)
                {
                    hardreset = false;
                    resetTime = 0;
                }
                else
                {
                    resetTime++;
                    return;
                }
            }


            //gets channels to send tweets to
            Channel TwitterRustCH  = YDCbot.TwitterRustCH;
            Channel TwitterBlizzCH = YDCbot.TwitterBlizzCH;
            Channel TwitterFeedCh  = YDCbot.TwitterFeedCh;

            //starts a service with twitter to GET tweets
            var service = new TwitterService(ConsumerKey, ConsumerSecret);

            service.AuthenticateWith(token, tokenSecret);
            //sets up a GET status request for each user, with given name and tweet amounts
            //then posts those tweets in their correct channel


            if (YDCbot.TwitterToFollow != "" && TwitterFeedCh != null)
            {
                List <TwitterStatus> TwitterStatuses = new List <TwitterStatus>();
                var Tweetoptions = new TweetSharp.ListTweetsOnUserTimelineOptions();
                Tweetoptions.ScreenName = YDCbot.TwitterToFollow;
                if (FollowedTwitter.LastTweet != 0)
                {
                    Tweetoptions.SinceId = FollowedTwitter.LastTweet;
                }
                else
                {
                    Tweetoptions.Count = TweetAmount;
                }
                Tweetoptions.ExcludeReplies = true;
                TwitterStatuses             = service.ListTweetsOnUserTimeline(Tweetoptions).ToList();
                if (TwitterStatuses.Count > 0)
                {
                    foreach (TwitterStatus tweet in TwitterStatuses)
                    {
                        if (tweet.Id > FollowedTwitter.LastTweet)
                        {
                            FollowedTwitter.LastTweet = tweet.Id;
                        }
                        string TweetToDiscord = "``` " + "https://twitter.com/" + YDCbot.TwitterToFollow + "/status/" + tweet.Id + " ```";

                        TwitterFeedCh.SendMessage(TweetToDiscord);
                    }
                }
            }


            //used as examples, will only work if user has correct text channels in their server
            //YDCbot.cs has the void that sets everything up, check for correct channel names
            #region RustUpdates
            if (YDCbot.HasTwitterRust)
            {
                List <TwitterStatus> RustStatuses = new List <TwitterStatus>();
                var Rustoptions = new TweetSharp.ListTweetsOnUserTimelineOptions();
                Rustoptions.ScreenName = Rust.TwitterAccount;
                if (Rust.LastTweet != 0)
                {
                    Rustoptions.SinceId = Rust.LastTweet;
                }
                else
                {
                    Rustoptions.Count = TweetAmount;
                }
                Rustoptions.ExcludeReplies = true;
                RustStatuses = service.ListTweetsOnUserTimeline(Rustoptions).ToList();
                if (RustStatuses.Count > 0)
                {
                    foreach (TwitterStatus tweet in RustStatuses)
                    {
                        if (tweet.Id > Rust.LastTweet)
                        {
                            Rust.LastTweet = tweet.Id;
                        }
                        string TweetToDiscord = "``` " + "https://twitter.com/" + Rust.TwitterAccount + "/status/" + tweet.Id + " ```";

                        TwitterRustCH.SendMessage(TweetToDiscord);
                    }
                }
            }
            #endregion
            if (YDCbot.HasTwitterBlizz)
            {
                #region Diablo
                List <TwitterStatus> DiabloStatuses = new List <TwitterStatus>();
                var Diablooptions = new TweetSharp.ListTweetsOnUserTimelineOptions();
                Diablooptions.ScreenName = Diablo.TwitterAccount;
                if (Diablo.LastTweet != 0)
                {
                    Diablooptions.SinceId = Diablo.LastTweet;
                }
                else
                {
                    Diablooptions.Count = TweetAmount;
                }
                Diablooptions.ExcludeReplies = true;
                DiabloStatuses = service.ListTweetsOnUserTimeline(Diablooptions).ToList();
                if (DiabloStatuses.Count > 0)
                {
                    foreach (TwitterStatus tweet in DiabloStatuses)
                    {
                        if (tweet.Id > Diablo.LastTweet)
                        {
                            Diablo.LastTweet = tweet.Id;
                        }
                        string TweetToDiscord = "``` " + "https://twitter.com/" + Diablo.TwitterAccount + "/status/" + tweet.Id + " ```";

                        TwitterBlizzCH.SendMessage(TweetToDiscord);
                        if (tweet.Entities.Media.Count > 0)
                        {
                            foreach (var link in tweet.Entities.Media)
                            {
                                TwitterBlizzCH.SendMessage(link.MediaUrlHttps);
                            }
                        }
                    }
                }
                #endregion
                #region Warcraft
                List <TwitterStatus> WarcraftStatuses = new List <TwitterStatus>();
                var Warcraftoptions = new TweetSharp.ListTweetsOnUserTimelineOptions();
                Warcraftoptions.ScreenName = Warcraft.TwitterAccount;
                if (Warcraft.LastTweet != 0)
                {
                    Warcraftoptions.SinceId = Warcraft.LastTweet;
                }
                else
                {
                    Warcraftoptions.Count = TweetAmount;
                }
                Warcraftoptions.ExcludeReplies = true;
                WarcraftStatuses = service.ListTweetsOnUserTimeline(Warcraftoptions).ToList();
                if (WarcraftStatuses.Count > 0)
                {
                    foreach (TwitterStatus tweet in WarcraftStatuses)
                    {
                        if (tweet.Id > Warcraft.LastTweet)
                        {
                            Warcraft.LastTweet = tweet.Id;
                        }
                        string TweetToDiscord = "``` " + "https://twitter.com/" + Warcraft.TwitterAccount + "/status/" + tweet.Id + " ```";

                        TwitterBlizzCH.SendMessage(TweetToDiscord);
                        if (tweet.Entities.Media.Count > 0)
                        {
                            foreach (var link in tweet.Entities.Media)
                            {
                                TwitterBlizzCH.SendMessage(link.MediaUrlHttps);
                            }
                        }
                    }
                }
                #endregion
                #region Starcraft
                List <TwitterStatus> StarcraftStatuses = new List <TwitterStatus>();
                var Starcraftoptions = new TweetSharp.ListTweetsOnUserTimelineOptions();
                Starcraftoptions.ScreenName = Starcraft.TwitterAccount;
                if (Starcraft.LastTweet != 0)
                {
                    Starcraftoptions.SinceId = Starcraft.LastTweet;
                }
                else
                {
                    Starcraftoptions.Count = TweetAmount;
                }
                Starcraftoptions.ExcludeReplies = true;
                StarcraftStatuses = service.ListTweetsOnUserTimeline(Starcraftoptions).ToList();
                if (StarcraftStatuses.Count > 0)
                {
                    foreach (TwitterStatus tweet in StarcraftStatuses)
                    {
                        if (tweet.Id > Starcraft.LastTweet)
                        {
                            Starcraft.LastTweet = tweet.Id;
                        }
                        string TweetToDiscord = "``` " + "https://twitter.com/" + Starcraft.TwitterAccount + "/status/" + tweet.Id + " ```";

                        TwitterBlizzCH.SendMessage(TweetToDiscord);
                        if (tweet.Entities.Media.Count > 0)
                        {
                            foreach (var link in tweet.Entities.Media)
                            {
                                TwitterBlizzCH.SendMessage(link.MediaUrlHttps);
                            }
                        }
                    }
                }
                #endregion
                #region Heroes
                List <TwitterStatus> HeroesStatuses = new List <TwitterStatus>();
                var Heroesoptions = new TweetSharp.ListTweetsOnUserTimelineOptions();
                Heroesoptions.ScreenName = Heroes.TwitterAccount;
                if (Heroes.LastTweet != 0)
                {
                    Heroesoptions.SinceId = Heroes.LastTweet;
                }
                else
                {
                    Heroesoptions.Count = TweetAmount;
                }
                Heroesoptions.ExcludeReplies = true;
                HeroesStatuses = service.ListTweetsOnUserTimeline(Heroesoptions).ToList();
                if (HeroesStatuses.Count > 0)
                {
                    foreach (TwitterStatus tweet in HeroesStatuses)
                    {
                        if (tweet.Id > Heroes.LastTweet)
                        {
                            Heroes.LastTweet = tweet.Id;
                        }
                        string TweetToDiscord = "``` " + "https://twitter.com/" + Heroes.TwitterAccount + "/status/" + tweet.Id + " ```";

                        TwitterBlizzCH.SendMessage(TweetToDiscord);
                        if (tweet.Entities.Media.Count > 0)
                        {
                            foreach (var link in tweet.Entities.Media)
                            {
                                TwitterBlizzCH.SendMessage(link.MediaUrlHttps);
                            }
                        }
                    }
                }
                #endregion
                #region Hearthstone
                List <TwitterStatus> HearthstoneStatuses = new List <TwitterStatus>();
                var Hearthoptions = new TweetSharp.ListTweetsOnUserTimelineOptions();
                Hearthoptions.ScreenName = Hearthstone.TwitterAccount;
                if (Hearthstone.LastTweet != 0)
                {
                    Hearthoptions.SinceId = Hearthstone.LastTweet;
                }
                else
                {
                    Hearthoptions.Count = TweetAmount;
                }
                Hearthoptions.ExcludeReplies = true;
                HearthstoneStatuses          = service.ListTweetsOnUserTimeline(Hearthoptions).ToList();
                if (HearthstoneStatuses.Count > 0)
                {
                    foreach (TwitterStatus tweet in HearthstoneStatuses)
                    {
                        if (tweet.Id > Hearthstone.LastTweet)
                        {
                            Hearthstone.LastTweet = tweet.Id;
                        }
                        string TweetToDiscord = "``` " + "https://twitter.com/" + Hearthstone.TwitterAccount + "/status/" + tweet.Id + " ```";

                        TwitterBlizzCH.SendMessage(TweetToDiscord);
                        if (tweet.Entities.Media.Count > 0)
                        {
                            foreach (var link in tweet.Entities.Media)
                            {
                                TwitterBlizzCH.SendMessage(link.MediaUrlHttps);
                            }
                        }
                    }
                }
                #endregion
                #region Overwatch
                List <TwitterStatus> OverwatchStatuses = new List <TwitterStatus>();
                var Overwatchoptions = new TweetSharp.ListTweetsOnUserTimelineOptions();
                Overwatchoptions.ScreenName = Overwatch.TwitterAccount;
                if (Overwatch.LastTweet != 0)
                {
                    Overwatchoptions.SinceId = Overwatch.LastTweet;
                }
                else
                {
                    Overwatchoptions.Count = TweetAmount;
                }
                Overwatchoptions.ExcludeReplies = true;
                OverwatchStatuses = service.ListTweetsOnUserTimeline(Overwatchoptions).ToList();
                if (OverwatchStatuses.Count > 0)
                {
                    foreach (TwitterStatus tweet in OverwatchStatuses)
                    {
                        if (tweet.Id > Overwatch.LastTweet)
                        {
                            Overwatch.LastTweet = tweet.Id;
                        }

                        string TweetToDiscord = "``` " + "https://twitter.com/" + Overwatch.TwitterAccount + "/status/" + tweet.Id + " ```";
                        TwitterBlizzCH.SendMessage(TweetToDiscord);

                        if (tweet.Entities.Media.Count > 0)
                        {
                            foreach (var link in tweet.Entities.Media)
                            {
                                TwitterBlizzCH.SendMessage(link.MediaUrlHttps);
                            }
                        }
                    }
                }
                #endregion
            }
            TwitterRateLimitStatus rate = service.Response.RateLimitStatus; //checking rate limits to prevent twitter bot from being ip banned
            Console.WriteLine("You have " + rate.RemainingHits + " remaining out of the " + rate.HourlyLimit + " limit. @" + DateTime.Now.ToString("h:mm:ss tt"));
            if (rate.RemainingHits < 25)
            {
                hardreset = true;
                return;
            }
            SaveTwitter();
        }
コード例 #13
0
        private static TwitterRateLimitStatus DeserializeRateLimitStatusXml(string xml)
        {
            var document = new XmlDocument();
            document.LoadXml(xml);

            // easier to use linq for rate limit status
            var hourlylimitNode = document.SelectSingleNode("/hash/hourly-limit");
            var hourly = hourlylimitNode != null ? hourlylimitNode.FirstChild : null;
            var remaininghitsNode = document.SelectSingleNode("/hash/remaining-hits");
            var hits = remaininghitsNode != null ? remaininghitsNode.FirstChild : null;
            var resettimeinsecondsNode = document.SelectSingleNode("/hash/reset-time-in-seconds");
            var seconds = resettimeinsecondsNode != null ? resettimeinsecondsNode.FirstChild : null;
            // var time = document.SelectSingleNode("/hash/reset-time").FirstChild;

            var hourlyValue = hourly != null && hourly.Value != null
                                  ? Convert.ToInt32(hourly.Value, CultureInfo.InvariantCulture)
                                  : 0;
            var hitsValue = hits != null && hits.Value != null
                                ? Convert.ToInt32(hits.Value, CultureInfo.InvariantCulture)
                                : 0;
            var secondsValue = seconds != null && seconds.Value != null
                                   ? Convert.ToInt64(seconds.Value, CultureInfo.InvariantCulture)
                                   : 0;

            var resetTime = secondsValue.FromUnixTime();
            var limit = new TwitterRateLimitStatus
                            {
                                HourlyLimit = hourlyValue,
                                RemainingHits = hitsValue,
                                ResetTimeInSeconds = secondsValue,
                                ResetTime = resetTime
                            };

            return limit;
        }
コード例 #14
0
ファイル: TwitterFeedBase.cs プロジェクト: codeyu/Rx-Demo
        protected static TimeSpan GetSleepTime(TwitterService service, IScheduler sched)
        {
            TwitterRateLimitStatus rls = service.Response.RateLimitStatus;

            return(GetSleepTime(rls, sched));
        }
コード例 #15
0
        public static void PrintTwitterRateLimitStatus(TwitterService service)
        {
            TwitterRateLimitStatus rate = service.Response.RateLimitStatus;

            ConsoleWrapper.WriteLine($"{DateTime.Now.ToLongTimeString()} Twitter rate limit status: {rate.RemainingHits}/{rate.HourlyLimit}");
        }
コード例 #16
0
ファイル: TwitterCommand.cs プロジェクト: phawxby/Twitterizer
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <returns>The results of the command.</returns>
        public TwitterResponse <T> ExecuteCommand()
        {
            TwitterResponse <T> twitterResponse = new TwitterResponse <T>();

            if (this.OptionalProperties.UseSSL)
            {
                this.Uri = new Uri(this.Uri.AbsoluteUri.Replace("http://", "https://"));
            }

            // Loop through all of the custom attributes assigned to the command class
            foreach (Attribute attribute in this.GetType().GetCustomAttributes(false))
            {
                if (attribute is AuthorizedCommandAttribute)
                {
                    if (this.Tokens == null)
                    {
                        throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Tokens are required for the \"{0}\" command.", this.GetType()));
                    }

                    if (string.IsNullOrEmpty(this.Tokens.ConsumerKey) ||
                        string.IsNullOrEmpty(this.Tokens.ConsumerSecret) ||
                        string.IsNullOrEmpty(this.Tokens.AccessToken) ||
                        string.IsNullOrEmpty(this.Tokens.AccessTokenSecret))
                    {
                        throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Token values cannot be null when executing the \"{0}\" command.", this.GetType()));
                    }
                }
                else if (attribute is RateLimitedAttribute)
                {
                    // Get the rate limiting status
                    if (TwitterRateLimitStatus.GetStatus(this.Tokens).ResponseObject.RemainingHits == 0)
                    {
                        throw new TwitterizerException("You are being rate limited.");
                    }
                }
            }

            // Prepare the query parameters
            Dictionary <string, object> queryParameters = new Dictionary <string, object>();

            foreach (KeyValuePair <string, object> item in this.RequestParameters)
            {
                queryParameters.Add(item.Key, item.Value);
            }

            // Declare the variable to be returned
            twitterResponse.ResponseObject = default(T);
            twitterResponse.RequestUrl     = this.Uri.AbsoluteUri;
            RateLimiting rateLimiting;
            AccessLevel  accessLevel;

            byte[] responseData;

            try
            {
                WebRequestBuilder requestBuilder = new WebRequestBuilder(this.Uri, this.Verb, this.Tokens)
                {
                    Multipart = this.Multipart
                };

#if !SILVERLIGHT
                if (this.OptionalProperties != null)
                {
                    requestBuilder.Proxy = this.OptionalProperties.Proxy;
                }
#endif

                foreach (var item in queryParameters)
                {
                    requestBuilder.Parameters.Add(item.Key, item.Value);
                }

                HttpWebResponse response = requestBuilder.ExecuteRequest();

                if (response == null)
                {
                    twitterResponse.Result = RequestResult.Unknown;
                    return(twitterResponse);
                }

                responseData            = ConversionUtility.ReadStream(response.GetResponseStream());
                twitterResponse.Content = Encoding.UTF8.GetString(responseData, 0, responseData.Length);

                twitterResponse.RequestUrl = requestBuilder.RequestUri.AbsoluteUri;

#if !SILVERLIGHT
                // Parse the rate limiting HTTP Headers
                rateLimiting = ParseRateLimitHeaders(response.Headers);

                // Parse Access Level
                accessLevel = ParseAccessLevel(response.Headers);
#else
                rateLimiting = null;
                accessLevel  = AccessLevel.Unknown;
#endif

                // Lookup the status code and set the status accordingly
                SetStatusCode(twitterResponse, response.StatusCode, rateLimiting);

                twitterResponse.RateLimiting = rateLimiting;
                twitterResponse.AccessLevel  = accessLevel;
            }
            catch (WebException wex)
            {
                if (new[]
                {
#if !SILVERLIGHT
                    WebExceptionStatus.Timeout,
                    WebExceptionStatus.ConnectionClosed,
#endif
                    WebExceptionStatus.ConnectFailure
                }.Contains(wex.Status))
                {
                    twitterResponse.Result       = RequestResult.ConnectionFailure;
                    twitterResponse.ErrorMessage = wex.Message;
                    return(twitterResponse);
                }

                // The exception response should always be an HttpWebResponse, but we check for good measure.
                HttpWebResponse exceptionResponse = wex.Response as HttpWebResponse;

                if (exceptionResponse == null)
                {
                    throw;
                }

                responseData            = ConversionUtility.ReadStream(exceptionResponse.GetResponseStream());
                twitterResponse.Content = Encoding.UTF8.GetString(responseData, 0, responseData.Length);

#if !SILVERLIGHT
                rateLimiting = ParseRateLimitHeaders(exceptionResponse.Headers);

                // Parse Access Level
                accessLevel = ParseAccessLevel(exceptionResponse.Headers);
#else
                rateLimiting = null;
                accessLevel  = AccessLevel.Unknown;
#endif

                // Try to read the error message, if there is one.
                try
                {
                    TwitterErrorDetails errorDetails = SerializationHelper <TwitterErrorDetails> .Deserialize(responseData);

                    twitterResponse.ErrorMessage = errorDetails.ErrorMessage;
                }
                catch (Exception)
                {
                    // Occasionally, Twitter responds with XML error data even though we asked for json.
                    // This is that scenario. We will deal with it by doing nothing. It's up to the developer to deal with it.
                }

                // Lookup the status code and set the status accordingly
                SetStatusCode(twitterResponse, exceptionResponse.StatusCode, rateLimiting);

                twitterResponse.RateLimiting = rateLimiting;
                twitterResponse.AccessLevel  = accessLevel;

                if (wex.Status == WebExceptionStatus.UnknownError)
                {
                    throw;
                }

                return(twitterResponse);
            }

            try
            {
                twitterResponse.ResponseObject = SerializationHelper <T> .Deserialize(responseData, this.DeserializationHandler);
            }
            catch (Newtonsoft.Json.JsonReaderException)
            {
                twitterResponse.ErrorMessage = "Unable to parse JSON";
                twitterResponse.Result       = RequestResult.Unknown;
                return(twitterResponse);
            }
            catch (Newtonsoft.Json.JsonSerializationException)
            {
                twitterResponse.ErrorMessage = "Unable to parse JSON";
                twitterResponse.Result       = RequestResult.Unknown;
                return(twitterResponse);
            }

            // Pass the current oauth tokens into the new object, so method calls from there will keep the authentication.
            twitterResponse.Tokens = this.Tokens;

            return(twitterResponse);
        }
コード例 #17
0
        private void GetAllTweetsForUser(string username)
        {
            Dispatcher.BeginInvoke(new Action(delegate
            {
                tweetList.Items.Clear();
                retweetList.Items.Clear();
                replyList.Items.Clear();
                mentionCounter.Clear();
            }));

            var currentTweets = service.ListTweetsOnUserTimeline(new ListTweetsOnUserTimelineOptions
            {
                ScreenName = username,
                Count      = 200
            });

            TwitterRateLimitStatus rateStatus = service.Response.RateLimitStatus;

            if (currentTweets == null)
            {
                MessageBox.Show($"Couldn't find any tweets for this user. Rate limits remaining: {rateStatus.RemainingHits}");
                return;
            }

            int tweetCount = currentTweets.Count();

            Dispatcher.BeginInvoke(new Action(delegate
            {
                progressBar.Minimum = 0;
                progressBar.Maximum = tweetCount;
                progressBar.Value   = 0;
            }));

            foreach (var tweet in currentTweets)
            {
                if (unitOfWork.Tweets.TweetAlreadyExists(tweet.Id))
                {
                    continue;
                }

                // save the user
                TwitterUser tUser = tweet.User;
                User        user;

                if (unitOfWork.Users.UserAlreadyExists(tUser.Id, out user) == false)
                {
                    user = CreateUser(tUser);

                    unitOfWork.Users.Add(user);
                }

                // save the tweet
                Tweet t = CreateTweet(tweet);

                unitOfWork.Tweets.Add(t);

                // save any linked hashtags
                if (tweet.Entities.HashTags.Any())
                {
                    HandleHashtags(tweet);
                }

                if (tweet.Entities.Mentions.Any())
                {
                    HandleMentions(tweet);
                }

                unitOfWork.Complete();

                // DISPLAY
                Dispatcher.BeginInvoke(new Action(delegate
                {
                    if (tweet.Text.StartsWith("RT "))
                    {
                        OutputReTweet(tweet);
                    }
                    else if (tweet.InReplyToStatusId.HasValue)
                    {
                        OutputReplyTweet(tweet);
                    }
                    else
                    {
                        OutputNormalTweet(tweet);
                    }

                    progressBar.Value += 1;
                }));
            }

            Dispatcher.BeginInvoke(new Action(delegate
            {
                UpdateMainUserList();
            }));
        }
コード例 #18
0
        /// <summary>
        /// Loads the tweet text data for each id in the corpus.
        /// </summary>
        /// <param name="service">TwitterService</param>
        /// <param name="corpus">List of CorpusDataRow</param>
        /// <param name="outputPath">File path to output data file.</param>
        /// <returns>List of CorpusDataRow (with Tweet DTO populated).</returns>
        private static List <CorpusDataRow> LoadTweets(TwitterService service, List <CorpusDataRow> corpus, string outputPath)
        {
            List <CorpusDataRow> outputCorpus = new List <CorpusDataRow>();
            int skipCount = 0;

            for (int index = GetResumeIndex(corpus, outputPath); index < corpus.Count; index++)
            {
                CorpusDataRow row = corpus[index];

                // Fetch the tweet.
                var status = service.GetTweet(new GetTweetOptions()
                {
                    Id = row.Id
                });
                status.Text = status.Text.Replace(",", " ");
                status.Text = status.Text.Replace("\n", " ");
                status.Text = status.Text.Replace("\r", " ");
                status.Text = status.Text.Replace("\t", " ");

                if (service.Response.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    // Convert the TwitterStatus to a Tweet DTO.
                    row.Tweet = Mapper.Map <TwitterStatus, Tweet>(status);

                    // Save the result to file.
                    SaveResult(row, outputPath);

                    outputCorpus.Add(row);

                    if ((index + 1) % 50 == 0)
                    {
                        Console.WriteLine("Processed " + (index + 1) + " tweets.");
                    }
                }
                else
                {
                    // Check the rate limit.
                    TwitterRateLimitStatus rateSearch = service.Response.RateLimitStatus;
                    if (rateSearch.RemainingHits < 1)
                    {
                        DateTime resetTime = rateSearch.ResetTime + TimeSpan.FromMinutes(1);

                        Console.WriteLine("Rate Limit reached. Sleeping until " + resetTime);
                        Thread.Sleep(resetTime - DateTime.Now);

                        // Try this record again.
                        index--;
                    }
                    else
                    {
                        // Some other error. Maybe 404. Skip this record.
                        skipCount++;
                        Console.WriteLine("Skipped " + skipCount + " records. Got " + service.Response.StatusCode + ".");
                    }
                }
            }

            Console.WriteLine("Saved " + outputCorpus.Count + ", Skipped " + skipCount + ".");

            return(outputCorpus);
        }