Próbuję stworzyć prostą aplikację do interakcji z Tumblr przy użyciu API v2. Jestem w stanie przejść przez każdy krok w przepływie OAuth (dzięki dokumentacji na Twitterze) i uzyskać autoryzowany i uwierzytelniony token i sekret. Ale jeśli chodzi o publikowanie, dostaję 401 nieautoryzowany błąd. Jest to istotny fragment kodu:Publikowanie na Tumblrze przy użyciu oAuth i 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);
}
}
Funkcja jest wywoływana po kliknięciu na przycisk i uzyskać tekst ciała z pola tekstowego. Część podpisu jest poprawna, ponieważ została przetestowana z innymi usługami (Twitter itp.) I nadal zapewnia prawidłowe podpisy dla samego Tumblr. Nagłówek autoryzacji jest prawie taki sam, jakiego użyłem do zażądania tokena i autoryzacji go, a łańcuch podstawowy zawiera tylko typ treści (tekst w tym przypadku) i treść, oprócz standardowych parametrów oauth_ *. Sprawdziłem również kod za pomocą narzędzi dostępnych na hueniverse.com, ale wciąż nic.
Prawdopodobnie brakuje mi jakiegoś nagłówka HTTP lub ZAPISZ ZŁE zamówienie. Jakieś pomysły? Dzięki.
Każda zmiana na stałe, jak to? Mam podobny problem. Zyskaj 401 z Tumblr, ale nie wiesz dlaczego. –
Masz ten sam problem ... Czy udało Ci się go naprawić (i jak)? – SimpleVar