【问题标题】:How to post a tweet on my twitter account using C#如何使用 C# 在我的 Twitter 帐户上发布推文
【发布时间】:2019-03-06 06:00:18
【问题描述】:

我正在尝试在 MVC 应用程序中开发一项功能,以便在我的 Twitter 帐户上发布推文。

为此,我在 Twitter 中创建了一个应用程序,因此已经有了以下内容: 消费者 API 密钥、消费者 API 密钥、访问令牌、访问令牌秘密。

App详情中,网址为http://example.com,回调URL字段为空。

权限设置为 - 读取、写入和直接消息。

这是我的代码:

public static void Tweet(string message)
        {
            string twitterURL = "https://api.twitter.com/1.1/statuses/update.json"; 

            string oauth_consumer_key = GlobalConstants.TWConsumerAPIKey;
            string oauth_consumer_secret = GlobalConstants.TWConsumerAPISecretKey;
            string oauth_token = GlobalConstants.TWAccessToken;
            string oauth_token_secret = GlobalConstants.TWAccessTokenSecret;

            // set the oauth version and signature method
            string oauth_version = "1.0";
            string oauth_signature_method = "HMAC-SHA1";

            // create unique request details
            string oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
            System.TimeSpan timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc));
            string oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();

            // create oauth signature
            string baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" + "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}";

            string baseString = string.Format(
                baseFormat,
                oauth_consumer_key,
                oauth_nonce,
                oauth_signature_method,
                oauth_timestamp, oauth_token,
                oauth_version,
                Uri.EscapeDataString(message)
            );

            string oauth_signature = null;
            using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(Uri.EscapeDataString(oauth_consumer_secret) + "&" + Uri.EscapeDataString(oauth_token_secret))))
            {
                oauth_signature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes("POST&" + Uri.EscapeDataString(twitterURL) + "&" + Uri.EscapeDataString(baseString))));
            }

            // create the request header
            string authorizationFormat = "OAuth oauth_consumer_key=\"{0}\", oauth_nonce=\"{1}\", " + "oauth_signature=\"{2}\", oauth_signature_method=\"{3}\", " + "oauth_timestamp=\"{4}\", oauth_token=\"{5}\", " + "oauth_version=\"{6}\"";

            string authorizationHeader = string.Format(
                authorizationFormat,
                Uri.EscapeDataString(oauth_consumer_key),
                Uri.EscapeDataString(oauth_nonce),
                Uri.EscapeDataString(oauth_signature),
                Uri.EscapeDataString(oauth_signature_method),
                Uri.EscapeDataString(oauth_timestamp),
                Uri.EscapeDataString(oauth_token),
                Uri.EscapeDataString(oauth_version)
            );

            HttpWebRequest objHttpWebRequest = (HttpWebRequest)WebRequest.Create(twitterURL);
            objHttpWebRequest.Headers.Add("Authorization", authorizationHeader);
            objHttpWebRequest.Method = "POST";
            objHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
            using (Stream objStream = objHttpWebRequest.GetRequestStream())
            {
                byte[] content = ASCIIEncoding.ASCII.GetBytes("status=" + Uri.EscapeDataString(message));
                objStream.Write(content, 0, content.Length);
            }

            var responseResult = "";

            try
            {
                //success posting
                WebResponse objWebResponse = objHttpWebRequest.GetResponse();
                StreamReader objStreamReader = new StreamReader(objWebResponse.GetResponseStream());
                responseResult = objStreamReader.ReadToEnd().ToString();
            }
            catch (Exception ex)
            {
                responseResult = "Twitter Post Error: " + ex.Message.ToString() + ", authHeader: " + authorizationHeader;
            }
        }

在catch块中,有这个异常:

远程服务器返回错误:(401) Unauthorized.

我在这里做错了什么。

此外,我们如何知道消息将发布到特定帐户。是不是因为我使用的是使用我的 twitter 凭据创建的 APP 中的 API 密钥。但它也允许我创建另一个应用程序。

【问题讨论】:

    标签: c# twitter


    【解决方案1】:

    我复制了您的代码并对其进行了测试,它运行良好。

    除了使用我的帐户的密钥之外,我没有更改任何内容(回答您的问题,是的,所有应用程序都绑定到您用于创建开发帐户的 Twitter 帐户)。如果您希望您的用户在他们的个人帐户上发推文,您必须先征得他们的许可:https://developer.twitter.com/en/docs/basics/authentication/overview/oauth.html

    我设法在两种情况下得到了你的错误:

    • 错误的密钥:我更改了权限而没有重新生成密钥。
    • 权限错误:我将权限更改为只读并重新生成了密钥。

    【讨论】:

      【解决方案2】:

      试试这个。

      var oauth_consumer_key = "gjxG99ZA5jmJoB3FeXWJZA";
                  var oauth_consumer_secret = "rsAAtEhVRrXUTNcwEecXqPyDHaOR4KjOuMkpb8g";
      
                  if (Request["oauth_token"] == null)
                  {
                      OAuthTokenResponse reqToken = OAuthUtility.GetRequestToken(
                          oauth_consumer_key,
                          oauth_consumer_secret,
                          Request.Url.AbsoluteUri);
      
                      Response.Redirect(string.Format("http://twitter.com/oauth/authorize?oauth_token={0}",
                          reqToken.Token));
                  }
                  else
                  {
                      string requestToken = Request["oauth_token"].ToString();
                      string pin = Request["oauth_verifier"].ToString();
      
                      var tokens = OAuthUtility.GetAccessToken(
                          oauth_consumer_key,
                          oauth_consumer_secret,
                          requestToken,
                          pin);
      
                      OAuthTokens accesstoken = new OAuthTokens()
                      {
                          AccessToken = tokens.Token,
                          AccessTokenSecret = tokens.TokenSecret,
                          ConsumerKey = oauth_consumer_key,
                          ConsumerSecret = oauth_consumer_secret
                      };
      
                      TwitterResponse<TwitterStatus> response = TwitterStatus.Update(
                          accesstoken,
                          "Testing!! It works (hopefully).");
      
                      if (response.Result == RequestResult.Success)
                      {
                          Response.Write("we did it!");
                      }
                      else
                      {
                          Response.Write("it's all bad.");
                      }
                  }
      

      【讨论】:

      • 答案应该扩展,解释问题的原因是什么,以及您发布的代码如何修复它。自己编写代码 sn-p 答案并不是好的答案。
      • @AdamHodovanets TwitterResponse 和 TwitterStatus 是什么
      【解决方案3】:

      我遇到了同样的错误。

      然后我发现我正在尝试发布我之前发布的消息。 Twitter 不允许这样做以避免垃圾邮件。我更改了我的消息,然后它没有问题地工作。

      希望这对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-06-13
        • 2012-09-05
        • 1970-01-01
        • 2018-10-02
        • 2014-10-24
        • 2018-02-25
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多