This morning I have received the dreaded ‘The Twitter REST API v1 is no longer active. Please migrate to API v1.1.’ error in a few of my web sites.
Previously I have been using javascript/json to make these calls to http://api.twitter.com/1/statuses/user_timeline.json? to display a timeline.
As this is no longer available I need to adopt the new 1.1 API process.
I need to do the following using HttpWebRequest objects not a 3rd party application:
- Authenticate using oauth key and secret
- Make an authenticated call to pull back to display users timeline
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Here is what I did to get this working in a simple example.
I had to generate an oAuth consumer key and secret from Twitter at:
https://dev.twitter.com/apps/new
I deserialized the authentication object first to get the token and type back in order to authenticate the timeline call.
The timeline call simply reads the json as that is all I need to do, you may want to deserialize it yourself into an object.
I have created a project for this at : https://github.com/andyhutch77/oAuthTwitterWrapper
Update – I have updated the github project to include both asp .net web app & mvc app example demos and nuget install.
// You need to set your own keys and screen name var oAuthConsumerKey = "superSecretKey"; var oAuthConsumerSecret = "superSecretSecret"; var oAuthUrl = "https://api.twitter.com/oauth2/token"; var screenname = "aScreenName"; // Do the Authenticate var authHeaderFormat = "Basic {0}"; var authHeader = string.Format(authHeaderFormat, Convert.ToBase64String(Encoding.UTF8.GetBytes(Uri.EscapeDataString(oAuthConsumerKey) + ":" + Uri.EscapeDataString((oAuthConsumerSecret))) )); var postBody = "grant_type=client_credentials"; HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(oAuthUrl); authRequest.Headers.Add("Authorization", authHeader); authRequest.Method = "POST"; authRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; authRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; using (Stream stream = authRequest.GetRequestStream()) { byte[] content = ASCIIEncoding.ASCII.GetBytes(postBody); stream.Write(content, 0, content.Length); } authRequest.Headers.Add("Accept-Encoding", "gzip"); WebResponse authResponse = authRequest.GetResponse(); // deserialize into an object TwitAuthenticateResponse twitAuthResponse; using (authResponse) { using (var reader = new StreamReader(authResponse.GetResponseStream())) { JavaScriptSerializer js = new JavaScriptSerializer(); var objectText = reader.ReadToEnd(); twitAuthResponse = JsonConvert.DeserializeObject<TwitAuthenticateResponse>(objectText); } } // Do the timeline var timelineFormat = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={0}&include_rts=1&exclude_replies=1&count=5"; var timelineUrl = string.Format(timelineFormat, screenname); HttpWebRequest timeLineRequest = (HttpWebRequest)WebRequest.Create(timelineUrl); var timelineHeaderFormat = "{0} {1}"; timeLineRequest.Headers.Add("Authorization", string.Format(timelineHeaderFormat, twitAuthResponse.token_type, twitAuthResponse.access_token)); timeLineRequest.Method = "Get"; WebResponse timeLineResponse = timeLineRequest.GetResponse(); var timeLineJson = string.Empty; using (timeLineResponse) { using (var reader = new StreamReader(timeLineResponse.GetResponseStream())) { timeLineJson = reader.ReadToEnd(); } } public class TwitAuthenticateResponse { public string token_type { get; set; } public string access_token { get; set; } }
Method 2
Created a JS only solution to get Twitter posts on your site without using new API – can now specify number of tweets too: http://goo.gl/JinwJ
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0