C# 访问受保护twitter的推文时出现问题
我目前在下面的类中遇到了问题,它给出了一个“400(坏请求)”错误 我正在尝试访问我们受保护的推特订阅源的推特,据我所知,所需的一切都在那里。希望一双新鲜的眼睛能帮上忙;如果你能发现任何问题,请告诉我C# 访问受保护twitter的推文时出现问题,c#,asp.net-mvc,twitter,twitter-oauth,C#,Asp.net Mvc,Twitter,Twitter Oauth,我目前在下面的类中遇到了问题,它给出了一个“400(坏请求)”错误 我正在尝试访问我们受保护的推特订阅源的推特,据我所知,所需的一切都在那里。希望一双新鲜的眼睛能帮上忙;如果你能发现任何问题,请告诉我 public class TwitterConnector { //Access credentials for the Retail twitter app: https://apps.twitter.com/app/6147494 //Bloody twitter API!!
public class TwitterConnector
{
//Access credentials for the Retail twitter app: https://apps.twitter.com/app/6147494
//Bloody twitter API!!
const string _oAuthConsumerKey = "";
const string _oAuthConsumerSecret = "";
const string _oAuthAccessToken = "";
const string _oAuthAccessSecret = "";
//returns 32 character string
private static string GenerateNonce(int length)
{
var data = new byte[length];
//create random bytes
new RNGCryptoServiceProvider().GetNonZeroBytes(data);
return Convert.ToBase64String(data);
}
public static WebResponse GetTweetsResponse(string bearerToken)
{
//Timeline URL
var timelineURL = "https://api.twitter.com/1.1/statuses/home_timeline.json";
//OAuth variables
var oAuthVersion = "1.0";
var oAuthSignatureMethod = "HMAC-SHA1";
var oAuthNonce = GenerateNonce(24);
TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var oAuthTimestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();
var tweetsCount = "20";
// Generate OAuth signature. Note that Twitter is very particular about the format of this string. Even reordering the variables
// will cause authentication errors.
var baseFormat = "count={6}&oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
"&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}";
var baseString = string.Format(baseFormat,
_oAuthConsumerKey,
oAuthNonce,
oAuthSignatureMethod,
oAuthTimestamp,
_oAuthAccessToken,
oAuthVersion,
Uri.EscapeDataString(tweetsCount)
);
baseString = string.Concat("GET&", Uri.EscapeDataString(timelineURL), "&", Uri.EscapeDataString(baseString));
// Generate an OAuth signature using the baseString
var compositeKey = string.Concat(Uri.EscapeDataString(_oAuthConsumerSecret), "&", Uri.EscapeDataString(_oAuthAccessSecret));
string oAuthSignature;
using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
{
oAuthSignature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
}
// Now build the Authentication header. Again, Twitter is very particular about the format. Do not reorder variables.
var headerFormat = "OAuth " +
"oauth_consumer_key=\"{0}\", " +
"oauth_nonce=\"{1}\", " +
"oauth_signature=\"{2}\", " +
"oauth_signatureMethod=\"{3}\", " +
"oauth_timestamp=\"{4}\", " +
"oauth_token=\"{5}\", " +
"oauth_version=\"{6}\"";
var authHeader = string.Format(headerFormat,
Uri.EscapeDataString(_oAuthConsumerKey),
Uri.EscapeDataString(oAuthNonce),
Uri.EscapeDataString(oAuthSignature),
Uri.EscapeDataString(oAuthSignatureMethod),
Uri.EscapeDataString(oAuthTimestamp),
Uri.EscapeDataString(_oAuthAccessToken),
Uri.EscapeDataString(oAuthVersion)
);
ServicePointManager.Expect100Continue = false;
var postBody = string.Format("count={0}", Uri.EscapeDataString(tweetsCount));
timelineURL += "?" + postBody;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(timelineURL);
request.Headers.Add("Authorization", authHeader);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
return request.GetResponse();
}
}
在您的真实代码中,您真的拥有使用者和访问密钥/机密吗?您自己实现OAuth而不是使用现有的包装器有什么原因吗?我有。我看过一些现有的库,我只是想了解发生了什么,因为我以前从未使用过OAuth。为了方便起见,我现在可能只看一看现有的OAuth包装器,但如果您或任何阅读本文的人能够更正他们看到的任何错误,我将不胜感激。