2012-05-07 6 views
4

나는 내 Windows Phone 앱에서 Twitter를 통해 OAuth를 사용하기 위해 며칠 동안 노력했지만, 필자가 찾은 모든 정보는 날짜가 없거나 따라하기가 어렵습니다. 결국 어딘가에 내가이 블로그 게시물 http://samjarawan.blogspot.co.uk/2010/09/building-real-windows-phone-7-twitter_18.html을 찾았는데,이 토큰은 액세스 토큰을 얻는 모든 방법을 얻었습니다.Twitter, OAuth, 해먹, TweetSharp 및 Windows Phone 7

내 코드는 블로그 게시물에있는 코드와 거의 동일하지만 대부분 소비자 키와 소비자 비밀을 변경했습니다. 그들의 애플 리케이션조차도 작동하지 않습니다. 그것은 트위터 로그인 화면 벌금을 표시하고, 성공적으로 인증하지만, RequestAccessToken 기능에,이 시점에서 실패

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

진짜로 짜증나는 일이 메시지 상자는 유니 코드 대체 문자를 보여줍니다() 아무것도 그밖에. 나는 또한 응답을 확인했다 .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

+0

이 뭐죠 응답하는 statusText에 작동 사용하는 코드이다? 또한 트위터 만 있으면 [TweetSharp] (https://github.com/danielcrenna/tweetsharp) – pradeek

+0

응답에 statusText 속성이 없으며 StatusDescription이 있는데 "OK"라고 표시됩니다. . 나는 페이스 북 로그인을 사용할 계획이기 때문에 Facebook이 비슷한 단계를 요구할 것이라고 생각하기 때문에이 버전을 작동시키는 것이 좋을 것입니다. 한 번에 TweetSharp를 살펴 봤지만 빌드 할 수는 없었습니다. 다시 한 번 살펴 보겠습니다. –

+0

내 편집을보고 TweetSharp가 작동하지 않거나 뭔가 빠졌습니다. –

답변

4

나는 그것을 해결했습니다! 트위터가 Gzipped 액세스 토큰을 반환하고있는 것으로 나타났습니다. 블로그 게시물에 설명 된 방법을 사용하여 두 번째 RestClient를 다음과 같이 변경해야했습니다.

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

이제는 작동합니다.

+0

변경 사항은 무엇입니까? 공유 할 수 있니? –

0

동일한 문제가 있지만 솔루션을 이해하지 못했지만 나머지 클라이언트를 변경 한 위치를 조금 더 설명 할 수 있습니까?

----- 편집 ----

나는 마침내 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); 
      } 
     } 
    }