[Обновление 2011-09-21 11:19]
Я исправил одну проблему, которая вызывала проблему, и это было GMT / GMT + 2
Мое местное время в GMT + 2, а твиттер использует GMT + 0 / UTC. Это приводило к ошибке отметки времени вне границ.
Я исправил эту проблему и теперь столкнулся со следующей проблемой:
string (96) "{" request ":" / 1 / statuses / update_with_media.json "," error ":" Не удалось аутентифицироваться с помощью OAuth. "}"
Это заголовок запроса, сгенерированный с помощью PHP-библиотеки Themattharris (с использованием curl):
["request_header"]=>
string(587) "POST /1/statuses/update_with_media.json HTTP/1.1
User-Agent: themattharris' HTTP Client
Host: upload.twitter.com
Accept: */*
Authorization: OAuth oauth_consumer_key="L9AWIB6jvxm3Req1XWHxJA", oauth_nonce="9e41eea04e2dcc2b67784b35c27d8740", oauth_signature="N2Y4YzYwMDg1YjBmZTA1NDgwNDdjOGY3MDI4YjdiNWE3M2E5ZTA5YQ%3D%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1316596483", oauth_token="373846001-bJYH4C47vk34yfIH3XbpvvfZjd2JrIX9OlO5MyO2", oauth_version="1.0"
Content-Length: 10024
Content-Type: multipart/form-data; boundary=----------------------------3ddd9c41c091
"
Я вполне уверен, что использовал правильные секреты (скопировал со страниц dev моего приложения в твиттере). Там же я создал свой личный секретный токен
[Обновление 2011-09-21 ~ 10: 45]
Поэтому я использовал PHP-библиотеку (переписанную на C ++ / CLI), и моя C ++-библиотека теперь дает те же результаты, что и PHP Lib. (Строка заголовка Авторизация).
Почему-то я продолжаю получать статус: (401) Не авторизован.
Я использую System.Net.WebClient, чтобы сделать запрос. И с помощью UploadValues вы можете загрузить значения.
Если я использую что-то вроде UploadData или WebRequest вместо WebClient, я получаю статус: (500) Внутренняя ошибка сервера.
Я могу предоставить все строки и заголовки, которые я генерирую, если это необходимо (но я, конечно, не буду выдавать секреты)
Вот, например, как выглядит моя базовая строка и строка авторизации:
BaseString:
POST & HTTPS% 3A% 2F% 2Fupload.twitter.com% 2F1% 2Fstatuses% 2Fupdate_with_media.json & oauth_consumer_key% 3DL9AWIB6jvxm3Req1XWHxJA% 26oauth_nonce% 3Ddb0ca1f6c926c1d3ae0d9cbb2c349ae2% 26oauth_signature_method% 3DHMAC-SHA1% 26oauth_timestamp% 3D1316538778% 26oauth_token% 3D373846001-bJYH4C47vk34yfIH3XbpvvfZjd2JrIX9OlO5MyO2% 26oauth_version% 3D1.0
Авторизация: OAuth oauth_consumer_key = "L9AWIB6jvxm3Req1XWHxJA",
oauth_nonce = "db0ca1f6c926c1d3ae0d9cbb2c349ae2",
oauth_signature = "OGI4ZDVkYjZjNjA3YWMyZGYxNWYzZDBhNDE0ODcwMzRkMDE4OWZiYQ% 3D% 3D",
oauth_signature_method = "HMAC-SHA1", oauth_timestamp = "1316538778",
oauth_token = "373846001-bJYH4C47vk34yfIH3XbpvvfZjd2JrIX9OlO5MyO2",
oauth_version = "1,0"
Ниже приведен старый текст, который больше не действителен.
Я мог бы быть простым вопросом, но я просто не могу понять это.
Я использую Twitterizer , чтобы получить мне необходимые секретные токены. Эта библиотека также позволяет обновлять ваш твиттер новым твитом, но не поддерживает новый вызов update_with_media.
Я пробовал несколько способов, один из которых с использованием WebRequest, а другой - с использованием WebClient (псевдо-C # -код):
string URL = "https://upload.twitter.com/1/statuses/update_with_media.json?oauth_consumer_secret=[mysecretgoeshere]&oauth_token_secret=[usersecretgoeshere]";
System.Net.ServicePointManager.Expect100Continue = false;
Byte[] fileData = File.ReadAllBytes(pathToFile);
#if useWebRequest
string postString = "status={statusgoeshere}&image[]={Encoding.ASCII.GetString(fileData)}";
Byte[] postData = Encoding.ASCII.GetBytes(postString);
WebRequest wr = WebRequest.Create(URL);
wr.Method = "POST";
wr.ContentType = "multipart/form-data"; //as required by twitter API
wr.ContentLength = postData.Length;
IO.Stream rqstream = wr.GetRequestStream();
rqstream.Write(postData,0,postData.Length);
rqstream.Close();
wr.GetResponse(); //returns status 500 internal server error
#else
WebClient client = new WebClient();
NameValueCollection postData = new NameValueCollection();
postData.Add("status", "{statusgoeshere}");
postData.add("media[]", Encoding.ASCII.GetString(fileData));
client.UploadValues(URL, "POST", postData); //returns status 401 not authorized
#endif
Интересно, что я делаю не так (если я делаю что-то неправильно). Мне кажется, что оба способа верны, но я могу упустить некоторые вещи.
Edit1:
Я заметил, что неправильно передаю параметры присяги, попробую обновить эту часть.