gpt4 book ai didi

c# - 使用 C# 创建用于搜索的 Twitter 授权 header

转载 作者:太空狗 更新时间:2023-10-29 23:07:17 27 4
gpt4 key购买 nike

我写信是为了编写一个 C# 方法来为 Twitter 生成身份验证 header 。我正在尝试通过此 API 搜索 Twitter:https://api.twitter.com/1.1/search/tweets.json .

这是我调用的 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;
}

我得到的错误是:

{
"errors": [
{
"message": "Bad Authentication data",
"code": 215
}
]
}

有什么指点吗?

我是否需要在生成授权 header 时考虑实际的搜索查询? (例如,我附加到搜索 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靠近点,这似乎是对的。尽管如此,我还是遇到了同样的错误。

最佳答案

将您的“查询”包装在 Uri.EscapeDataString() 中。

如果我这样做,您上面的确切代码对我有用。也就是说,您真的应该转义所有 那些参数键和值,而且我有点困惑为什么 nonce 在没有转义的情况下工作,因为它是 base64 编码的。但也许我只是在测试中很幸运,没有遇到带有斜线的随机数。

关于c# - 使用 C# 创建用于搜索的 Twitter 授权 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25771970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com