无法访问受保护Twitter的推文

时间:2014-05-09 11:59:52

标签: c# asp.net-mvc twitter twitter-oauth

我目前在以下课程中遇到问题,即给出了#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();
    }
}

0 个答案:

没有答案