Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从iOS OAuth1.0、OAConsumer客户端在tumblr上发布_Ios_Objective C_Oauth_Tumblr_Social - Fatal编程技术网

无法从iOS OAuth1.0、OAConsumer客户端在tumblr上发布

无法从iOS OAuth1.0、OAConsumer客户端在tumblr上发布,ios,objective-c,oauth,tumblr,social,Ios,Objective C,Oauth,Tumblr,Social,我正在尝试将“tumblr”集成到我的应用程序中。我能够成功地获得访问令牌。但是,当我尝试发布时,我得到了以下错误 {"meta":{"status":401,"msg":"Not Authorized"},"response":[]} 我正在使用iOS的OAuthConsumer客户机,我从MGTwitterEngine中提取了它 这就是我尝试过的 #import "ViewController.h" #define consumer_key @"u9iZvT8KIlrTtUrh3vU

我正在尝试将“tumblr”集成到我的应用程序中。我能够成功地获得访问令牌。但是,当我尝试发布时,我得到了以下错误

{"meta":{"status":401,"msg":"Not Authorized"},"response":[]}
我正在使用iOS的
OAuthConsumer
客户机,我从
MGTwitterEngine
中提取了它

这就是我尝试过的

#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

我在这里犯了什么错误?为什么我会犯这样的错误?我是否正确地遵循了这些步骤?

请XXX拿出您的消费者密钥和消费者秘密,以避免不必要地使用它们。 代码方面,您可能需要在此处查找一些内容

  • 您是否能够使用oauth“GET”请求,例如“”? 如果您可以收到一个成功的“GET”请求,那么您的访问令牌是有效的,您可以查看如何发送post参数

  • 确保将参数作为HTTP正文以及签名参数传递。库可能提供正确的参数顺序

    NSString*postbody=@“body=myBodyText&type=text”

    [oRequest setHTTPBody:[postbody数据使用编码:NSUTF8StringEncoding allowLossyConversion:TRUE]


  • @jduellert。。非常感谢!!