2013-02-24 98 views
4

我在使用GET狀態/ user_timeline和OAuth時遇到了麻煩。通過API 1.1使用Twitter OAuth,無需第三方庫

我是新來的推特&編程。我在文檔中看到的大多數幫助都是針對POST。

早些時候,我是用:http://api.twitter.com/1/statuses/user_timeline.json?screen_name=userid

現在根據新的API,我試圖使用方法:https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=userid。 但我得到「遠程服務器返回錯誤:(400)錯誤請求」。

我在dev.twitter.com上發了一個應用程序。我也設法生成了一個簽名。現在我不知道如何發佈簽名並獲得輸出。我使用C#Web表單.net 3.5。我不能使用像twitterizer這樣的第三方庫。

我跟着Get twitter public timeline, json+C#, no 3rd party libraries的線程和兩個跟進線程。出事了。我假設它與API 1.1有關。

回答

7

在這裏你去(改變「更新我」一節):

 // oauth application keys 
     var oauth_token = "update me"; 
     var oauth_token_secret = "update me"; 
     var oauth_consumer_key = "update me"; 
     var oauth_consumer_secret = "update me"; 

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

     // message api details 
     var status = "Updating status via REST API if this works"; 
     var resource_url = "https://api.twitter.com/1.1/statuses/user_timeline.json"; 
     var screen_name = "updateme"; 
     // create oauth signature 
     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, 
            Uri.EscapeDataString(screen_name) 
            ); 

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

     // create the request header 
     var 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}\""; 

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


     // make the request 

     ServicePointManager.Expect100Continue = false; 

     var postBody = "screen_name=" + Uri.EscapeDataString(screen_name);// 
     resource_url += "?" + postBody; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url); 
     request.Headers.Add("Authorization", authHeader); 
     request.Method = "GET"; 
     request.ContentType = "application/x-www-form-urlencoded"; 


     WebResponse response = request.GetResponse(); 
     string responseData = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
+0

這是否適用於POST和流API?我已經使用這個,並繼續獲得401未經授權。 – 2013-04-03 17:39:13

3

我剛纔遇到類似的問題這一點,但在

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

解決它以不同的方式我創建了一個GitHub項目https://github.com/andyhutch77/oAuthTwitterTimeline

+1

非常感謝您的git項目。但是,在與其他人的例子一起嘗試時,我遇到了很多麻煩,不過您非常感謝。 – John 2014-04-10 15:05:18

+0

@John感謝您的反饋,我需要更新它。我很快就會盡快解決它。我已經添加了發送/重新推特等功能。:) – hutchonoid 2014-04-11 07:54:46

+0

如果您正在尋找改進方法,我們將在Xamarin項目中使用它,但是像System.Web這樣的一些引用無法轉換爲android環境。我認爲HttpClient是兼容的。我不知道你是否對這種事感興趣;) – John 2014-04-15 06:54:04