4

私はWindowsPhoneアプリでOAuthを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も確認しましたが、OKなので、私が知る限りエラーはありません。

誰かがこれを手伝ってくれるなら、それは素晴らしいことです。ユーザーが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

4

2 に答える 2

4

私はそれを解決しました!TwitterがアクセストークンGzip圧縮を返していたことが判明しました。ブログ投稿で説明されている方法を使用して、2番目のRestClientを次のように構築するように変更する必要がありました。

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

And now it works!

于 2012-05-08T16:27:53.733 に答える
0

I am having the same problem but I didn't understand your solution, could you explain a bit more where you changed the rest client?

-----EDIT----

I finally was able to make it work with TweetSharp. I downloaded the source code and added the lines you mentioned to the rest client configuration it uses and the compiled the project again. Since i cannot push my changes to that github, I upload the dll here. TweetSharp recompiled dll

This is the code I use which with it works

// 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);
            }
        }
    }
于 2012-05-09T13:52:07.717 に答える