Twitter API:401 on POST,GET工作正常
本文关键字:GET 工作 POST API on Twitter | 更新日期: 2024-10-25 16:30:02
我已经搜索了几天,高低,无法让 POST 到 Twitter API 正常工作。我能够成功获取请求令牌并将其交换为访问令牌,但是当我对状态/更新进行 POST 时,我收到 401 错误。
我已经验证了标题的授权部分与我在使用 Twitter OAuth 工具时收到的内容完全匹配。
我相信我的问题是我将状态添加到 Web 请求正文的方式。网址是只需要 https://api.twitter.com/1/statuses/update.json,还是应该 https://api.twitter.com/1/statuses/update.json?status=MyTweetHere?
我的代码如下:
public string UpdateStatus(string requestMethod, string baseUrl, string consumerKey, string consumerSecret, string accessToken, OAuthRequestType requestType, string status)
{
//baseUrl = https://api.twitter.com/1/statuses/update.json
const string signatureMethod = "HMAC-SHA1";
const string oauthVersion = "1.0";
var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1));
var timestamp = (int)timeSpan.TotalSeconds;
var nonce = CreateNOnce(timestamp, consumerKey, baseUrl, accessToken);
var signature = CreateSignature(requestMethod, baseUrl, consumerKey, consumerSecret, nonce, signatureMethod, timestamp, accessToken, oauthVersion, string.Empty, string.Empty, requestType, status);
var bodyData = "status=" + UrlEncode(status);
var webRequest = (HttpWebRequest)WebRequest.Create(baseUrl);
webRequest.KeepAlive = true;
webRequest.ServicePoint.Expect100Continue = false;
webRequest.Method = requestMethod; //Send in as POST
webRequest.Accept = "*/*";
webRequest.UserAgent = "Renicorp.Social";
webRequest.Headers["Authorization"] = "OAuth " + UrlEncode("oauth_consumer_key") + "='"" + UrlEncode(consumerKey) + "'", " +
UrlEncode("oauth_nonce") + "='"" + UrlEncode(nonce) + "'", " +
UrlEncode("oauth_signature") + "='"" + UrlEncode(signature) + "'", " +
UrlEncode("oauth_signature_method") + "='"" + UrlEncode(signatureMethod) + "'", " +
UrlEncode("oauth_timestamp") + "='"" + UrlEncode(timestamp.ToString()) + "'", " +
UrlEncode("oauth_token") + "='"" + UrlEncode(accessToken) + "'", " +
UrlEncode("oauth_version") + "='"" + UrlEncode(oauthVersion) + "'"";
string postData = bodyData;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = byteArray.Length;
using (Stream dataStream = webRequest.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
}
//Make the web call and return the response
WebResponse response = webRequest.GetResponse();
var responseBody = string.Empty;
Stream stream = response.GetResponseStream();
if (stream != null) responseBody = new StreamReader(stream).ReadToEnd();
return responseBody;
}
更新:我现在编写了一个方法来对 account/verify_credentials.json 执行 GET,并且如果我使用我的应用程序帐户密钥,则能够验证帐户凭据,但是当我尝试使用单独的帐户并提供访问令牌时,我得到 401。
所以我的问题是创建签名密钥时的密钥。我在推特上对我的应用程序中的密钥进行了硬编码。这就是为什么我的标头始终匹配的原因,但是当我使用链接的用户帐户运行测试时,请求不会通过。这个故事的寓意是不要对密钥进行硬编码。我一直在想密钥是干什么用的。现在我知道了。
此外,要使用的网址只是基本网址:https://api.twitter.com/1/statuses/update.json。无需添加网址参数。最后,在创建http请求正文时,它只是"status=UrlEncode(tweetToBeMade)"。