2013-01-31 6 views
5

से tumblr पर पोस्ट करने में असमर्थ मैं अपने आवेदन में "tumblr" को एकीकृत करने की कोशिश कर रहा हूं। मैं एक्सेस टोकन सफलतापूर्वक प्राप्त करने में सक्षम हूं। लेकिन, जब मैं पोस्ट करने की कोशिश, मैं निम्न त्रुटिआईओएस OAuth1.0, OAConsumer क्लाइंट

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

मैं आईओएस, जो मैं MGTwitterEngine से यदि खींच लिया है 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

कृपया अपने उपभोक्ता_की और उपभोक्ता_सेक्रेट को अनचाहे उपयोग से बचने के लिए XXX से बाहर करें। कोड के अनुसार कुछ ऐसी चीजें हैं जिन्हें आप यहां देखना चाहते हैं।

  1. आप 'के लिए' इस तरह के "http://api.tumblr.com/v2/user/info" के रूप में अनुरोध कर एक OAuth का उपयोग करने में सक्षम हैं? यदि आप एक सफल 'GET' अनुरोध प्राप्त कर सकते हैं तो आपका एक्सेस टोकन मान्य है और आप देख सकते हैं कि आप अपने पोस्ट पैरामीटर कैसे भेज रहे हैं।

  2. सुनिश्चित करें कि आप HTTP पैरामीटर के साथ ही हस्ताक्षर पैरामीटर के रूप में अपने पैरामीटर में गुजर रहे हैं। लाइब्रेरी द्वारा सही पैरामीटर ऑर्डरिंग की संभावना है।

    एनएसएसटींग * पोस्टबॉडी = @ "बॉडी = myBodyText & टाइप = टेक्स्ट";

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

+0

@jduellert .. बहुत बहुत धन्यवाद !! – Bharath

संबंधित मुद्दे