@H_502_6@
我一直在努力让OAuth在我的
Windows Phone应用程序中使用Twitter,但我找到的所有信息都已过时或难以理解.我最终找到了一个地方,当我发现这个博客发布
http://samjarawan.blogspot.co.uk/2010/09/building-real-windows-phone-7-twitter_18.html时,它让我一直获得访问令牌,此时它失败了.
我的代码几乎与博客文章中的代码相同,几乎只是改变了消费者密钥和消费者秘密.即使他们的应用程序也无效.它显示Twitter登录屏幕正常,并成功进行身份验证,但在RequestAccessToken函数中,它在此时失败:
if (String.IsNullOrEmpty(twitteruser.AccessToken) || String.IsNullOrEmpty(twitteruser.AccessTokenSecret)) { Dispatcher.BeginInvoke(() => MessageBox.Show(response.Content)); return; }
真正烦人的事情是消息框只显示Unicode替换字符( )而没有别的.我还检查了response.StatusCode,它没关系,所以我可以告诉你没有错误.
如果有人可以帮我解决这个问题,那就太好了.我已经看过其他需要用户输入PIN的教程,但是我也无法使用其中任何一个.
编辑:我刚刚尝试让TweetSharp工作,但再次无法获得访问令牌.这是我用于TweetSharp的代码:
public partial class TwitterAuthorisationPage : PhoneApplicationPage { private const string consumerKey = "myKey"; private const string consumerSecret = "mySecret"; // These are the correct values for my app private const string requestTokenUri = "https://api.twitter.com/oauth/request_token"; private const string oAuthVersion = "1.0a"; private const string authorizeUri = "https://api.twitter.com/oauth/authorize"; private const string accessTokenUri = "https://api.twitter.com/oauth/access_token"; private const string callbackUri = "http://bing.com"; private TwitterService twitterService = new TwitterService(consumerKey,consumerSecret); private OAuthRequestToken _requestToken = null; public TwitterAuthorisationPage() { InitializeComponent(); } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); twitterService.GetRequestToken((requestToken,response) => { if (response.StatusCode == HttpStatusCode.OK) { _requestToken = requestToken; Dispatcher.BeginInvoke(() => BrowserControl.Navigate(twitterService.GetAuthorizationUri(requestToken))); } else { Dispatcher.BeginInvoke(() => MessageBox.Show("Failed to connect to Twitter. Please try again.\n" + response.StatusDescription)); } }); } private void ConfirmButton_Click(object sender,RoutedEventArgs e) { twitterService.GetAccessToken(_requestToken,PINEntry.Text,(accessToken,response) => { if (response.StatusCode == HttpStatusCode.OK) { //These lines just print ? System.Diagnostics.Debug.WriteLine(accessToken.Token); System.Diagnostics.Debug.WriteLine(accessToken.TokenSecret); twitterService.AuthenticateWith(accessToken.Token,accessToken.TokenSecret); twitterService.VerifyCredentials((user,verifyResponse) => { if (verifyResponse.StatusCode == HttpStatusCode.OK) { Dispatcher.BeginInvoke(() => MessageBox.Show(user.Name)); } else { // Fails here Dispatcher.BeginInvoke(() => MessageBox.Show("Failed to connect to Twitter. Please try again.1\n" + verifyResponse.StatusDescription)); } }); } else { Dispatcher.BeginInvoke(() => MessageBox.Show("Failed to connect to Twitter. Please try again.0\n" + response.StatusDescription)); } }); } }
编辑2:这可能与此有关吗? https://dev.twitter.com/blog/ssl-upgrade-for-twitterapi
解决方法
我解决了!事实证明Twitter正在返回访问令牌Gzipped.使用博客文章中描述的方法,我不得不改变第二个RestClient,如下所示:
var client = new RestClient { Authority = "https://api.twitter.com/oauth",Credentials = credentials,HasElevatedPermissions = true,SilverlightAcceptEncodingHeader = "gzip",DecompressionMethods = DecompressionMethods.GZip };
现在它有效!