C#Twitter - 上传图片 - 没有第三方图书馆

时间:2016-06-12 13:00:25

标签: c# twitter

我有一个我刚才写的图书馆,允许我向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版本时,我甚至会遇到同样的问题(我宁愿不这样做)。

在阅读了很多其他问题后,我似乎无法看到我做错了什么。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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. 将每个数据部分连接在一起以发布到流:

    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. 正常将数据写入请求流。