Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Authenticate and request a user's timeline with Twitter API 1.1 oAuth

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:

  1. Authenticate using oauth key and secret
  2. Make an authenticated call to pull back to display users timeline
like image 593
hutchonoid Avatar asked Jun 12 '13 14:06

hutchonoid


People also ask

What is OAuth in Twitter API?

OAuth 1.0a allows an authorized Twitter developer App to access private account information or perform a Twitter action on behalf of a Twitter account.

Does Twitter have oauth2?

OAuth 2.0 Authorization Code Flow with PKCE In other words, developers building applications for people on Twitter will have more control over the information their App requests from its users, so that you only have to ask your end-users for the data and information you need.


2 Answers

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; } } 
like image 65
hutchonoid Avatar answered Oct 07 '22 14:10

hutchonoid


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

like image 37
Jason Avatar answered Oct 07 '22 14:10

Jason