C#TweetSharp不发送推文

时间:2016-09-02 16:37:04

标签: c# twitter tweetsharp

我正在使用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 个答案:

答案 0 :(得分:3)

最后解决了这个问题并且效果很好。根据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();
    }                                      
}

答案 1 :(得分:1)

我不相信你可以发送推文只是一个消费者,推文必须是&#34;拥有&#34;通过用户帐户。您需要注册一个Twitter帐户,然后执行完整的oauth身份验证过程以获取访问令牌(除了使用者令牌),然后使用这两个令牌重新授权TweetSharp服务。

上面的代码几乎到达那里(我认为)。在Process.start调用之后,需要使用逻辑来使用浏览器中返回的验证程序(用户登录后显示的数字)来完成身份验证过程并充当该用户。目前,您的代码已经完成了该过程的一半但未完成,因此当您尝试发推文时,您的TweetSharp服务仅作为应用而不是用户进行身份验证。

originalTweetSharp readme.md确实包含了缺少的代码。步骤3需要登录后在浏览器中返回的实际验证程序:

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

string verifier =&#34; 123456&#34 ;; //&lt; - 这是您的用户输入您的应用程序

OAuthAccessToken access = service.GetAccessToken(requestToken,verifier);

//步骤4 - 用户使用访问令牌进行身份验证 service.AuthenticateWith(access.Token,access.TokenSecret);

//现在你的推文电话应该在这里工作。

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

答案 2 :(得分:0)

我以前从事过这个主题。在发送推文之前,您必须具有开发者帐户,因为您需要令牌和密钥。这是我的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);
        }

    }