我正在使用Twitterizer库将网站中的推文发布到我的Twitter帐户中。它可以在我的本地服务器上运行的网站上正常运行(通过Twitter应用通过OAuth进行身份验证并发布推文)。
但是,当我尝试在生产服务器上发布推文时,Twitterizer说:“结果=未经授权。ErrorMessage=无法通过OAuth进行身份验证。”
我仔细检查了消费者密钥,还尝试重置密钥,然后重试-同样的结果。
Twitter应用程序具有对我的Twitter帐户的读/写访问权限,未被阻止。
在大约一个月的成功工作一段时间后,每小时大约发布一条推文,此问题突然出现。
这里有什么问题?
更新
看来其他人也面临这个问题:https://dev.twitter.com/discussions/305
更新2
最终,我发现了导致问题在我的情况下出现的原因。生产服务器上的Web应用程序尝试使用140个字符(由String.Length属性测量)更新状态。第一个字符是Unicode字符“左向右标记”(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);
}
最佳答案
请检查消息,如果消息中带有撇号('),请替换为&#39;
请注意,&#39;
将算作5个字符。
我认为撇号将影响发送到Twitter的请求包,使Twitter无法正确获取令牌,因此我们将收到错误“无法通过OAuth进行身份验证”。