web-dev-qa-db-fra.com

Authentifiez et demandez la chronologie d'un utilisateur avec Twitter API 1.1 oAuth

Ce matin, j'ai reçu la redoutable erreur "Twitter REST API v1 n'est plus active. Veuillez migrer vers l'API v1.1." Dans quelques-uns de mes sites Web.

Auparavant, j'utilisais javascript/json pour passer ces appels à http://api.Twitter.com/1/statuses/user_timeline.json ? pour afficher une chronologie.

Comme ce n'est plus disponible, je dois adopter le nouveau processus API 1.1.

J'ai besoin de faire ce qui suit en utilisant des objets HttpWebRequest pas une application tierce:

  1. Authentifiez-vous en utilisant oauth clé et secret
  2. Faire un appel authentifié pour reculer pour afficher la chronologie des utilisateurs
48
hutchonoid

Voici ce que j'ai fait pour que cela fonctionne dans un exemple simple.

J'ai dû générer une clé client oAuth et un secret Twitter sur:

https://dev.Twitter.com/apps/new

J'ai d'abord désérialisé l'objet d'authentification pour obtenir le jeton et le taper afin d'authentifier l'appel de la chronologie.

L'appel de la chronologie lit simplement le json car c'est tout ce que je dois faire, vous pouvez le désérialiser vous-même en un objet.

J'ai créé un projet pour cela à: https://github.com/andyhutch77/oAuthTwitterWrapper

Mise à jour - J'ai mis à jour le projet github pour inclure à la fois les démos d'exemples d'application web asp .net et d'application mvc et l'installation de nuget.

// 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; }
}
102
hutchonoid

Création d'une solution JS uniquement pour obtenir des publications Twitter sur votre site sans utiliser de nouvelle API - peut désormais spécifier également le nombre de tweets: http://goo.gl/JinwJ

2
Jason