2011-09-23 31 views
6

Tôi đang cố gắng phát triển một ứng dụng đơn giản để tương tác với Tumblr bằng cách sử dụng các API v2. Tôi có thể đi qua từng bước trong luồng oAuth (nhờ tài liệu được tìm thấy trên Twitter) và nhận được mã thông báo và bí mật được ủy quyền và xác thực. Nhưng khi nói đến đăng bài, tôi nhận được một lỗi trái phép 401. Đây là đoạn mã có liên quan:Đăng trên Tumblr bằng oAuth và C#

private void post_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     url = new Uri("http://api.tumblr.com/v2/blog/*myblog*.tumblr.com/post"); 

     Random random = new Random(); 
     nonce = random.Next(1234000, 9999999).ToString(); 

     TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); 
     timestamp = Convert.ToInt64(ts.TotalSeconds).ToString(); 

     string method = "POST"; 

     StringBuilder sb = new StringBuilder(); 
     sb.AppendFormat("{0}&", method); 
     sb.AppendFormat("{0}&", upperCaseUrl(HttpUtility.UrlEncode(url.ToString()))); 
     sb.AppendFormat("body%3D{0}%26", upperCaseUrl(HttpUtility.UrlEncode(textBox.Text))); 
     sb.AppendFormat("oauth_consumer_key%3D{0}%26", consumerKey); 
     sb.AppendFormat("oauth_nonce%3D{0}%26", nonce); 
     sb.AppendFormat("oauth_signature_method%3D{0}%26", "HMAC-SHA1"); 
     sb.AppendFormat("oauth_timestamp%3D{0}%26", timestamp); 
     sb.AppendFormat("oauth_token%3D{0}%26", token); 
     sb.AppendFormat("oauth_version%3D{0}%26", "1.0"); 
     sb.AppendFormat("type%3D{0}", "text"); 

     System.Diagnostics.Debug.WriteLine(sb.ToString()); 

     string signingKey = consumerSecret + '&' + secret; 

     HMACSHA1 signing = new HMACSHA1(Encoding.ASCII.GetBytes(signingKey)); 
     byte[] bytearray = Encoding.ASCII.GetBytes(sb.ToString()); 
     MemoryStream stream = new MemoryStream(bytearray); 
     signature = Convert.ToBase64String(signing.ComputeHash(stream)); 

     ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

     StringBuilder header = new StringBuilder(); 
     header.Append("OAuth "); 
     header.AppendFormat("oauth_consumer_key=\"{0}\", ", consumerKey); 
     header.AppendFormat("oauth_token=\"{0}\", ", token); 
     header.AppendFormat("oauth_nonce=\"{0}\", ", nonce); 
     header.AppendFormat("oauth_timestamp=\"{0}\", ", timestamp); 
     header.AppendFormat("oauth_signature_method=\"{0}\", ", "HMAC-SHA1"); 
     header.AppendFormat("oauth_version=\"{0}\", ", "1.0"); 
     header.AppendFormat("oauth_signature=\"{0}\"", upperCaseUrl(HttpUtility.UrlEncode(signature))); 

     System.Diagnostics.Debug.WriteLine(header.ToString()); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

     request.Method = WebRequestMethods.Http.Post; 

     request.Headers.Add("Authorization", header.ToString()); 

     try 
     { 
      HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
      StreamReader reader = new StreamReader(response.GetResponseStream()); 

      if (reader.ReadToEnd() == "201: Created") 
      { 
       control.Invoke((MethodInvoker)delegate 
       { 
        statusText.Text = "Post successfully sent!"; 
       }); 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex.Message); 
     } 
    } 

Chức năng này được gọi khi nhấp vào nút và lấy nội dung từ hộp văn bản. Phần ký tên là chính xác vì nó đã được thử nghiệm với các dịch vụ khác (Twitter, vv) và nó vẫn cung cấp các chữ ký hợp lệ cho chính Tumblr. Tiêu đề Cấp phép tương tự như tôi đã sử dụng để yêu cầu mã thông báo và cho phép mã thông báo và chuỗi cơ sở chỉ chứa loại nội dung (văn bản trong trường hợp này) và phần thân, ngoài tham số chuẩn oauth_ *. Tôi cũng đã kiểm tra mã với các công cụ có sẵn trên hueniverse.com, nhưng vẫn không có gì.

Có thể tôi thiếu một số tiêu đề HTTP hoặc tôi đang gửi yêu cầu sai. Bất kỳ ý tưởng? Cảm ơn.

+4

Bất kỳ bản cập nhật vào cách bạn cố định nó? Tôi có một vấn đề tương tự. Giữ lại 401 từ Tumblr, nhưng không chắc tại sao. –

+0

Có cùng một vấn đề ... Bạn đã quản lý để sửa chữa nó (và làm thế nào)? – SimpleVar

Trả lời

0

có một ví dụ đầy đủ trên github có thể giúp bạn ...

https://github.com/jthigpen/TumblrAPI.NET

+5

Điều đó không hữu ích vì nó sử dụng tên người dùng/mật khẩu để ủy quyền, không phải OAuth. –

+0

tôi thấy [link] này (https://www.codeproject.com/Tips/578418/Integrate-Tumblr-into-Csharp-NET-Website) hữu ích. nó chứa một lớp 'Helper', nơi bạn có thể dễ dàng thực hiện Oauth 1.0a và bạn cũng có thể yêu cầu GET và POST để tumblr cho thông tin người dùng. Hy vọng điều này sẽ giúp ai đó –

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