2013-06-12 7 views
46

Heute morgen habe ich die gefürchtete 'Die Twitter REST API v1 ist nicht mehr aktiv. Bitte migrieren Sie zu API v1.1. ' Fehler in ein paar meiner Websites.Zeitachse eines Benutzers mit Twitter API 1.1 authentifizieren und anfordern oAuth

Zuvor habe ich Javascript/Json verwendet, um diese Anrufe an http://api.twitter.com/1/statuses/user_timeline.json zu tätigen? um eine Zeitleiste anzuzeigen.

Da dies nicht mehr verfügbar ist, muss ich den neuen 1.1 API-Prozess übernehmen.

Ich muss folgendes tun mit HttpWebRequest-Objekte nicht ein 3rd-Party-Anwendung:

  1. Authentifizieren mit oauth Schlüssel und geheimen
  2. einen authentifizierten Anruf zurück zu ziehen Benutzer anzuzeigen Timeline
+0

sind Sie Mvc verwenden? –

+0

Eine Mischung, ich habe traditionelle und mvc. – hutchonoid

+0

Haben Sie gesehen ** [this] (http://stackoverflow.com/questions/12479575/how-to-generate-oauth-signature-with-c-sharp-for-twitter-api-1-1) ** ? Es gibt auch eine Liste von Drittanbieter-Bibliotheken auf der Twitter-Dev-Seite - es gibt ein paar C# -Einträge. – Jimbo

Antwort

100

Hier ist, was ich getan habe, um dies in einem einfachen Beispiel zu arbeiten.

Ich hatte einen OAuth-Consumer-Schlüssel und Geheimnis von Twitter erzeugen unter:

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

ich das Authentifikationsobjekt deserialisiert zuerst das Token zu erhalten und wieder in Ordnung geben Sie den Timeline-Aufruf zu authentifizieren.

Der Timeline-Aufruf liest einfach den JSON, da dies alles ist, was ich tun muss, Sie möchten es vielleicht selbst in ein Objekt deserialisieren.

Ich habe ein Projekt für diese aufgestellt: https://github.com/andyhutch77/oAuthTwitterWrapper

aktualisieren - Ich habe das GitHub Projekt aktualisiert beide asp .net Web app & Mvc app Beispiel Demos aufzunehmen und nuget zu installieren.

// 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; } 
} 
+9

Sie sollten dies in eine Klasse schieben und es auf github setzen, damit andere es benutzen können;) – Jimbo

+1

Tausend Dank für das Teilen - es hat mir wirklich geholfen schnell wieder aufzustehen! Ein Vorschlag mit Ihrer Lösung wäre, dass Parameter entweder über den Konstruktor an das OAuthTwitterWrapper-Objekt übergeben werden oder indem die Eigenschaften öffentlich gemacht werden. In meinem Fall wollte ich in der Lage sein, die Anzahl der Tweets zu variieren, die je nach dem auf der Seite verfügbaren Immobilien angezeigt werden. Trotzdem eine nette Lösung und danke! –

+0

Kein Problem, es ist gut zu sehen, dass es benutzt wird. Ich werde diese Änderungen zu dem von Ihnen vorgeschlagenen Projekt hinzufügen. Danke vielmals. – hutchonoid

2

eine JS einzige Lösung Erstellt Twitter-Einträge auf Ihrer Website zu erhalten, ohne neue API - kann nun Anzahl von Tweets angeben zu: http://goo.gl/JinwJ