2012-05-07 2 views
4

Я пытаюсь в течение нескольких дней, чтобы заставить OAuth работать с Twitter в моем приложении Windows Phone, но вся информация, которую я нахожу, устарела или трудно следовать. В конце концов я попал где-то, когда нашел этот пост в блоге http://samjarawan.blogspot.co.uk/2010/09/building-real-windows-phone-7-twitter_18.html, который доставил мне весь путь до получения токена доступа, после чего он не удался.Twitter, OAuth, Hammock, TweetSharp и Windows Phone 7

Мой код почти идентичен тому, который был в блоге, в значительной степени просто изменил потребительский ключ и секрет потребителя. Даже их приложение не работает. Он отображает щебетать экран Войти штраф, и успешно подтверждает подлинность, но в функции RequestAccessToken, она не в данный момент:

if (String.IsNullOrEmpty(twitteruser.AccessToken) || String.IsNullOrEmpty(twitteruser.AccessTokenSecret)) 
{ 
    Dispatcher.BeginInvoke(() => MessageBox.Show(response.Content)); 
    return; 
} 

Действительно раздражает вещь окно сообщения только показывает замены символа Unicode() и ничего остальное. Я также проверил response.StatusCode, и все в порядке, поэтому, насколько я могу судить, ошибок нет.

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

EDIT: Я только что попробовал заставить 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)); 
      } 
     }); 
    } 
} 

EDIT 2: Может быть сделать с этим? https://dev.twitter.com/blog/ssl-upgrade-for-twitterapi

+0

Что на ответ его статуса? Кроме того, если вам нужен только Twitter, вы можете посмотреть на [TweetSharp] (https://github.com/danielcrenna/tweetsharp). – pradeek

+0

ответ не имеет свойства statusText, у него есть StatusDescription, хотя он просто говорит «ОК», , Я также планирую использовать вход в Facebook, поэтому было бы неплохо, если бы эта версия работала, так как я предполагаю, что Facebook потребует подобных шагов. В какой-то момент я смотрел на TweetSharp, но не смог его построить, я мог бы взглянуть еще раз. –

+0

См. Мое редактирование, TweetSharp тоже не работает, или я что-то упустил. –

ответ

4

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

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

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

+0

Какие изменения вы внесли? Не могли бы вы поделиться им. –

0

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

----- EDIT ----

я, наконец, смог заставить его работать с 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); 
      } 
     } 
    } 
Смежные вопросы