2013-02-24 96 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