2016-06-12 15 views
0

私は少し前に書いたライブラリを持っていますので、Twitterに新しいステータスを投稿することができます。したがって、OAuthヘッダーなどの処理はすべて動作しています。ステータスを投稿するとき、私は通常'status=<my tweet here>'C#Twitter - アップロード画像 - サードパーティライブラリがありません

理想的には私がしたい要求ストリームに次のように入れ

https://upload.twitter.com/1.1/media/upload.json 

はしかし、私は今のTwitter REST APIを使用して画像をアップロードする必要がありますBase64文字列ではなく生の画像データを投稿していますが、私はそれらのそれぞれに問題があります。

のTwitterによると、OAuthのは唯一「oauth_」を起動キーから構築しなければならない - 私は、以下のを入れています:

parameters.Add("oauth_consumer_key", consumerKey); 
parameters.Add("oauth_signature_method", "HMAC-SHA1"); 
parameters.Add("oauth_timestamp", Base.Methods.UNIXTimestamp); 
parameters.Add("oauth_nonce", Guid.NewGuid().ToString().Replace("-", "")); 
parameters.Add("oauth_version", "1.0"); 
parameters.Add("oauth_token", token); 

Twitterは疑問があるのコンテンツタイプを使用するときと言いますapplication/octet-stream - これを行うとき、私はの応答を取得:

Code: 38 
Message: Missing Parameter Media 

ツイッター

から他のページで提案されているように multipart/form-dataにコンテンツタイプを設定する際に実際に、私も同じ応答を取得210

私は画像データをwebrequestに追加するさまざまな組み合わせを試みましたが、すべて失敗するようです。

media=<my image byte data here> 
Add header of 'media' with image data in the request 

など多くの組み合わせが考えられます。私はBase64のバージョンを送信しようとしているときにも同じ問題を抱えています。

他の多くの質問を通して読んだことは、私が間違っていることを見ることができないようです。

誰でも手助けできますか?

答えて

0

私はこの問題を発見しました。それはすべて、要求ストリームで送信されるコンテンツになります。

twitterによると、oauth_xxxxのパラメータのみを送信するので、コンテンツベースのものはこのリクエストには必要ありません。

トリックは、マルチパートフォームの構築ですが、私は次のことを行っている:

  1. 私はHttpWebRequestのを使用して、そのマルチパートフォームのヘッダを送信するためにそれを設定しています:

    string boundary = "----" + DateTime.UtcNow.Ticks.ToString("x"); 
    webRequest.ContentType = "multipart/form-data; boundary=" + boundary; 
    
  2. 実際の画像データに接頭辞と接尾辞の両方を有する、

    StringBuilder prefixData = new StringBuilder(); 
    prefixData.Append("--"); 
    prefixData.Append(boundary); 
    prefixData.Append(Environment.NewLine); 
    prefixData.Append("Content-Disposition: form-data; name=\"media\""); 
    prefixData.Append(Environment.NewLine); 
    prefixData.Append(Environment.NewLine); 
    byte[] prefix = Encoding.UTF8.GetBytes(prefixData.ToString()); 
    
    StringBuilder suffixData = new StringBuilder(); 
    suffixData.Append(Environment.NewLine); 
    suffixData.Append("--"); 
    suffixData.Append(boundary); 
    suffixData.Append("--"); 
    byte[] suffix = Encoding.UTF8.GetBytes(suffixData.ToString()); 
    
  3. を送信するコンテンツを構築
  4. ストリームに投稿するために一緒にデータセクションの各参加:

    byte[] data = new byte[prefix.Length + imageData.LongLength + suffix.Length]; 
    Buffer.BlockCopy(prefix, 0, data, 0, prefix.Length); 
    Buffer.BlockCopy(imageData, 0, data, prefix.Length, imageData.Length); 
    Buffer.BlockCopy(suffix, 0, data, prefix.Length + imageData.Length, suffix.Length); 
    
  5. は通常通り要求ストリームにデータを書き込みます。

関連する問題