2013-06-20 29 views
5

Tôi có đoạn code sau không biết xấu hổ lấy từ dev.twitter để có được dòng thời gian của một người dùng cụ thể:Tại sao cuộc gọi của tôi nhận được dòng thời gian người dùng Twitter trả về "401 trái phép"?

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

Tuy nhiên, tôi nhận được một 401, lỗi trái phép trên dòng này:

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

(thực ra là vài áp phích cuối cùng trên luồng phát triển Twitter).

Có cách nào tôi có thể nhanh chóng kiểm tra xem các mã thông báo, khóa và bí mật khác nhau của tôi có hợp lệ không và nên trả lại dữ liệu tôi đang tìm kiếm?

Trả lời

1

tôi đã tạo ra một giao diện điều khiển ứng dụng thử nghiệm trên GitHub mà thực hiện điều này ở đây:

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

hãy xem câu hỏi và câu trả lời của tôi, đánh dấu nếu bạn tìm thấy nó sử dụng.

+0

Lý do là vì (khi tôi bắt đầu nghi ngờ) bạn cần thực hiện cuộc gọi "ủy quyền cho ứng dụng này" (muốn có cụm từ tốt hơn) trước khi thực hiện cuộc gọi "nhận thời gian" thực tế. – ChrisF

+0

Đẹp nhất. Tôi đã đánh dấu câu hỏi của bạn. – hutchonoid

Các vấn đề liên quan