我正在写一个C#方法,用于为Twitter生成身份验证标头。我正在尝试通过该API搜索twitter:https://api.twitter.com/1.1/search/tweets.json。
以下是我调用的URL:
这是我的方法:
以下是我调用的URL:
https://api.twitter.com/1.1/search/tweets.json?q=%23countryman+OR+%23johncooperworks+OR+%40mini%26since_id%3d24012619984051000%26max_id%3d250126199840518145%26result_type%3dmixed%26count%3d4
这是我的方法:
private string GetTwitterAuthHeader()
{
const string oauthConsumerKey = "";
const string oauthConsumerSecret = "";
const string oauthToken = "";
const string oauthTokenSecret = "";
const string oauthVersion = "1.0";
const string oauthSignatureMethod = "HMAC-SHA1";
var oauthNonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture)));
var timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var oauthTimestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString(CultureInfo.InvariantCulture);
const string resourceUrl = "https://api.twitter.com/1.1/search/tweets.json";
const string baseFormat = "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,
oauthToken,
oauthVersion
);
baseString = string.Concat("GET&", Uri.EscapeDataString(resourceUrl), "&", Uri.EscapeDataString(baseString));
var compositeKey = string.Concat(Uri.EscapeDataString(oauthConsumerSecret),
"&", Uri.EscapeDataString(oauthTokenSecret));
string oauthSignature;
using (var hasher = new HMACSHA1(Encoding.ASCII.GetBytes(compositeKey)))
{
oauthSignature = Convert.ToBase64String(
hasher.ComputeHash(Encoding.ASCII.GetBytes(baseString)));
}
const string headerFormat = "OAuth oauth_consumer_key=\"{0}\", " +
"oauth_nonce=\"{1}\", " +
"oauth_signature=\"{2}\", " +
"oauth_signature_method=\"{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(oauthToken),
Uri.EscapeDataString(oauthVersion)
);
return authHeader;
}
The error I get is:
{
"errors": [
{
"message": "Bad Authentication data",
"code": 215
}
]
}
有什么提示吗?
在生成授权标头时,我需要考虑实际搜索查询吗?(例如我附加到搜索API的值)?
我发现很难调试。
谢谢!
编辑:
根据反馈,这是一个更新:
var resourceUrl = "https://api.twitter.com/1.1/search/tweets.json";
const string baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
"&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&q={6}";
var baseString = string.Format(baseFormat,
oauthConsumerKey,
oauthNonce,
oauthSignatureMethod,
oauthTimestamp,
oauthToken,
oauthVersion,
query
);
baseString = string.Concat("GET&",
Uri.EscapeDataString(resourceUrl), "&",
Uri.EscapeDataString(baseString));
我仔细阅读了https://dev.twitter.com/oauth/overview/creating-signatures,看起来这个是正确的。然而,我仍然得到相同的错误。
var resourceUrl = string.Format("https://api.twitter.com/1.1/search/tweets.json?q={0}", HttpUtility.UrlEncode(query));
包含传入的参数。但是,它仍然失败了。是其他地方出了问题吗? - Wade