2013-06-20 8 views
5

Ich habe den folgenden Code schamlos von dev.twitter genommen, um die Zeitlinie von einem bestimmten Benutzer zu erhalten:Warum wird mein Aufruf, die Twitter-Benutzerzeitachse zurückzugeben, "401 Unauthorized" zurückgegeben?

string endpoint = "https://api.twitter.com/1.1/statuses/user_timeline.json"; 

string user_name = "....."; 

string ConsumerKey = "...."; 
string ConsumerSecret = "........"; 
string Token = "......."; 
string TokenSecret = "........"; 

// oauth application keys 
var oauth_token = Token; 
var oauth_token_secret = TokenSecret; 
var oauth_consumer_key = ConsumerKey; 
var oauth_consumer_secret = ConsumerSecret; 

// 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(); 

var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" + 
       "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&screen_name={6}"; 

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

//&include_rts=true &exclude_replies=false 

baseString = string.Concat("GET&", Uri.EscapeDataString(endpoint), "&", 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))); 
} 

string 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}\",screen_name=\"{7}\""; 
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), 
           Uri.EscapeDataString(user_name) 
      ); 

// make the request 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint); 
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(); 

Aber ich bin immer ein 401 Unauthorized Fehler auf dieser Linie:

var response = (HttpWebResponse)request.GetResponse(); 

(wie auch die letzten paar Poster in diesem Twitter-Entwickler-Thread).

Gibt es eine Möglichkeit, schnell zu überprüfen, dass meine verschiedenen Token, Schlüssel und Geheimnisse gültig sind und sollte die Daten, die ich suche, zurückgeben?

Antwort

1

Ich habe eine Testkonsolenanwendung auf GitHub geschaffen, das hier tut:

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

Sehen Sie bitte meine Frage und Antwort, Markup, wenn Sie es von Nutzen finden.

+0

Der Grund, warum dies funktioniert, ist, weil (wie ich begann zu verdächtigen) Sie den Aufruf "diese Anwendungsinstanz autorisieren" (aus Mangel an einem besseren Begriff) machen müssen, bevor Sie den eigentlichen "get timeline" -Aufruf machen. – ChrisF

+0

Nice one. Ich habe deine Frage markiert. – hutchonoid