如何使用API​​函数POST status / update_with_media将照片上传到twitter

时间:2011-09-16 09:36:22

标签: .net twitter twitter-oauth

[更新2011-09-21 11:19] 我修复了导致问题的一个问题,那就是GMT / GMT + 2 我当地的时间是GMT + 2,Twitter正在使用GMT + 0 / UTC。这导致时间戳超出界限错误。

我现在已经解决了这个问题,现在面临下一个问题:   string(96)“{”request“:”/ 1 / statuses / update_with_media.json“,”error“:”无法通过OAuth进行身份验证。“}”

这是通过Themattharris PHP库生成的请求标头(使用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



"

我很确定我使用了正确的秘密(从我的应用程序的twitter开发页面复制意大利面)我还生成了我的私人秘密令牌

[更新2011-09-21~10:45] 所以我已经使用了一个PHP库(重写为C ++ / CLI),我的C ++库现在产生与PHP Lib完全相同的结果。 (授权标题字符串)。

出于某种原因,我一直处于获得状态:(401)未经授权。 我正在使用System.Net.WebClient来发出请求。并使用UploadValues来上传值。

如果我使用上传数据或使用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 个答案:

答案 0 :(得分:1)

我还没有向Twitterizer添加任何文件上传的原因是因为它需要修改WebRequestBuilder类(添加OAuth标头和签名请求)来处理多部分POST请求。我尝试过几次对这个类进行必要的修改,但每次都会导致库的其余部分出现不稳定,主要原因是缺乏关于Twitter API如何预期多部分请求签名的文档。

然而,最近有一篇文章被发布到详细说明这些请求的Twitter API portal。如果你想尝试自己实现这个逻辑,那将是一个非常宝贵的资源。否则,你可以等。我计划尽快进行修改,以便根据这些信息正确支持文件上传。

答案 1 :(得分:1)

以防万一仍有人试图在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)
});

显然你可以做得更多。 请随意查看文档:{​​{3}}。

答案 2 :(得分:0)

The TweetIt example通过使用C#编写的.NET应用程序显示如何通过update_with_media.xml更新状态和发布图像。

完整资源可用。它不使用Twitterizer。它使用this Oauth module来管理身份验证。

答案 3 :(得分:0)

使用,tweetsharp 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