簡體   English   中英

C#Twitter-上傳圖像-沒有第三方庫

[英]C# Twitter - Upload Image - No 3rd party Libraries

我有一個圖書館,我之前寫過,可以將新狀態發布到Twitter。 因此,OAuth標頭等的處理全部正常。

但是,我現在需要使用Twitter REST API上傳圖像:

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

發布狀態時,我通常將以下內容放入請求流'status=<my tweet here>'

理想情況下,我想發布原始圖像數據,而不是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時,我也會得到相同的響應,如Twitter其他頁面中所建議的那樣

我嘗試了將圖像數據添加到webrequest的各種組合,但似乎都失敗了。

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

以及其他我能想到的組合。 嘗試發送Base64版本時,我什至遇到相同的問題(我寧願不這樣做)。

讀完許多其他問題后,我似乎看不到我在做什么錯。

有人可以幫忙嗎?

我發現了問題,所有問題都歸結為請求流中發送的內容。

如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. 將每個數據節連接在一起以發布到流中:

     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); 
  4. 正常將數據寫入請求流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM