我有这段代码:
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);
我收到一条错误消息:“无效/过期令牌”。
答案 0 :(得分:3)
您正在存储错误的值。需要使用OAuthUtility.GetAccessToken(...)快速交换authToken和verifier值以获取访问令牌。从该方法返回的访问令牌应该存储并提供给Twitterizer。
-Ricky
Twitterizer作者
答案 1 :(得分:1)
我希望能够从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并将其粘贴到您的应用程序中,您可以使用该针来获取其他类型的令牌。
更好的方法是使用带有嵌入式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");
...
......如上所述。
答案 2 :(得分:1)
我知道我已经迟到了,但我创建了一个端到端的视频教程,显示了如何做到这一点:我在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.");
}
}
}
}
}