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