Как загрузить фотографию в твиттер с помощью функции API POST statuses / update_with_media - PullRequest
0 голосов
/ 16 сентября 2011

[Обновление 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: Я заметил, что неправильно передаю параметры присяги, попробую обновить эту часть.

Ответы [ 4 ]

1 голос
/ 08 марта 2016

На всякий случай, если кто-то все еще пытается загрузить в Twitter.Я являюсь основным разработчиком Tweetinvi, который может загружать файлы уже более 6 месяцев.

Не стесняйтесь взглянуть на это:

Примеры:

// 1 line to upload and publish
var tweet = Tweet.PublishTweetWithVideo("my tweet", File.ReadAllBytes("filepath"));

// OR WITH ADDITIONAL PARAMETERS
var uploadedVideo = Upload.UploadVideo(File.ReadAllBytes("filepath"));
tweet = Tweet.PublishTweet("my tweet", new PublishTweetOptionalParameters
{
    Medias = new List<IMedia> { uploadedVideo },
    Coordinates = new Coordinates(42, 42)
});

Очевидно, что вы можете сделать больше.Не стесняйтесь проверять документацию: https://github.com/linvi/tweetinvi/wiki/Upload.

1 голос
/ 29 сентября 2011

Причина, по которой я еще не добавил ни одной загрузки файлов в Twitterizer, заключается в том, что для обработки многокомпонентных POST-запросов требуется изменение класса WebRequestBuilder (который добавляет заголовок OAuth и подписывает запросы).Я несколько раз пытался внести необходимые изменения в этот класс, но каждый раз они приводили к нестабильности в остальной части библиотеки, в основном из-за отсутствия документации о том, как API-интерфейс Twitter ожидает, что многокомпонентные запросы будут подписаны.

Однако недавно на портале API Twitter был опубликован документ с подробным описанием этих запросов.Если вы хотите попытаться реализовать эту логику самостоятельно, это будет бесценный ресурс.В противном случае вы можете подождать.В ближайшее время я планирую внести изменения, чтобы должным образом поддерживать загрузку файлов в свете этой информации.

0 голосов
/ 09 декабря 2015

Использование, плагин twehharp Nuget.

using (var stream = new FileStream(imagePath, FileMode.Open))
            {
                var result = service.SendTweetWithMedia(new SendTweetWithMediaOptions
                {
                    Status = message,
                    Images = new Dictionary<string, Stream> { { "john", stream } }
                });
                lblResult.Text = result.Text.ToString();
            }

Полная информация доступна в этой статье

Спасибо

http://www.dotnetfunda.com/articles/show/3196/post-message-with-image-on-twitter-using-csharp

0 голосов
/ 14 октября 2011

Пример TweetIt показывает, как обновлять статус и публиковать изображение через update_with_media.xml, через приложение .NET, написанное на C #.

Полный источник доступен. Он не использует Twitterizer. Он использует этот модуль Oauth для управления аутентификацией.

...