Как опубликовать твит на моем твиттере, используя C # - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь разработать функцию публикации твитов в моей учетной записи Twitter, в приложении MVC.

Для этого я создал приложение в Twitter и уже имею следующее: Consumer APIКлюч, Секретный ключ API потребителя, токен доступа, секрет токена доступа.

В сведениях о приложении URL-адрес веб-сайта 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.

Что я здесь не так делаю.

Кроме того, откуда мы знаем, что сообщение будет отправлено наконкретный аккаунт.Это потому, что я использую ключи API из приложения, созданного с помощью учетных данных Twitter.Но это также позволяет мне создавать другое приложение.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я скопировал ваш код и протестировал его, и он отлично работал.

Я ничего не менял, кроме ключей для использования моей учетной записи (чтобы ответить на ваш вопрос, да, все приложения привязаны к вашей учетной записи в Twitterиспользуется для создания учетной записи разработчика).Если вы хотите, чтобы ваши пользователи писали в Твиттере в их личном кабинете, вам нужно сначала спросить их разрешение: https://developer.twitter.com/en/docs/basics/authentication/overview/oauth.html

Мне удалось получить вашу ошибку в двух случаях:

  • неправильноКлючи: я изменил разрешение без регенерации ключей.
  • неправильные разрешения: я изменил разрешение только для чтения и восстановил ключи.
0 голосов
/ 03 октября 2018

Попробуйте это.

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.");
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...