0

几天来,我一直在与 Twitter API 搏斗,但我无法将消息发布到经过身份验证的用户的时间线。我有一个 ASP.NET MVC 4 应用程序,它通过 Twitter 登录用户并保存从登录过程返回的访问令牌。那部分工作正常。我可以在经过身份验证的用户的 Twitter 帐户中看到我的应用程序具有读写权限。

然后,我使用该访问令牌以及与我的 Twitter 应用程序关联的消费者密钥、消费者密码和 oauth 令牌密码,将其发布到用户的时间线。我每次都会收到 401 未经授权的错误。我尝试使用 1.1 API 和 1 API 得到相同的结果。

大部分代码来自 Gary Short 的文章:http: //garyshortblog.wordpress.com/2011/02/11/a-twitter-oauth-example-in-c/

这是我到目前为止所得到的。如果有人能发现任何关于我错过了什么的线索,我将不胜感激。

    public async Task<bool> Push(TwitterMessage twitterMessage)
    {
        const string updateApi = "http://api.twitter.com/1/statuses/update.json";
        const string oauthConsumerKey = "<consumerKey>";
        const string consumerSecret = "<consumerSecret>";
        const string oauthSignatureMethod = "HMAC-SHA1";
        const string oauthTokenSecret = "<tokenSecret>";
        var signingKey = string.Format("{0}&{1}", consumerSecret.Escaped(), oauthTokenSecret.Escaped());

        var postBody = "status=" + Uri.EscapeDataString(twitterMessage.MessageContent);
        var oauthNonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
        var oauthToken = "<authenticatedUserToken>";
        var timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
        var oauthTimestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();

        var message = string.Format("POST {0}?{1} HTTP/1.1", updateApi, postBody.Escaped());
        var hasher = new HMACSHA1(new ASCIIEncoding().GetBytes(signingKey));
        var signatureString = Convert.ToBase64String(hasher.ComputeHash(new ASCIIEncoding().GetBytes(message)));

        ServicePointManager.Expect100Continue = false;

        var request = (HttpWebRequest)WebRequest.Create(updateApi);
        request.KeepAlive = false;

        var authorisationBuilder = new StringBuilder();
        authorisationBuilder.Append("OAuth ");
        authorisationBuilder.AppendFormat("oauth_consumer_key=\"{0}\",", oauthConsumerKey.Escaped());
        authorisationBuilder.AppendFormat("oauth_signature_method=\"{0}\",", oauthSignatureMethod.Escaped());
        authorisationBuilder.AppendFormat("oauth_timestamp=\"{0}\",", oauthTimestamp.Escaped());
        authorisationBuilder.AppendFormat("oauth_nonce=\"{0}\",", oauthNonce.Escaped());
        authorisationBuilder.AppendFormat("oauth_token=\"{0}\",", oauthToken.Escaped());
        authorisationBuilder.AppendFormat("oauth_signature=\"{0}\"", signatureString.Escaped());
        var authorisation = authorisationBuilder.ToString();
        request.Headers.Add("Authorization", authorisation);

        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        using (var stream = await request.GetRequestStreamAsync())
        {
            var bodyBytes = new ASCIIEncoding().GetBytes(postBody);
            stream.Write(bodyBytes, 0, bodyBytes.Length);
        }

        //Allow us a reasonable timeout in case Twitter's busy
        request.Timeout = 3 * 60 * 1000;

        try
        {
            var response = await request.GetResponseAsync() as HttpWebResponse;
            return true;
        }
        catch (WebException)
        {
            return false;
        } 
    }

    public static string Escaped(this string input)
    {
        return Uri.EscapeDataString(input);
    }

更新查看这篇SO 帖子,我似乎无法使用 DotNetOpenAuth twitter 客户端进行授权,而我一直在这样做。那里的建议是扩展 twitter 消费者类而不是执行授权,这将允许我检索用户的令牌秘密(我认为我的难题中缺少的部分)。当我得到这个工作时会发布另一个更新。

4

2 回答 2

0

所以问题是目前的 DotNetOpenAuth 问题。对于 Twitter 身份验证,DotNetOpenAuth 客户端不允许完整的授权流程(需要发布到用户的时间线)。仅从初始握手中检索访问令牌,而不是访问令牌秘密。我使用的是与我的 Twitter 应用程序关联的访问令牌密码,而不是登录的 Twitter 用户,因此每次授权都失败。

更新:我终于开始使用Daniel Crenna 的Tweetsharp库,这使得代码比编写我自己的 API 包装器要简单一些:

public async Task<bool> Push(TwitterAccount account)
{
    var twitterService = new TwitterService(consumerKey, consumerSecret);
    twitterService.AuthenticateWith(account.AccessToken, account.AccessTokenSecret);
    var options = new SendTweetOptions {Status = string.Format("{0} {1}", account.Message.MessageContent, account.Message.ShortLink)};
    var status = twitterService.SendTweet(options);
    return status != null;
}
于 2012-12-05T17:03:59.440 回答
0

检查此代码和链接/文章简单易行:

protected void btnTweet_Click(object sender, EventArgs e)
{
 string oauthAccessToken = Session["twtoken"].ToString();
 string oauthAccessTokenSecret = Session["twsecret"].ToString();

 OAuthHelper oauthhelper = new OAuthHelper();
 oauthhelper.TweetOnBehalfOf(oauthAccessToken, oauthAccessTokenSecret, txtTweet.Text);

 if (string.IsNullOrEmpty(oauthhelper.oauth_error))
      Response.Write("Twit Posted Successfully");
 else
      Response.Write(oauthhelper.oauth_error);
}

阅读更多如何获取访问令牌和密钥并下载 OAuthHelper 和 OAuthUtility 类下面是链接 -

如何使用 oauth 身份验证代表用户从 asp.net 发布推文

在 asp.net 中使用 oauth 身份验证使用 twitter 登录并获取访问令牌、屏幕名称和用户 ID

于 2013-06-07T18:29:49.417 回答