我目前在以下课程中遇到问题,即给出了#34; 400(错误请求)"错误。
我试图访问我们受保护的Twitter Feed的推文,据我所知,所需的一切都在那里。希望一副新鲜的眼睛可以提供帮助;所以,如果你能发现任何问题,请告诉我。
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();
}
}