コード例 #1
0
        /// <summary>
        /// Get the actual RateLimit for the UserTimeline
        /// </summary>
        /// <returns></returns>
        public RateLimit GetRateLimitForUserTimeline()
        {
            var tokens = new OAuthTokens
            {
                AccessToken       = _accessToken,
                AccessTokenSecret = _accessTokenSecret,
                ConsumerKey       = _consumerKey,
                ConsumerSecret    = _consumerSecret
            };

            string responseString = null;
            var    proxy          = new WebRequestBuilder(new Uri(RateLimitStatusesUrl), HTTPVerb.GET, tokens);

            using (var response = proxy.ExecuteRequest())
            {
                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseString = reader.ReadToEnd();
                            reader.Close();
                        }
                    }
                }
            }

            var index = responseString.IndexOf("/statuses/user_timeline", System.StringComparison.Ordinal);

            if (index < 0)
            {
                return(null);
            }

            var result = new RateLimit();
            var value  = GetValue(responseString, index, "limit");

            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }
            result.Limit = int.Parse(value);

            value = GetValue(responseString, index, "remaining");
            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }
            result.LimitRemaining = int.Parse(value);

            value = GetValue(responseString, index, "reset");
            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }
            result.UtcLimitReset = ConvertFromUnixTimestamp(double.Parse(value));

            return(result);
        }
コード例 #2
0
        /// <summary>
        /// See https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
        /// </summary>
        /// <param name="screenName">screen name</param>
        /// <param name="count">number of tweets to be retrieved</param>
        public List <UserTimelineResponse> GetUserTimeLine(string screenName, int count, out RateLimit rateLimit)
        {
            // Return results in a List of UserTimelineResponse
            List <UserTimelineResponse> result = null;

            // Define new OAuthTokens
            OAuthTokens tokens = new OAuthTokens
            {
                AccessToken       = _accessToken,
                AccessTokenSecret = _accessTokenSecret,
                ConsumerKey       = _consumerKey,
                ConsumerSecret    = _consumerSecret
            };

            // Concat a request string
            string url = UserTimelineUrl + "count=" + count + "&screen_name=" + screenName;

            // Use the WebRequest and WebResponse to execute request and retrieve the response
            WebRequestBuilder proxy = new WebRequestBuilder(new Uri(url), HTTPVerb.GET, tokens);

            // Execute the request
            using (HttpWebResponse response = proxy.ExecuteRequest())
            {
                string responseString = null;

                // Define our RateLimit (
                rateLimit                = new RateLimit();
                rateLimit.Limit          = int.Parse(response.Headers["X-Rate-Limit-Limit"]);
                rateLimit.LimitRemaining = int.Parse(response.Headers["X-Rate-Limit-Remaining"]);
                rateLimit.UtcLimitReset  = ConvertFromUnixTimestamp(double.Parse(response.Headers["X-Rate-Limit-Reset"]));

                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseString = reader.ReadToEnd();
                            reader.Close();
                        }
                    }
                }

                // JsonSerializer to get back a strongly typed object (UserTimelineResponse)
                JsonSerializer serializer = new JsonSerializer();
                result = (List <UserTimelineResponse>)serializer.Deserialize(new JsonTextReader(new StringReader(responseString)), typeof(List <UserTimelineResponse>));
            }

            return(result);
        }
コード例 #3
0
ファイル: Request.cs プロジェクト: sawyerit/drone
        internal static string ExecuteAuthenticatedWebRequest(string twitterQuery, OAuthTokens tokens, bool retry = true)
        {
            //get mentions
            string      responseText = string.Empty;
            WebResponse response;

            try
            {
                WebRequestBuilder requestBuilder = new WebRequestBuilder(new Uri(twitterQuery), HTTPVerb.GET, tokens);
                response = requestBuilder.ExecuteRequest();

                if (!Object.Equals(response, null))
                {
                    responseText = BuildTextFromResponse(response);

                    if (string.IsNullOrEmpty(responseText))
                    {
                        ExceptionExtensions.LogWarning(new ArgumentNullException("Twitter responseText from the httpwebresponse was empty"), "Twitter ExecuteAuthenticatedWebRequest", "Query: " + twitterQuery);
                    }
                }
                else
                {
                    ExceptionExtensions.LogWarning(new ArgumentNullException("Twitter httwebresponse object was null"), "Twitter ExecuteAuthenticatedWebRequest", "Query: " + twitterQuery);
                }
            }
            catch (Exception e)
            {
                if (retry)
                {
                    if (e.Message.Contains("429") || e.Message.Contains("420"))
                    {
                        ExceptionExtensions.LogWarning(e, "Twitter.Request.ExecuteAuthenticatedWebRequest");
                        Thread.Sleep(300000);                         //wait 5 min because of rate limiting
                    }
                    else
                    {
                        Thread.Sleep(60000);
                    }
                    ExecuteAuthenticatedWebRequest(twitterQuery, tokens, false);
                }
                else
                {
                    ExceptionExtensions.LogError(e, "Drone.API.Twitter.Request.ExecuteAuthenticatedWebRequest", twitterQuery);
                }
            }

            return(responseText);
        }
コード例 #4
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);
        }
