Twitter API и DotNetOpenAuth и HttpClient: Ошибка Не удалось аутентифицировать вас

Я пытаюсь опубликовать обновление статуса в Твиттере, и у меня просто не получается.

var consumer = new TwitterConsumer(); // WebConsumer implementation
var httpClient = new HttpClient(consumer.CreateAuthorizingHandler("THE_TOKEN", new HttpClientHandler()));

var content = new FormUrlEncodedContent(new Dictionary<string, string>
{
     {"status", "test"}
});

// yes, yes, ugly code, only testing here
var s = httpClient.PostAsync("https://api.twitter.com/1.1/statuses/update.json", content);
var t = s.Result;
var u = t.Content.ReadAsStringAsync().Result; // HTTP 401, response from Twitter is {"errors":[{"message":"Could not authenticate you","code":32}]}

Конечно, изначально я думал, что есть какие-то проблемы с моими токенами авторизации или процессом OAuth, но все остальное работает нормально:

Аутентификация OAuth работает, потому что я могу получить доступ к другим методам API, таким как https://api.twitter.com/1.1/account/settings.json.

Я даже могу публиковать обновления статуса при отправке status через URI, например POST https://api.twitter.com/1.1/statuses/update.json?status=test. Я получаю ошибку только тогда, когда пытаюсь поместить status в тело запроса.

По словам Google, у многих людей есть подобные проблемы, к сожалению, предложенные решения (например, двойная проверка URL-кодировки или content-Request-Header) не работают для меня (запрос выглядит так, как должен в Fiddler).


person Hannes Sachsenhofer    schedule 02.12.2013    source источник
comment
api.twitter.com/1.1/statuses/update.json принимает метод POST только, поэтому я не уверен, что вы можете отправлять обновления статуса с помощью метода GET.   -  person vzamanillo    schedule 11.12.2013
comment
Сравните заголовок HTTP-запроса авторизации из метода API account/settings.json с заголовком HTTP-запроса авторизации из statuses/update.json и проверьте наличие oauth_consumer_key, oauth_signature_method, oauth_nonce, oauth_token, oauth_signature, также проверьте заголовок Content-Type, это может помочь вы находите проблему.   -  person vzamanillo    schedule 11.12.2013
comment
vzamanillo, метод GET точно работает. Я не думаю, что моя проблема связана с аутентификацией OAuth, потому что любой другой метод, который я пробовал в API, работает нормально. Только не размещение нового статуса.   -  person Hannes Sachsenhofer    schedule 11.12.2013
comment
dev.twitter.com/docs/api/1.1/post/statuses/ update, если вы попытаетесь использовать GET, вы получите сообщение об ошибке. Какую версию апи вы используете?   -  person vzamanillo    schedule 11.12.2013
comment
Извините, я ошибся :( Я перепроверил, и действительно, я использовал POST-запрос, но добавил параметр status в URL, а не в тело. Поэтому я использовал POST-запрос, но параметр GET - я обновлю мой вопрос соответственно Извинения за путаницу.   -  person Hannes Sachsenhofer    schedule 12.12.2013
comment
Затем посмотрите на мой первый комментарий и проверьте заголовки и тип содержимого запроса.   -  person vzamanillo    schedule 12.12.2013


Ответы (1)


Строго говоря, это не ответ на ваш вопрос, но это может решить вашу проблему.

Я предлагаю вам взглянуть на linq2twitter. Это действительно хороший C# API для Twitter.

Вы можете либо посмотреть (это с открытым исходным кодом), как они реализовали запросы на подпись, чтобы найти проблему с вашим кодом, либо на самом деле использовать его, а не возиться с созданием/подписанием запросов и анализом ответов (использовал его в одном из моих прошлых проектов, отлично работает , предоставляет удобный API).

См. здесь, например статус публикации. обновление и обязательно прочитайте этот раздел документации, чтобы понять, как правильно настроить аутентификацию (TwitterContext) в вашем сценарии.

Надеюсь, это поможет.

person Eugene Loy    schedule 09.12.2013