将media_ids添加到Twitter API调用会导致身份验证问题

时间:2019-03-08 13:06:59

标签: asp.net twitter twitter-oauth

我有一个简单的网页,可以通过https://api.twitter.com/1.1/statuses/update.json上的Twitter REST API成功创建纯文本推文。我还可以使用https://upload.twitter.com/1.1/media/upload.json将JPG图片上传到Twitter,并成功获取数字class Test { public: std::thread t; Test(std::thread&& rt) : t(std::move(rt)) {} }; int main() { std::vector<Test> tests; { std::thread t([] { std::cout << 1; }); tests.push_back(Test(std::move(t))); } for (Test& mytest : tests) { mytest.t.join(); } } 我不能做的是将这两者放在一起以创建图像鸣叫:如果我添加media_id,它将获得HTTP状态代码401!

我正在使用ASP.NET(我同时具有VB和C#示例),但我希望问题并不特定于该语言。我要更改的推文代码中仅有的两位是建立相同的“ querystring”的地方:

media_id

var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}&media_ids={7}";
var baseString = string.Format(baseFormat, oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_token, oauth_version, Uri.EscapeDataString(TweetText), TwitterMediaID);

所有这些操作实际上是将var postBody = "status=" + Uri.EscapeDataString(TweetText) + "&media_ids=" + TwitterMediaID; using (System.IO.Stream stream = request.GetRequestStream()) { byte[] content = System.Text.ASCIIEncoding.ASCII.GetBytes(postBody); stream.Write(content, 0, content.Length); } 附加到字符串的末尾。我的其余代码不会更改。

我返回的JSON是: &media_ids=1104003004334784512

如果删除{"errors":[{"code":32, "message":"Could not authenticate you."}]},则代码成功(HTTP状态码200,并返回了许多有用的JSON)。

与纯文本推文相比,我认为我不需要任何特殊权限即可创建图像推文。我读过很多博客,提到人们在使用media_ids时出现间歇性的HTTP 401错误,这与身份验证完全无关,但是他们提供的解决方案都不适用于我的站点。

文档显示我的media_id可以使用2个小时,因此,当我的纯文本推文出现在我的Twitter个人资料中时,如何弄乱身份验证方面的内容?

1 个答案:

答案 0 :(得分:1)

Twitter要求API请求使用OAuth 1.0a authentication。一个警告是,必须以非常特定的格式创建HMAC-SHA1签名。

在这种情况下,它要求baseFormat要按字母顺序排序-请参见https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature.html