2011-09-16 31 views
0

[Update 2011-09-21 11:19] 我修复了一个导致问题的问题,那就是GMT/GMT +2 我的当地时间是格林尼治标准时间+2,而twitter使用的是格林威治标准时间+ 0/UTC。这导致时间戳越界错误。如何使用API​​函数将照片上传到twitter?状态/ update_with_media

我现在固定的问题,现在所面临的一个问题: 串(96)“{”请求“:”/1 /状态/ update_with_media.json“‘错误’:”无法使用OAuth认证“}”

这是(使用curl)通过Themattharris PHP库产生的请求头:

["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的开发页面复制pastaed我的申请)在那里我也产生了我的私人秘密令牌

[2011-09-21更新〜10:45] 所以我周围使用PHP LIB得到(改写成C++/CLI)和我的C++ lib应该产生完全相同的结果作为PHP库。 (授权标题字符串)。

由于某种原因,我总是得到一个状态:(401)未经授权。 我正在使用System.Net.WebClient发出请求。并使用UploadValues,以及上传值。

如果我使用UploadData或使用WebRequest而不是WebClient,则会出现状态:(500)内部服务器错误。

如果需要的话(但我当然不会给出秘密)

这是什么例如我即basestring和授权字符串看,我可以提供所有的字符串和我产生像头:

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

Authorization: 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为我提供所需的秘密令牌。该库还提供了一种使用新推文更新您的Twitter的方法,但它不支持新的update_with_media调用。

我尝试了几种方法,通过使用WebRequest类和其他方式使用Web客户端(伪C#-code)的一种方法:

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: 我注意到我传递的誓言参数以错误的方式,将尝试和更新的一部分。

+0

我已经用更多和更新的相关信息更新了这个问题。 –

+0

OAuth秘密值不通过互联网发送。它们用于生成签名(以及所有其他查询字符串和/或表单值)。 –

+0

@RickySmith是的,我发现后通过tmhOAuth PHP库的工作;-) –

回答

1

,我没有添加任何文件上传到Twitterizer又是因为它需要WebRequestBuilder类的修改(即增加了OAuth的头和标志要求)来处理多POST请求的原因。我试图对这个类进行几次必要的修改,但每次都会导致库中其他部分不稳定,这主要是由于缺少有关Twitter API如何预期多部分请求被签名的文档。

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

+0

我确实开始改变Twitterizer的代码来实现with_media API。如果我能使事情顺利进行,我会再次回复。 –

+0

对,我所做的只是添加了Multipart - 设置。在PrepareRequest函数中添加一些if(Multipart)和if(!Multipart),并添加一个函数以将后数据作为多部分字节[]。这会导致以下错误:System.dll中发生类型'System.Net.WebException'的第一次机会异常 ----------- RESPONSE ----------- {“request”:“\/1 \/statuses \ /update_with_media.json”,“error”:“无法使用OAuth进行身份验证。”} ----------- END ----- ------ Bah,当我发布一条普通的推文时,它可以正常工作。 : -/ –

+0

对。这几乎肯定意味着OAuth签名生成存在问题。 https://dev.twitter.com/discussions/1059和http://www.oauth.net/将拥有您想要的最无聊格式所需的一切。 –

0

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

提供全部资源。它不使用Twitterizer。它使用this Oauth module来管理身份验证。

+0

我已经解决了这个问题并更改了twitterizer代码,并且Ricky更新了官方Twitterizer,请参阅此处的主题:http://forums.twitterizer.net/viewtopic.php?f=9&t=607 #p2139但感谢您的信息。 –

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) 
}); 

很明显,你可以做得更多。 随时检查文档:https://github.com/linvi/tweetinvi/wiki/Upload

相关问题