【问题标题】:Twitter, OAuth, Hammock, TweetSharp and Windows Phone 7Twitter、OAuth、Hammock、TweetSharp 和 Windows Phone 7
【发布时间】:2012-05-07 17:01:24
【问题描述】:

几天来,我一直在尝试让 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,你可以看看TweetSharp
  • response 没有属性 statusText,但它确实有 StatusDescription,它只是说“OK”。我也计划使用 Facebook 登录,所以让这个版本工作会很好,因为我想 Facebook 将需要类似的步骤。我确实看过 TweetSharp 但无法构建它,我可能会再看一次。
  • 查看我的编辑,TweetSharp 也不起作用,或者我遗漏了一些东西。

标签: windows-phone-7 twitter oauth tweetsharp hammock


【解决方案1】:

我解决了!事实证明 Twitter 正在返回 Gzipped 的访问令牌。使用博客文章中描述的方法,我不得不将第二个 RestClient 更改为如下构造:

var client = new RestClient
{
    Authority = "https://api.twitter.com/oauth",
    Credentials = credentials,
    HasElevatedPermissions = true,
    SilverlightAcceptEncodingHeader = "gzip",
    DecompressionMethods = DecompressionMethods.GZip
};

现在它可以工作了!

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,但我不明白你的解决方案,你能解释一下你在哪里改变了其余的客户端吗?

    -----编辑----

    我终于能够让它与 TweetSharp 一起工作。 我下载了源代码并将您提到的行添加到它使用的其余客户端配置中,并再次编译了项目。 由于我无法将更改推送到该 github,因此我在此处上传了 dll。 TweetSharp recompiled dll

    这是我使用的代码

    // Step 1 - Retrieve an OAuth Request Token
            Service.GetRequestToken((requestToken, response) =>
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Request = requestToken;
                    Uri uri = Service.GetAuthorizationUri(requestToken);
                    Dispatcher.BeginInvoke(() =>
                    {
                        Browser.Navigate(uri);
                    }
                   );
                }
            });
    
    
    //Step 2, get the pincode
    
    string html = Browser.SaveToString(); //gets the DOM as a string
                Regex expression = new Regex(@"<code>(?<word>\w+)</code>"); 
                Match match = expression.Match(html);
                string pin = match.Groups["word"].Value;
                if (pin != "")
                {                    
                    loginTwitter(pin); //we login with the pin extracted
                }
    
    //step 3, get access tokens from twitter
     private void loginTwitter(string pin)
        {
            Service.GetAccessToken(Request, pin, processAccessToken);
        }
    
    
        public void processAccessToken(OAuthAccessToken access, TwitterResponse Response){
            if (Response.StatusCode == HttpStatusCode.OK)
            {
                if (access != null)
                {
                    Access = access; // Store it for reuse
                    Service.AuthenticateWith(access.Token, access.TokenSecret);
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多