【问题标题】:Post twitter update with Twitterizer使用 Twitterizer 发布 Twitter 更新
【发布时间】:2011-05-23 00:33:54
【问题描述】:

我有这段代码:

    var settings = WebConfigurationManager.AppSettings;
    var consumerKey = settings["Twitter.ConsumerKey"];
    var consumerSecret = settings["Twitter.ConsumerSecret"];
    var authToken = settings["Twitter.OAuthToken"];
    var authVerifier = settings["Twitter.OAuthVerifier"];

    //var accessToken = GetAccessToken(
    //    consumerKey, consumerSecret, authToken, string.Empty);

    var tokens = new OAuthTokens()
    {
        AccessToken = authToken,
        AccessTokenSecret = authVerifier,
        ConsumerKey = consumerKey,
        ConsumerSecret = consumerSecret
    };

    TwitterStatus.Update(tokens, txtComment.Text);

我需要它来更新我的推特状态。不幸的是,它不起作用。当我最初登录到 twitter 以授予应用程序访问权限时,它只工作了一次。然后我存储了 authToken 和 authVerifier,以便我可以将它们重用于未来的更新。

知道有什么问题吗?

更新:我刚刚将代码更改为:

        TwitterResponse<TwitterStatus> tweetResponse = TwitterStatus.Update(tokens, txtComment.Text);
    if (tweetResponse.Result == RequestResult.Success)
        lblMessage.Text = "Twitter status successfully posted.";
    else
        lblMessage.Text = string.Format("Twitter status update failed with Error: '{0}'",
            tweetResponse.ErrorMessage);

我收到一条错误消息:“无效/过期令牌”

【问题讨论】:

  • 你说它不起作用,但没有告诉我们它正在在做什么。
  • 它什么都不做。状态信息没有变化,也没有抛出异常。

标签: c# twitter twitter-oauth


【解决方案1】:

您存储了错误的值。需要使用 OAuthUtility.GetAccessToken(...) 快速将 authToken 和验证者值交换为访问令牌。从该方法返回的访问令牌应该被存储并提供给 Twitterizer。

-瑞奇
Twitterizer 作者

【讨论】:

  • 嗨瑞奇,感谢您的回复。不幸的是,当我尝试拨打 GetAccessToken 时,我收到 401 错误,即使该应用程序已被授权访问我的帐户。有什么想法吗?
  • 您必须在短时间内完成该过程:1)获取请求令牌。 2) 发送用户在 twitter.com 上授权您的应用程序 3) 将请求令牌交换为访问令牌。获得访问令牌后,将其存储。除非用户撤销访问权限,否则您不必再次执行该过程。请求令牌会在几分钟后过期,因此您无法使用之前存储的令牌来获取访问令牌。
【解决方案2】:

我希望能够从 C#/.NET 进行简单的状态更新,但不想嵌入大型库。

所以我写了一个小的OAuth.Manager class 来做这些事情。

这里有描述:
OAuth with Verification in .NET

更新状态的示例代码:

var oauth = new OAuth.Manager(); 
oauth["consumer_key"] = CONSUMER_KEY; 
oauth["consumer_secret"] = CONSUMER_SECRET; 
oauth["token"] = your_stored_access_token; 
oauth["token_secret"] = your_stored_access_secret; 
var url = "http://api.twitter.com/1/statuses/update.xml?status=Hello+World";
var authzHeader = oauth.GenerateAuthzHeader(url, "POST"); 

var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Headers.Add("Authorization", authzHeader);
using (var response = (HttpWebResponse)request.GetResponse())
{
    if (response.StatusCode != HttpStatusCode.OK)
        MessageBox.Show("There's been a problem trying to tweet:" +
                        Environment.NewLine +
                        response.StatusDescription +
                        Environment.NewLine +
                        Environment.NewLine +
                        "You will have to tweet manually." +
                        Environment.NewLine);
}

第一次通过时,您需要获取访问令牌和密码。这是在一个多步骤过程中完成的,从以下代码开始:

var oauth = new OAuth.Manager();
oauth["consumer_key"] = MY_APP_SPECIFIC_KEY;
oauth["consumer_secret"] = MY_APP_SPECIFIC_SECRET;
oauth.AcquireRequestToken("https://api.twitter.com/oauth/request_token", "POST"); 

第 2 步是告诉用户** 访问 https://api.twitter.com/oauth/authorize?oauth_token=XXXX,其中 xxxx 被替换为收到的实际令牌,在这种情况下可通过 oauth["token"] 访问。第 3 步是告诉用户从网页中获取 (ctrl-c) PIN 并将其粘贴到您的应用程序中,您可以在其中使用该 PIN 获取另一种类型的令牌。

更好的方法是使用带有嵌入式 WebBrowser 控件的 Windows 窗体来自动化该 Web UI 序列。当您将该控件的 Url 属性设置为适当的值时,它将在您自己的应用程序的主窗体中为您显示该网页。您还可以自动化检索 PIN 的部分。这减少了用户的上下文切换,并使事情更容易理解。

不管怎样,用你做的图钉,第 4 步:

oauth.AcquireAccessToken("https://api.twitter.com/oauth/access_token",
    "POST",
    pin); 

...发送另一个 HTTP REST 请求,当它返回时,您将获得一个访问令牌和密码,可在 oauth["token"]oauth["token_secret"] 中使用。

Web UI 的这种授权内容只需要发生一次;在您获得访问令牌和秘密一次后,您可以存储它们并重新使用它们。 Twitter 说,它们永不过期。

然后您可以继续发送状态更新...

var url = "http://api.twitter.com/1/statuses/update.xml?status=Hello+World";
var authzHeader = oauth.GenerateAuthzHeader(url, "POST"); 
...

...如上。

【讨论】:

  • 谢谢,感谢您的帮助。我会试试这个代码,看看它是否适合我。
【解决方案3】:

我知道我迟到了,但我创建了一个端到端的视频教程,展示了如何做到这一点:我在 dev.twitter.com 上创建了一个应用程序,使用 nuget 安装 twitterizer,将代码编写到处理 oauth,最后编写代码以使用从 twitter 收到的访问令牌来制作推文。

视频:http://www.youtube.com/watch?v=TGEA1sgMMqU

教程:http://www.markhagan.me/Samples/Grant-Access-And-Tweet-As-Twitter-User-ASPNet

代码(如果您不想离开此页面):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Twitterizer;

namespace PostFansTwitter
{
    public partial class twconnect : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var oauth_consumer_key = "YOUR_CONSUMER_KEY_HERE";
            var oauth_consumer_secret = "YOUR_CONSUMER_SECRET_KEY_HERE";

            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.");
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2013-01-16
    • 2015-10-14
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多