public static IEnumerable <Tweet> StreamStatuses(TwitterConfig config, string keywords)
        {
            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Tweet));

            var streamReader = ReadTweets(config, keywords);

            while (true)
            {
                string line = null;
                try { line = streamReader.ReadLine(); }
                catch (Exception) { }

                if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("{\"delete\""))
                {
                    var result = (Tweet)jsonSerializer.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(line)));
                    result.RawJson = line;
                    yield return(result);
                }

                // Oops the Twitter has ended... or more likely some error have occurred.
                // Reconnect to the twitter feed.
                if (line == null)
                {
                    streamReader = ReadTweets(config, keywords);
                }
            }
        }
        public static string getOAuthSignature(TwitterConfig config, string keywords, string oauth_nonce, string oauth_timestamp)
        {
            // Create Base oAuth String
            var baseString = string.Format(
                "oauth_consumer_key={0}" +
                "&oauth_nonce={1}" +
                "&oauth_signature_method={2}" +
                "&oauth_timestamp={3}" +
                "&oauth_token={4}" +
                "&oauth_version={5}" +
                "&track={6}",
                config.twitterConsumerKey,
                oauth_nonce,
                config.oAuthSignatureMethod,
                oauth_timestamp,
                config.twitterAccessToken,
                config.oAuthVersion,
                Uri.EscapeDataString(keywords));

            baseString = string.Concat("POST&", Uri.EscapeDataString(config.resourceUrl), "&", Uri.EscapeDataString(baseString));

            // Create Composite Key
            var compositeKey = string.Concat(Uri.EscapeDataString(config.twitterConsumerSecret), "&", Uri.EscapeDataString(config.twitterTokenSecret));

            // Create oAuth Signature
            string oauth_signature = string.Empty;

            using (var hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
            {
                oauth_signature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
            }

            return(oauth_signature);
        }
        public static TextReader ReadTweets(TwitterConfig config, string keywords)
        {
            // unique request details
            var oauth_nonce     = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
            var oauth_timestamp = Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds).ToString();
            var oauth_signature = Helpers.getOAuthSignature(config, keywords, oauth_nonce, oauth_timestamp);

            // create the request header
            var authHeader = string.Format(
                "OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", " +
                "oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", " +
                "oauth_token=\"{4}\", oauth_signature=\"{5}\", " +
                "oauth_version=\"{6}\"",
                Uri.EscapeDataString(oauth_nonce),
                Uri.EscapeDataString(config.oAuthSignatureMethod),
                Uri.EscapeDataString(oauth_timestamp),
                Uri.EscapeDataString(config.twitterConsumerKey),
                Uri.EscapeDataString(config.twitterAccessToken),
                Uri.EscapeDataString(oauth_signature),
                Uri.EscapeDataString(config.oAuthVersion)
                );

            // make the request
            ServicePointManager.Expect100Continue = false;
            HttpWebRequest request = Helpers.getHttpWebRequest(config.resourceUrl + "?track=" + HttpUtility.UrlEncode(keywords), authHeader);

            // bail out and retry after 5 seconds
            var tresponse = request.GetResponseAsync();

            if (tresponse.Wait(5000))
            {
                return(new StreamReader(tresponse.Result.GetResponseStream()));
            }
            else
            {
                request.Abort();
                return(StreamReader.Null);
            }
        }