代码之家  ›  专栏  ›  技术社区  ›  KJSR

C#TweetSharp不发送推文

  •  2
  • KJSR  · 技术社区  · 8 年前

    我正在使用TweetSharp向用户发送推文(目前正在测试),但它总是返回错误的身份验证数据

    {"errors":[{"code":215,"message":"Bad Authentication data."}]}

    我已经检查了我的应用程序设置,它具有完全的读写权限。我还尝试重新生成我的消费密钥,但仍然没有成功。

    这是我的密码

    public ActionResult AccessToken()
    {
    
         string oauth_consumer_key = "<consumer key>";
         string oauth_consumer_secret = "<consumer secret>";
    
         var service = new TwitterService(oauth_consumer_key, oauth_consumer_secret);
    
         // Now we need the Token and TokenSecret
         OAuthRequestToken requestToken = service.GetRequestToken("http://localhost:37808/");
         string authURL = service.GetAuthorizationUri(requestToken).ToString();
    
         Process.Start(authURL);
    
         SendTweetOptions options = new SendTweetOptions();
         options.Status = "Hello there Twitter";
    
         service.SendTweet(options);
    
         var re = service.Response.Response;
    
         return View();            
        }
    

    我做错什么了吗?

    3 回复  |  直到 8 年前
        1
  •  3
  •   KJSR    8 年前

    最终解决了这个问题,效果很好。基于Yort的评论。

    public ActionResult AccessToken()
    {
            // Step 1 - Retrieve an OAuth Request Token
            TwitterService service = new TwitterService(ConfigurationManager.AppSettings["TwitterConsumerKey"], ConfigurationManager.AppSettings["TwitterConsumerSecret"]);
    
            // This is the registered callback URL
            OAuthRequestToken requestToken = service.GetRequestToken("http://localhost:37808/Twitter/OToken");
    
            // Step 2 - Redirect to the OAuth Authorization URL
            Uri uri = service.GetAuthorizationUri(requestToken);
            return new RedirectResult(uri.ToString(), false /*permanent*/);
            //return View();
    }
    
    public ActionResult OToken()
    {
            return View();
    }
    
    public ActionResult UserInfo(string oauth_token, string oauth_verifier)
    {
    
            var requestToken = new OAuthRequestToken { Token = oauth_token };
    
            // Step 3 - Exchange the Request Token for an Access Token
            TwitterService service = new TwitterService(ConfigurationManager.AppSettings["TwitterConsumerKey"], 
                                                        ConfigurationManager.AppSettings["TwitterConsumerSecret"]);
            OAuthAccessToken accessToken = service.GetAccessToken(requestToken, oauth_verifier);
    
            // Step 4 - User authenticates using the Access Token
            service.AuthenticateWith(accessToken.Token, accessToken.TokenSecret);
            TwitterUser user = service.VerifyCredentials(new VerifyCredentialsOptions());
            ViewBag.Message = string.Format("{0}", user.ScreenName);
    
            // Step 5 - Send Tweet to User TimeLine
            SendTweetOptions options = new SendTweetOptions();
    
            string URL = "file:\\C:\\Users\\<User>\\Desktop\\test.jpg";
            string path = new Uri(URL).LocalPath;        
    
            // Sending with Media
            using (var stream = new FileStream(path, FileMode.Open))
            {
                service.SendTweetWithMedia(new SendTweetWithMediaOptions
                {
                    Status = "<status>",
                    Images = new Dictionary<string, Stream> { { path, stream } }
                });
            }
    
            var responseText = service.Response.StatusCode;
    
            if (responseText.ToString() == "OK")
            {
                ViewBag.Message = "Tweet Successful";
            }
            else
            {
                ViewBag.Message = "Tweet Unsuccessful";
            }            
            return View();
        }                                      
    }
    
        2
  •  1
  •   Yort    8 年前

    我认为你不能仅仅作为消费者发送推文,推文必须由用户帐户“拥有”。您需要注册一个Twitter帐户,然后执行完整的oauth身份验证过程以获取访问令牌(除了消费者令牌之外),然后使用这两个令牌重新授权TweetSharp服务。

    原始TweetSharp自述。md确实包含了缺失的代码位。步骤3需要在登录后在浏览器中返回实际验证器:

    //步骤3-将请求令牌交换为访问令牌

    字符串验证器=“123456”;//<--这是用户输入到应用程序中的信息

    OAuthAccessToken访问=服务。GetAccessToken(requestToken,验证器);

    //现在你的推特通话应该可以在这里工作了。

    看起来您也在服务器上的web应用程序中执行此操作?在这种情况下,您使用的是完全错误的oauth流(我相信)。这一个是为桌面应用程序设计的,因此该调用将启动用户登录的新浏览器进程。我不完全确定web流是如何工作的,因为我从未使用过它,但我相信您需要将用户重定向到您收到的授权url,并且在Twitter上注册的回调应该指向您的站点。我认为有一种状态参数可以通过oauth流传回,这样您就可以实现自己的逻辑,根据会话id或类似的东西从中断的地方拾取数据。

        3
  •  0
  •   user9971024 user9971024    6 年前

    我以前研究过这个课题。在发送tweet之前,您必须拥有开发人员帐户,因为您需要令牌和密钥。这是我的windows服务项目。 我在App.config中编写了令牌和密钥代码

     <appSettings>
    <add key="twitterAccessToken" value="*****"/>
    <add key="twitterAccessTokenSecret" value="*****"/>
    <add key="twitterConsumerKey" value="*****"/>
    <add key="twitterConsumerSecret" value="*****"/>
    

      public static void SendTweet()
        {
            try
            {
                GetPixelImageFile();
    
                string key = ConfigurationSettings.AppSettings.Get("twitterConsumerKey");
                string secret = ConfigurationSettings.AppSettings.Get("twitterConsumerSecret");
                string token = ConfigurationSettings.AppSettings.Get("twitterAccessToken");
                string tokenSecret = ConfigurationSettings.AppSettings.Get("twitterAccessTokenSecret");
    
                string message = "Color, Colorful, Pixel, Art, PixelColouring, Follow";
    
                var service = new TweetSharp.TwitterService(key, secret);
                service.AuthenticateWith(token, tokenSecret);
                using (var stream = new FileStream(@"C:\Images\Pixel.png", FileMode.Open))
                {
                    var result = service.SendTweetWithMedia(new SendTweetWithMediaOptions
                    {
                        Status = message,
                        Images = new Dictionary<string, Stream> { { "john", stream } }
                    });
                    SendMail("SendTweet", (result == null ? "" : result.Text));
                }
            }
            catch (Exception ex)
            {
                SendMail("SendTweet", ex.Message);
            }
    
        }