使用C#为搜索创建Twitter授权标头

Wad*_*ade 5 c# twitter

我正在写一个C#方法来为Twitter生成一个认证头.我正在尝试通过此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
Run Code Online (Sandbox Code Playgroud)

这是我的方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

{
    "errors": [
        {
            "message": "Bad Authentication data",
            "code": 215
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

有什么指针吗?

生成auth标头时是否需要考虑实际的搜索查询?(例如我附加到搜索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));
Run Code Online (Sandbox Code Playgroud)

阅读https://dev.twitter.com/oauth/overview/creating-signatures更接近,这似乎是正确的.不过,我得到了同样的错误.

use*_*559 4

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

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

  • 就是这样!天哪,令人惊奇的是,这些小事竟然阻碍了我们。谢谢您的帮助。如果有人感兴趣,结果如下:https://github.com/wadewegner/TwitterOAuthRESTAPI/tree/master/src (4认同)