2013-01-31 9 views
5

"tumblr"を自分のアプリケーションに統合しようとしています。アクセストークンを正常に取得できました。私が投稿しようとする。しかし、私は次のエラーiOSからtumblrに投稿できませんOAuth1.0、OAConsumerのクライアント

{"meta":{"status":401,"msg":"Not Authorized"},"response":[]} 

私はMGTwitterEngineからあれば引っ張ってきたのiOS用のOAuthConsumerクライアントを使用していますが取得しています。

これは私が試みたものです。

#import "ViewController.h" 


#define consumer_key @"u9iZvT8KIlrTtUrh3vUeXXXXXXXXXXXXXAfgpThGyom8Y6MKKCnU" 
#define consumer_secret @"xfA10mQKmALlpsnrFXXXXXXXXXXXXXXXXXXXXXXXXXX" 
#define request_token_url @"http://www.tumblr.com/oauth/request_token" 
#define access_token_url @"http://www.tumblr.com/oauth/access_token" 
#define authorize_url @"http://www.tumblr.com/oauth/authorize?oauth_token=%@" 
#define base_url @"http://api.tumblr.com/v2/user/XXXXXXXXXXXXX.tumblr.com/info" 
#define user_info @"http://api.tumblr.com/v2/user/info" 

@interface ViewController() 

@end 

@implementation ViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 




- (IBAction)postIt:(id)sender 
{ 

    NSURL *postURL = [NSURL URLWithString:@"http://api.tumblr.com/v2/blog/xxxxxxxx.tumblr.com/post"]; 
    OAMutableURLRequest *oRequest = [[OAMutableURLRequest alloc] initWithURL:postURL 
                    consumer:self.consumer 
                     token:self.accessToken 
                     realm:nil 
                  signatureProvider:nil]; 
    [oRequest setHTTPMethod:@"POST"]; 

    [oRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

    OARequestParameter *statusParam = [[OARequestParameter alloc] initWithName:@"body" 
                     value:@"Sample Body"]; 
    OARequestParameter *statusParam2 = [[OARequestParameter alloc] initWithName:@"type" 
                     value:@"text"]; 

    NSArray *params = [NSArray arrayWithObjects:statusParam,statusParam2, nil]; 
    [oRequest setParameters:params]; 
    OAAsynchronousDataFetcher *fetcher = [OAAsynchronousDataFetcher asynchronousFetcherWithRequest:oRequest 
                          delegate:self 
                       didFinishSelector:@selector(sendStatusTicket:didFinishWithData:) 
                        didFailSelector:@selector(sendStatusTicket:didFailWithError:)]; 
    NSLog(@"URL = %@",[oRequest.URL absoluteString]); 

    [fetcher start]; 
} 


- (void)didReceiveAccessToken:(OAServiceTicket *)ticker data:(NSData *)responseData 
{ 


} 

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error { 
    // ERROR! 
} 




- (void)sendStatusTicket:(OAServiceTicket *)ticker didFinishWithData:(NSData *)responseData 
{ 
    if (ticker.didSucceed) { 
     NSLog(@"Success"); 
    } 
    NSString *responseBody = [[NSString alloc] initWithData:responseData 
                encoding:NSUTF8StringEncoding]; 

    NSLog(@"Description = %@",responseBody); 


} 
- (void)sendStatusTicket:(OAServiceTicket *)ticker didFailWithError:(NSError *)error 
{ 
    NSLog(@"Error = %@",[error localizedDescription]); 
} 
- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 

- (IBAction)login:(id)sender 
{ 
    self.consumer = [[OAConsumer alloc] initWithKey:consumer_key secret:consumer_secret]; 

    NSURL *url = [NSURL URLWithString:request_token_url]; 


    OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url 
                    consumer:self.consumer 
                     token:nil // we don't have a Token yet 
                     realm:nil // our service provider doesn't specify a realm 
                  signatureProvider:nil]; // use the default method, HMAC-SHA1 

    [request setHTTPMethod:@"POST"]; 

    OADataFetcher *fetcher = [[OADataFetcher alloc] init]; 

    [fetcher fetchDataWithRequest:request 
         delegate:self 
       didFinishSelector:@selector(requestTokenTicket:didFinishWithData:) 
        didFailSelector:@selector(requestTokenTicket:didFailWithError:)]; 


} 
- (void)requestTokenTicket:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data { 
    if (ticket.didSucceed) 
    { 
     NSString *responseBody = [[NSString alloc] initWithData:data 
                 encoding:NSUTF8StringEncoding]; 
     self.accessToken= [[OAToken alloc] initWithHTTPResponseBody:responseBody]; 

     NSURL *author_url = [NSURL URLWithString:[ NSString stringWithFormat:authorize_url,self.accessToken.key]]; 
     OAMutableURLRequest *oaR = [[OAMutableURLRequest alloc] initWithURL:author_url consumer:nil token:nil realm:nil signatureProvider:nil];   
     UIWebView *webView =[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
     [[[UIApplication sharedApplication] keyWindow] addSubview:webView]; 
     webView.delegate=self; 
     [webView loadRequest:oaR]; 

    } 
} 

// This is to get oAuth_verifier from the url 

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 

    NSString *url = [[request URL] absoluteString]; 
    NSString *keyOne = @"oauth_token"; 
    NSString *keyTwo = @"oauth_verifier"; 
    NSRange r1 =[url rangeOfString:keyOne]; 
    NSRange r2 =[url rangeOfString:keyTwo]; 
    if (r1.location!=NSNotFound && r2.location!=NSNotFound) { 
     // Extract oauth_verifier from URL query 
     NSString* verifier = nil; 
     NSArray* urlParams = [[[request URL] query] componentsSeparatedByString:@"&"]; 
     for (NSString* param in urlParams) { 
      NSArray* keyValue = [param componentsSeparatedByString:@"="]; 
      NSString* key = [keyValue objectAtIndex:0]; 
      if ([key isEqualToString:@"oauth_verifier"]) { 
       verifier = [keyValue objectAtIndex:1]; 
       break; 
      } 
     } 
     if (verifier) { 
      NSURL* accessTokenUrl = [NSURL URLWithString:@"http://www.tumblr.com/oauth/access_token"]; 
      OAMutableURLRequest* accessTokenRequest =[[OAMutableURLRequest alloc] initWithURL:accessTokenUrl 
                        consumer:self.consumer 
                         token:self.accessToken 
                         realm:nil 
                      signatureProvider:nil]; 
      OARequestParameter* verifierParam =[[OARequestParameter alloc] initWithName:@"oauth_verifier" value:verifier]; 
      [accessTokenRequest setHTTPMethod:@"POST"]; 
      [accessTokenRequest setParameters:[NSArray arrayWithObjects:verifierParam,nil]]; 
      OADataFetcher* dataFetcher = [[OADataFetcher alloc] init]; 
      [dataFetcher fetchDataWithRequest:accessTokenRequest 
            delegate:self 
          didFinishSelector:@selector(requestTokenTicketForAuthorization:didFinishWithData:) 
           didFailSelector:@selector(requestTokenTicket:didFailWithError:)]; 
     } else { 
      // ERROR! 
     } 
     [webView removeFromSuperview]; 
     return NO; 
    } 
    return YES; 
} 


