首页 > 解决方案 > 使用 RestSharp 和 oAuth1.0a 将状态发布到 Twitter 时未经授权的访问

问题描述

编辑:我最初的问题与防火墙问题有关,现在我的问题在我的授权范围内。使用以下两种方法,我都会收到“未经授权”的回复。

我正在尝试创建一种允许我将状态更新发布到 twitter 的方法。我正在尝试在我的应用程序中使用,这样我就可以知道一天中某些事件何时发生,而无需监视日志,所以我认为这将是一种很酷的推送通知的方式。我能想到的唯一其他选择是电子邮件通知,但想尝试不同的东西(对推送通知的任何其他想法持开放态度)

我一天中的大部分时间都在努力让这段代码正常工作。我一直在审查的大多数关于此的示例和问题都很古老。下面是我正在运行的代码。

Response.StatusCode = 0 和 Response.Content 是空白的,我无法弄清楚我在这里做错了什么。没有抛出异常,所以响应必须被执行,但不返回任何东西。

我已按照此处的指南创建签名。 https://developer.twitter.com/en/docs/basics/authentication/oauth-1-0a/creating-a-signature

欢迎任何反馈,我想知道是否有任何明显的我做错了。

一旦我有了解决方案,我希望将它分享出去,一旦它被更多的评论清理干净。

使用下面的代码

Tweet t = new Tweet();
t.TestTweet();

额外的命名空间

using RestSharp;
using System.Security.Cryptography;

班级

class Tweet
    {
        private string myFirstMessage = "First Message Using RestSharp";
        private const string baseTwitterURL = "https://api.twitter.com/1.1/statuses/update.json";

        //Keys in Alphabetical Order
        private string oauth_consumer_key = GlobalVariables.ConsumerKey;
        private string oauth_nonce = "abcd";
        private string oauth_signature;
        private string oauth_signature_method = "HMAC-SHA1";
        private string oauth_timestamp;
        private string oauth_token = GlobalVariables.Token;
        private string oauth_version = "1.0";


        private string ConsumerKeySecret = GlobalVariables.ConsumerKeySecret;
        private string AccessTokenSecret = GlobalVariables.AccessTokenSecret;

        public Tweet()
        {

            DateTime epochUtc = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            var timestamp = (int)((DateTime.UtcNow - epochUtc).TotalSeconds);

            oauth_timestamp = timestamp.ToString();
        }

        public void TestTweet()
        {
            string fullURL = baseTwitterURL + Uri.EscapeDataString(myFirstMessage);

            var client = new RestClient(fullURL);
            var request = new RestRequest(Method.POST);

            string parameterString = GenerateParameterString(oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_token, oauth_version);
            string signatureBaseString = GenerateSignatureBaseString(parameterString);
            string signingKey = GenerateSigningKey();

            HMACSHA1 mySignature = new HMACSHA1();

            oauth_signature = Convert.ToBase64String(mySignature.ComputeHash(new ASCIIEncoding().GetBytes(string.Format("{0}&{1}", signatureBaseString, signingKey))));

            request.AddHeader("authorization", "OAuth");

            request.AddParameter("oauth_consumer_key", oauth_consumer_key);
            request.AddParameter("oauth_nonce", oauth_nonce);
            request.AddParameter("oauth_signature", oauth_signature);
            request.AddParameter("oauth_signature_method", oauth_signature_method);
            request.AddParameter("oauth_timestamp", oauth_timestamp);
            request.AddParameter("oauth_token", oauth_token);
            request.AddParameter("oauth_version", oauth_version);

            string requestString = string.Join(",", request.Parameters.ToList());

            try
            {
                Console.WriteLine("Attemping to send response" + "\n");
                IRestResponse response = client.Execute(request);

            }
            catch (Exception Ex)
            {
                Console.WriteLine("Exception Ex.Message: " + Ex.Message);
                Console.WriteLine("Exception Ex.ToString: " + Ex.ToString());
            }

        }

        public string GenerateParameterString(
            string oauth_consumer_key,
            string oauth_nonce,
            string oauth_signature_method,
            string oauth_timestamp,
            string oauth_token,
            string oauth_version)
        {
            StringBuilder parameterString = new StringBuilder();

            parameterString.Append("include_entities=true&");
            parameterString.Append("oauth_consumer_key=" + Uri.EscapeDataString(oauth_consumer_key) + "&");
            parameterString.Append("oauth_nonce=" + Uri.EscapeDataString(oauth_nonce) + "&");
            parameterString.Append("oauth_signature_method=" + Uri.EscapeDataString(oauth_signature_method) + "&");
            parameterString.Append("oauth_timestamp=" + Uri.EscapeDataString(oauth_timestamp) + "&");
            parameterString.Append("oauth_token=" + Uri.EscapeDataString(oauth_token) + "&");
            parameterString.Append("oauth_version=" + Uri.EscapeDataString(oauth_version) + "&");
            parameterString.Append("status=" + Uri.EscapeDataString(myFirstMessage));


            return parameterString.ToString();
        }

        public string GenerateSignatureBaseString(string parameterString)
        {
            StringBuilder SignatureBaseString = new StringBuilder();

            SignatureBaseString.Append("POST&");
            SignatureBaseString.Append(Uri.EscapeDataString(baseTwitterURL));
            SignatureBaseString.Append("&");
            SignatureBaseString.Append(Uri.EscapeDataString(parameterString));

            return SignatureBaseString.ToString();
        }

        public string GenerateSigningKey()
        {
            StringBuilder SigningKey = new StringBuilder();

            SigningKey.Append(Uri.EscapeDataString(ConsumerKeySecret));
            SigningKey.Append("&");
            SigningKey.Append(Uri.EscapeDataString(AccessTokenSecret));

            return SigningKey.ToString();
        }
    }

编辑:RestSharp OAuth1Authenticator 方法

public void TestTweetWithAuthenticator()
{
    string fullURL = baseTwitterURL;
    var client = new RestClient(fullURL)

    {
        Authenticator = OAuth1Authenticator.ForProtectedResource(oauth_consumer_key, ConsumerKeySecret, oauth_token, AccessTokenSecret)
    };
    var request = new RestRequest(Method.POST);

    request.AddParameter("status", Uri.EscapeDataString(myFirstMessage));

    try
    {
        Console.WriteLine("Attemping to send response" + "\n");
        IRestResponse response = client.Execute(request);
    }
    catch (Exception Ex)
    {

    }

}

标签: c#resttwitterrestsharp

解决方案


推荐阅读