コード例 #5
0
        private List <TwitterEntity> GetLatestTweets(string handle)
        {
            List <TwitterEntity> tweets = new List <TwitterEntity>();

            #region Twitter Library Setup
            OAuthTokens oaccesstkn     = new OAuthTokens();
            string      consumerKey    = ConfigurationManager.AppSettings["TwitterConsumerKey"];
            string      consumerSecret = ConfigurationManager.AppSettings["TwitterConsumerSecret"];

            oaccesstkn.AccessToken       = ConfigurationManager.AppSettings["TwitterAccessToken"];
            oaccesstkn.AccessTokenSecret = ConfigurationManager.AppSettings["TwitterAccessSecret"];;
            oaccesstkn.ConsumerKey       = consumerKey;
            oaccesstkn.ConsumerSecret    = consumerSecret;
            #endregion

            try
            {
                #region Get Tweets From Twitter
                WebRequestBuilder webRequest = new WebRequestBuilder(new Uri(string.Format(ConfigurationManager.AppSettings["TwitterUrl"], handle, 500)), HTTPVerb.GET, oaccesstkn);

                string responseText;
                using (var response = webRequest.ExecuteRequest())
                {
                    using (var reader = new StreamReader(response.GetResponseStream()))
                    {
                        responseText = reader.ReadToEnd();
                    }
                }

                var brr = Encoding.UTF8.GetBytes(responseText);

                var streamReader = new StreamReader(new MemoryStream(brr));

                var serializer = new DataContractJsonSerializer(typeof(SearchResults));

                var tweetsResponse = (SearchResults)serializer.ReadObject(streamReader.BaseStream);

                streamReader.Close();
                #endregion

                foreach (var mmTweetData in tweetsResponse.Results)
                {
                    var tweetId = mmTweetData.Id.ToString();
                    try
                    {
                        var myTweet = new TwitterEntity
                        {
                            RowKey                = Guid.NewGuid().ToString(),
                            TwitterId             = tweetId,
                            TwitterIdString       = mmTweetData.Id_Str,
                            TextMessage           = mmTweetData.Text,
                            Source                = mmTweetData.Source,
                            FromUser              = mmTweetData.Source,
                            FromUserId            = mmTweetData.ToUserName,
                            ProfileImageUrl       = mmTweetData.User.ProfileImageUrl,
                            ProfileSecureImageUrl = mmTweetData.User.ProfileImageUrlHttps,
                            ReplyUserId           = mmTweetData.User.FromUserId.ToString(),
                            ReplyScreenName       = mmTweetData.User.FromUser,
                            ResultType            = mmTweetData.SearchMetaData.ResultType,
                            LanguageCode          = mmTweetData.SearchMetaData.IsoLanguageCode,
                            Created_At            = ParseTwitterDateTime(mmTweetData.CreatedAt),
                            Status                = "-1"
                        };

                        tweets.Add(myTweet);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            catch (Exception)
            {
            }

            return(tweets);
        }
コード例 #6
0
ファイル: MethodsCore.cs プロジェクト: isaacOjeda/EasyTwitter
        /// <summary>
        /// 
        /// </summary>
        /// <param name="overrideVerb"></param>
        /// <returns></returns>
        protected virtual TwitterResponse<string> ExecuteRequest(HTTPVerb overrideVerb)
        {
            this.Verb = overrideVerb;
            if (String.IsNullOrEmpty(this.Method))
                throw new ArgumentNullException("Method");

            WebRequestBuilder builder = new WebRequestBuilder(
                new Uri(this.BaseUri + this.Method),
                this.Verb,
                this.Tokens);

            string responseBody = String.Empty;

            try
            {
                if (this.AdditionalParameters.Count > 0)
                {
                    foreach (var item in this.AdditionalParameters)
                        builder.Parameters.Add(item.Key, item.Value);
                    if(this.Verb==HTTPVerb.POST)
                        builder.Multipart = true;
                }

                HttpWebResponse webResponse = builder.ExecuteRequest();
                Stream responseStream = webResponse.GetResponseStream();
                if (responseStream != null) responseBody = new StreamReader(responseStream).ReadToEnd();
            }
            catch (WebException wex)
            {
                TwitterStatus status = TwitterStatus.GeneralError; ;
                if (wex.Status == WebExceptionStatus.ProtocolError)
                {
                    switch(((HttpWebResponse)wex.Response).StatusCode)
                    {
                        case HttpStatusCode.BadRequest:
                            status = TwitterStatus.BadRequest;
                            break;

                        case HttpStatusCode.Unauthorized:
                            status = TwitterStatus.Unauthorized;
                            break;

                        case HttpStatusCode.NotFound:
                            status = TwitterStatus.FileNotFound;
                            break;
                        case HttpStatusCode.NotAcceptable:
                            status = TwitterStatus.NotAcceptable;
                            break;
                        default:
                            status = TwitterStatus.GeneralError;
                            break;
                    }
                }
                return new TwitterResponse<string>()
                {
                    Status = status,
                    ObjectResponse = String.Empty
                };
            }

            return new TwitterResponse<string>()
            {
                Status = TwitterStatus.Success,
                ObjectResponse = responseBody
            };
        }