Twitter, OAuth, Hammock, TweetSharp и Windows Phone 7

В течение нескольких дней я пытался заставить OAuth работать с Twitter в моем приложении для Windows Phone, но вся информация, которую я нашел, устарела или трудна для понимания. В конце концов я где-то попал, когда нашел это сообщение в блоге 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 и все в порядке, поэтому, насколько я могу судить, ошибки нет.

Если бы кто-то мог помочь мне с этим, это было бы здорово. Я видел другие учебные пособия, которые требуют ввода типа пользователя в ПИН-коде, но я также не смог заставить ни один из них работать.

РЕДАКТИРОВАТЬ: Я только что попытался заставить 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

2 ответа

Решение

Я решил это! Оказывается, Твиттер возвращал токен доступа Gzipped. Используя метод, описанный в сообщении в блоге, мне пришлось изменить второй RestClient, который будет построен следующим образом:

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

И теперь это работает!

У меня та же проблема, но я не понял вашего решения, не могли бы вы объяснить немного больше, где вы сменили остальных клиентов?

-----РЕДАКТИРОВАТЬ----

Я наконец смог заставить его работать с TweetSharp. Я скачал исходный код и добавил упомянутые вами строки в конфигурацию оставшегося клиента, и снова скомпилировал проект. Так как я не могу отправить свои изменения на этот GitHub, я загружаю DLL здесь. TweetSharp перекомпилирован 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);
            }
        }
    }
Другие вопросы по тегам