2013-06-20 10 views
5

Mam następujący kod bezwstydnie zaczerpnięte z dev.twitter aby uzyskać linię czasu określonego użytkownika:Dlaczego moje wezwanie do powrotu na oś czasu użytkownika serwisu Twitter zwróciło komunikat "401 Unauthorized."?

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

Jednak Dostaję 401, Nieuprawnione błąd na tej linii:

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

(jak zresztą jest to ostatnia para plakatów na tym wątku dewelopera na Twitterze).

Czy mogę w jakiś sposób sprawdzić, czy moje różne tokeny, klucze i sekrety są prawidłowe i czy powinienem zwrócić te dane, których szukam?

Odpowiedz

1

Stworzyłem aplikację konsoli testowy na GitHub, który robi to tutaj:

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

Proszę zobaczyć moje pytanie i odpowiedź, znaczników, jeśli go znaleźć zastosowania.

+0

Powodem tego działania jest, ponieważ (ponieważ zaczynałem podejrzewać), musisz wykonać wywołanie "autoryzuj tę instancję aplikacji" (z braku lepszego terminu) przed wykonaniem rzeczywistego wywołania "pobierz linię czasu". – ChrisF

+0

Niezły. Podkreśliłem twoje pytanie. – hutchonoid

Powiązane problemy