2012-11-25 40 views
0

我使用下面的代碼嘗試獲取oauth_token和oauth_secret。request_oauth使用微博(C#)

 string url = "https://api.twitter.com/oauth/request_token"; 
     string base_format = "oauth_callback={0}&oauth_consumer_key={1}&oauth_nonce={2}&oauth_signature_method={3}&oauth_timestamp={4}&oauth_version={5}"; 
     string base_string = String.Format(base_format, oauth_callback, oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_version); 
     base_string = String.Concat("POST&", Uri.EscapeDataString(url), Uri.EscapeDataString(base_string)); 

     var compositeKey = string.Concat(Uri.EscapeDataString(oauth_consumer_secret), 
        "&"); 

     string oauth_signature; 
     using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))) 
     { 
      oauth_signature = Convert.ToBase64String(
       hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(base_string))); 
     } 
     string header_format = "OAuth oauth_nonce=\"{0}\", oauth_callback=\"{1}\", oauth_signature_method=\"{2}\", oauth_timestamp=\"{3}\", oauth_consumer_key=\"{4}\", oauth_signature=\"{5}\", oauth_version=\"{6}\""; 
     string header = string.Format(header_format, Uri.EscapeDataString(oauth_nonce), Uri.EscapeDataString(oauth_callback), Uri.EscapeDataString(oauth_signature_method), Uri.EscapeDataString(oauth_timestamp), Uri.EscapeDataString(oauth_consumer_key), Uri.EscapeDataString(oauth_signature), Uri.EscapeDataString(oauth_version)); 

     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
     req.Headers.Add("Authorization", header); 
     req.Method = "POST"; 
     req.ContentType = "application/x-www-form-urlencoded"; 

     WebResponse response = req.GetResponse(); 

和它返回給我一個401.我沒有看到這裏有什麼錯。需要幫助。

+0

你沒有請求籤名。您需要加密您發送的信息並將其作爲簽名加入。這段代碼對於你想要完成的事情來說很簡單。以這種方式手工操作會讓你的生活變得很頭疼,儘管有時需要自己寫。你可以在這裏找到更多關於簽名的信息http://oauth.net/core/1.0/#signing_process – Tony

+0

謝謝你,我成功了。代碼有幾個格式問題。 –

回答

0

這會讓你的生活變得如此簡單。我之前使用過它,它處理所有事情。 http://www.twitterizer.net

+0

對不起,我的項目不能使用任何第三方庫 –

0

您需要將OAuthTokenSecret添加到您的組合密鑰中。

工作實例

public string UpdateStatus(string status) 
{ 
    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 oauth_timestamp = Convert.ToInt64(
     (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)) 
      .TotalSeconds).ToString(); 

    var resource_url = "https://api.twitter.com/1.1/statuses/update.json"; 

    // create oauth signature 
    var baseString = string.Format(
     "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}&" + 
     "oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}", 
     config.OAuthConsumerKey, 
     oauth_nonce, 
     oauth_signature_method, 
     oauth_timestamp, 
     config.OAuthToken, 
     oauth_version, 
     Uri.EscapeDataString(status)); 


    baseString = string.Concat("POST&", Uri.EscapeDataString(resource_url), "&", Uri.EscapeDataString(baseString)); 

    var compositeKey = string.Concat(Uri.EscapeDataString(config.OAuthConsumerSecret), 
    "&", Uri.EscapeDataString(config.OAuthTokenSecret)); 

    string oauth_signature; 
    using (var hasher = new HMACSHA1(Encoding.ASCII.GetBytes(compositeKey))) 
    { 
     oauth_signature = Convert.ToBase64String(hasher.ComputeHash(Encoding.ASCII.GetBytes(baseString))); 
    } 

    // create the request header 
    var authHeader = string.Format(
     "OAuth oauth_consumer_key=\"{0}\", oauth_nonce=\"{1}\"," + 
     " oauth_signature=\"{2}\", oauth_signature_method=\"{3}\", " + 
     "oauth_timestamp=\"{4}\", oauth_token=\"{5}\", " + 
     "oauth_version=\"{6}\"", 
     Uri.EscapeDataString(config.OAuthConsumerKey), 
     Uri.EscapeDataString(oauth_nonce), 
     Uri.EscapeDataString(oauth_signature), 
     Uri.EscapeDataString(oauth_signature_method), 
     Uri.EscapeDataString(oauth_timestamp), 
     Uri.EscapeDataString(config.OAuthToken), 
     Uri.EscapeDataString(oauth_version) 
    ); 


    var postBody = "status=" + Uri.EscapeDataString(status); 
    ServicePointManager.Expect100Continue = false; 

    try 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url); 
     request.Headers.Add("Authorization", authHeader); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     using (Stream stream = request.GetRequestStream()) 
     { 
      byte[] content = Encoding.ASCII.GetBytes(postBody); 
      stream.Write(content, 0, content.Length); 
     } 

     WebResponse response = request.GetResponse(); 
     Stream reqStream = response.GetResponseStream(); 
     StreamReader reqStreamReader = new StreamReader(reqStream); 
     return reqStreamReader.ReadToEnd(); 
    } 
    catch (Exception ex) 
    { 
     return ex + ":\n" + ex.Message; 
    } 
}