- (void)requestTokenTicketForAuthorization:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data 
{ 
    if (ticket.didSucceed) 
    { 
     NSString *responseBody = [[NSString alloc] initWithData:data 
                 encoding:NSUTF8StringEncoding]; 
     self.accessToken = [self.accessToken initWithHTTPResponseBody:responseBody]; 
     accessText=self.accessToken.key; 
     accessSecret=self.accessToken.secret; 
    } 
    else 
    { 
     NSString *responseBody = [[NSString alloc] initWithData:data 
                 encoding:NSUTF8StringEncoding]; 
     NSLog(@"Response = %@",responseBody); 
    } 


} 
- (void)requestTokenTicket:(OAServiceTicket *)ticket didFailWithError:(NSError *)error 
{ 
    NSLog(@"Error = %@",[error localizedDescription]); 
} 


@end 

ここで間違いをしていますか?なぜ私はそのエラーを取得していますか?私は適切に手順を実行しましたか?

答えて

3

不要な使い方を避けるには、consumer_keyとconsumer_secretをXXXにしてください。 ここでは、あなたがここで探してみたいことがいくつかあります。

  1. "http://api.tumblr.com/v2/user/info"などのoauth 'GET'リクエストを使用できますか? 「GET」リクエストが成功した場合は、アクセストークンが有効で、投稿パラメータの送信方法を見ることができます。

  2. パラメータがHTTP Bodyおよび署名パラメータとして渡されていることを確認してください。正しいパラメーターの順序付けは、ライブラリーによって提供される可能性があります。

    NSString * postbody = @ "body = myBodyText & type = text";

    [oRequest setHTTPBody:[postbody dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:TRUE]];

+0

@jduellert ..ありがとうございます! – Bharath

関連する問題