Twitterizer:“无法通过OAuth进行身份验证”

时间:2011-08-14 07:34:41

标签: c# .net twitter twitter-oauth twitterizer

我正在使用Twitterizer库将网站中的推文发布到我的Twitter帐户中。它在网站上工作正常,在我的本地服务器上运行(通过Twitter应用程序通过OAuth进行身份验证并发布推文)。 但是,当我试图在生产服务器上发布推文时,Twitterizer说:“结果= 未经授权。ErrorMessage = 无法通过OAuth进行身份验证 。“

我仔细检查了消费者密钥,也尝试重置密钥并重试 - 结果相同。

Twitter应用程序对我的Twitter帐户具有读/写权限,并且未被阻止。 经过一段时间的成功工作约一个月后,这个问题突然出现,当时每小时都会发布推文。

这里有什么问题?

更新 看来,其他人也面临这个问题:https://dev.twitter.com/discussions/305

更新2 最后,我发现导致问题的原因出现在我的案例中。生产服务器上的Web应用程序尝试更新140个字符的状态(由String.Length属性测量)。第一个角色是unicode Character'LEFT-TO-RIGHT MARK'(U + 200E)。因此,此文本未经更改即传递给TwitterStatus.Update(..)。我调试了一些Twitterizer来源并注意到oauth_signature(= hash)计算错误。 oauth_signature是从实际请求的另一个url生成的。我还没有说清楚为什么以及何时发生此错误的原因,并且可能会在接下来的几天内写下更多信息。

更新3 我尝试使用新版本的Twitterizer(2.3.3)发布相同的消息,并且没有发生错误。问题消失了。

这是我用来发推文的代码:

OAuthTokens tokens = new OAuthTokens();
tokens.AccessToken = ConfigurationManager.AppSettings["twitterAccessToken"];
tokens.AccessTokenSecret = ConfigurationManager.AppSettings["twitterAccessTokenSecret"];
tokens.ConsumerKey = ConfigurationManager.AppSettings["twitterAutoPosterConsumerKey"];
tokens.ConsumerSecret = ConfigurationManager.AppSettings["twitterAutoPosterConsumerSecret"];

string text = "Some text";

TwitterResponse<TwitterStatus> tweetResponse = TwitterStatus.Update(tokens, text);
if (tweetResponse.Result == RequestResult.Success)
{
    // Tweet posted successfully!
    _log.InfoFormat("Posted a tweet #{0}.", tweetResponse.ResponseObject.Id);
}
else
{
    _log.ErrorFormat("Error occured while posting a tweet. Result = {0}. ErrorMessage = {1}",
        tweetResponse.Result, tweetResponse.ErrorMessage);
}

2 个答案:

答案 0 :(得分:1)

请检查邮件,如果邮件包含撇号('),请将其替换为&amp;#39;

请注意,&amp;#39;将计为5个字符。

我认为撇号会影响发送给Twitter的请求包,这会使Twitter无法正确获取令牌,因此我们会收到错误“无法通过OAuth验证”。

答案 1 :(得分:0)

我遇到了同样的麻烦。 PHP 5.3.1在我的本地服务器上运行,而PHP 4.3.2在我的生产服务器上运行。我使用从下面获得的Google Code的OAuth库,

http://code.google.com/p/oauth/source/browse/#svn%2Fcode%2Fjavascript

我探索了PHP代理程序从浏览器的javascript代码收到的OAuth标头。在我的本地服务器上,它是

OAuth realm =“”,oauth_consumer_key =“XXX”,oauth_token =“XXX”,oauth_version =“1.0”,oauth_timestamp =“1314956434”,oauth_nonce =“mF7Tof”,oauth_signature_method =“HMAC-SHA1”,oauth_signature =“ DbuaiDeMhMYNZ5BaQmOoFr%2FRsEQ%3D“

在我的生产服务器上,上面的所有双引号都被转义,即'\“'。 所以我使用str_replace函数将转义的双引号替换为未转义的双引号。然后它在我的生产服务器上运行良好。原因是PHP 5.3.1和PHP 4.3.2之间处理双引号的方式不同。转义双引号导致错误“无法使用OAuth进行身份验证”。