Thursday, November 14, 2013

Get Twitter Feeds

Twitter has recently changed the way to access the feeds for some security reason.  The old simple way of accessing it through RSS has been depicted.  The new method has few additional steps before you can access your precious tweets. 

Before accessing the tweets, you need to register your twitter account and get their API keys here:


Basically 4 keys are needed:
  1. Token
  2. TokenSecret
  3. ConsumerKey
  4. ConsumerSecret

public string GetTwitterFeed()
        {
            try
            {
                string q = "twitterName";
                string resource_url = "https://api.twitter.com/1.1/statuses/user_timeline.json";

                var oauth_token = ConfigurationManager.AppSettings["twitterAccessToken"];
                var oauth_token_secret = ConfigurationManager.AppSettings["twitterAccessTokenSecret"];
                var oauth_consumer_key = ConfigurationManager.AppSettings["twitterConsumerKey"];
                var oauth_consumer_secret = ConfigurationManager.AppSettings["twitterConsumerSecret"];

                // oauth implementation details
                var oauth_version = "1.0";
                var oauth_signature_method = "HMAC-SHA1";

                // unique request details
                var oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
                var timeSpan = DateTime.UtcNow
                    - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
                var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();


                // create oauth signature
                var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
                                "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&q={6}";

                var baseString = string.Format(baseFormat,
                                            oauth_consumer_key,
                                            oauth_nonce,
                                            oauth_signature_method,
                                            oauth_timestamp,
                                            oauth_token,
                                            oauth_version,
                                            Uri.EscapeDataString(q)
                                            );

                baseString = string.Concat("GET&", Uri.EscapeDataString(resource_url), "&", Uri.EscapeDataString(baseString));

                var compositeKey = string.Concat(Uri.EscapeDataString(oauth_consumer_secret),
                                        "&", Uri.EscapeDataString(oauth_token_secret));

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

                // create the request header
                var headerFormat = "OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", " +
                                   "oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", " +
                                   "oauth_token=\"{4}\", oauth_signature=\"{5}\", " +
                                   "oauth_version=\"{6}\"";

                var authHeader = string.Format(headerFormat,
                                        Uri.EscapeDataString(oauth_nonce),
                                        Uri.EscapeDataString(oauth_signature_method),
                                        Uri.EscapeDataString(oauth_timestamp),
                                        Uri.EscapeDataString(oauth_consumer_key),
                                        Uri.EscapeDataString(oauth_token),
                                        Uri.EscapeDataString(oauth_signature),
                                        Uri.EscapeDataString(oauth_version)
                                );



                ServicePointManager.Expect100Continue = false;

                // make the request
                var postBody = "q=" + Uri.EscapeDataString(q);//
                resource_url += "?" + postBody;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);
                request.Headers.Add("Authorization", authHeader);
                request.Method = "GET";
                request.ContentType = "application/x-www-form-urlencoded";
                var response = (HttpWebResponse)request.GetResponse();
                var reader = new StreamReader(response.GetResponseStream());
                var objText = reader.ReadToEnd();
                //myDiv.InnerHtml = objText;/**/


                JArray jsonDat = JArray.Parse(objText);
                return Convert.ToString(jsonDat[0]["text"]);

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



The code above would fetch only one feed out of the list of feeds obtained.  The code highlighted in the bold text can be changed to fetch more tweets.

No comments: