Я загружаю фотографии в TwitPic с помощью OAuth из приложения .NET, написанного на C#.
Материал oAuth немного сложен. Я нашел два фрагмента кода .NET, чтобы справиться с этим, но ни один из них меня не удовлетворил. DotNetOpenAuth оказался довольно тяжелым, больше, чем мне нужно. (Просто хочу делать подписи oAuth и запросы токенов). Код OAuthBase.cs показался мне запутанным и неэлегантным. Мне пришлось передать в методы 6 строковых параметров, и если какой-то из них окажется не по порядку, горе мне.
Поэтому я написал некоторый код, чтобы сделать это самостоятельно, он довольно маленький и, кажется, работает. Он работает для получения «токенов запроса». Он работает, чтобы открыть веб-страницу авторизации и получить «токены доступа». Он также работает для загрузки фотографий в TwitPic.
Все ответы HTTP возвращаются как 200 или 201.
загрузить HTTP-сообщение выглядит следующим образом:
POST http://api.twitpic.com/2/upload.json HTTP/1.1
Content-Type: multipart/form-data; boundary=48cb9a6d-1f1d-432d-b6e3-307e32e8228a
X-Auth-Service-Provider: https://api.twitter.com/1/account/verify_credentials.json
X-Verify-Credentials-Authorization: OAuth realm="http://api.twitter.com/",
oauth_consumer_key="Dv1er93yKzEMn74hZfPmJA",
oauth_nonce="51fi305k",
oauth_signature="4oWcmZcd%2F%2F81JslJ70xFXFm8%2BQs%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1292277715",
oauth_token="59152613-z8EP4GoYS1Mgo3E29JfIqBnyTRlruAJs8Bkvs3q0T",
oauth_version="1.0"
Host: api.twitpic.com
Content-Length: 14605
Expect: 100-continue
Connection: Keep-Alive
--48cb9a6d-1f1d-432d-b6e3-307e32e8228a
Content-Disposition: file; name="media"; filename="CropperCapture[10].jpg"
Content-Type: image/jpeg
....
--48cb9a6d-1f1d-432d-b6e3-307e32e8228a
Content-Disposition: form-data; name="key"
twitpic-api-key-here
--48cb9a6d-1f1d-432d-b6e3-307e32e8228a
Content-Disposition: form-data; name="message"
uploaded from Yappy. (at 12/13/2010 5:01:55 PM)
--48cb9a6d-1f1d-432d-b6e3-307e32e8228a--
Json, который я получаю после загрузки, выглядит следующим образом:
{"id":"3f0jeiw5",
"text":"uploaded from Yappy. (at 12\/13\/2010 5:01:55 PM)",
"url":"http:\\/twitpic.com\/3f0jeiw5",
"width":257,
"height":184,
"size":14156,
"type":"jpg",
"timestamp":"Mon, 13 Dec 2010 22:02:06 +0000",
"user":{
"id":54591561,"screen_name":"bfavre"}
}
Но проблема в том, что после того, как я загрузил изображение на Twitpic, изображение доступно на TwitPic, но связанное с ним сообщение никогда не появляется в Twitter.
Что дает?
Я прочитал в случайный пост в блоге, что использование TwitPic+oAuth требует, чтобы я разместил твит-сообщение в отдельной HTTP-транзакции, прямо в Twitter. Хм? Я думал, что цель oAuth для почты — позволить потребителям делать что-то от моего имени — например, разрешить TwitPic публиковать твиты для меня.
Любые подсказки?
ИЗМЕНИТЬ
Здесь я узнаю немного больше. Это сообщение в блоге от мая 2010 г. предлагает мне использовать значение для X-Auth-Service-Provider
из https://api.twitter.com/1/account/verify_credentials.json
говорит TwitPic вызывать «verify_credentials.json» на twitter.com, когда он получает мой запрос. Если это действительно просто проверка моих учетных данных, это объясняет, почему твиты не публикуются.
В сообщении также предлагается заменить его на https://api.twitter.com/1/status/update.json
должен позволить мне обновлять Twitter через TwitPic с делегированием. Но это дальновидный пост — в нем говорится, что получение этой возможности требует работы со стороны Twitter.
Я еще не нашел примера HTTP-сообщения, которое делает это. Кто-нибудь?
ОБНОВЛЕНИЕ
После преобразования URL-адреса подтверждения в https://api.twitter.com/1/status/update.json
и использования POST для подписи я получаю код ответа 401:
{"errors":
[{"code":401,
"message":"Could not authenticate you (header rejected by twitter)."}]
}
По сути, это та же проблема, которая описана здесь, на форуме разработчиков Twitter. а>. Предположение в конце этой темы заключалось в том, что алгоритм вычисления подписи неверен, но я думаю, что это неправильно, поскольку мой алгоритм подписи работает со всеми другими запросами.