首页 > 代码库 > 新浪微博开发获取access_token的艰难过程

新浪微博开发获取access_token的艰难过程

一个网络问题困扰了我好几天,终于幸运的解决了.

言归正传,笔者按照M了个J的教程来进行新浪的开发,到抓取微博数据的时候挂了,一直无法读取微博接口,现在仍没解决,不过我新建了一个应用,用自己的账号调试通过了.接下来说说遇到的几个坑.

网络用的AFN框架,开发环境Xcode5,ARC.最开始一直按照MJ的做法用response_type=token来获取,一直挂,万念俱灰.后Google到有人说这个方式被新浪用来只开放给web了,客户端没戏,尝试着获取code,然后再用code获取access_token的方式来开发.第一步获取code依然没什么大的问题,只要你的回调地址跟URL里一致,开发者身份认证通过,测试账号OK,这一步问题不大.然后是第二步,怎么通过code获取access_token?后来发现其实也不难,只是对于一个不懂网络的人来说,一直没注意到一个点.这个点是请求的类型.

步骤:

1.获取登录界面

    NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@"https://open.weibo.cn/oauth2/authorize?client_id=%@&redirect_uri=%@&display=mobile",kAppKey,kRedirectURL]];

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

    [_webView loadRequest:request];

注:https://api.weibo.com这个网址也可以,我都试过了,但是新浪的文档里说用open那个,其实都一样,这个时候你会觉得新浪有点2.

2.获取code

这一步太容易,不贴代码,抓取code的原理是,你第一步登录后,登录成功,webView会转到你之前创建应用时写的回调页面,拦截该请求,并抓取请求里的code就好.

3.用code获取access_token

    NSString *str = [NSStringstringWithFormat:@"https://api.weibo.com/oauth2/access_token?client_id=%@&client_secret=%@&grant_type=authorization_code&redirect_uri=%@&code=%@",kAppKey,kAppSecret,kRedirectURL,code];

    NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:str]];

#warning 设置请求为post请求!!!

    [request setHTTPMethod:@"POST"];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

        NSLog(@"成功%@",JSON);    

        if (_account == nil) {

            _account = [[Account alloc] init];

        }

// 打印账号信息并设置账号

        _account.accessToken = JSON[kAccessToken];

        _account.uid = JSON[KUid];

        NSLog(@"access_token=%@,uid=%@",_account.accessToken,_account.uid);

        [self nickName];    // 后续方法

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

        NSLog(@"失败--%@--%@--%@",request,response,error);

    }];

    [operation start];

至此结束,拿到access_token,然后各位自行去读取微博数据吧.

经过这次折腾,发现打印错误信息非常有用,比如我之前收到非常多乱七八糟的错误,一个个Google,真心坑,不知道是AFN的问题还是新浪那边的问题,后来我发现一个AFN和新浪不匹配的问题,在获取access_token的过程中,会提示失败,打印错误会告诉你AFN不能识别返回的信息格式,改一下AFN的源代码就好了.

AFJSONRequestOperation默认不接收text/plain类型的数据,当服务器返回text/plain类型的数据时,会认为出错了。可以通过修改源代码解决问题

+ (NSSet *)acceptableContentTypes {

    return [NSSet setWithObjects:@"text/plain", @"application/json", @"text/json", @"text/javascript", nil];

}

通常里边有三个了,只需要加一个@"text/plain"进去就好,具体该方法所在的文件,搜索一下就出来了,注意只需要添加到一个文件 里,该方法好几个文件里都有,不要乱加.

这几天一直想骂新浪,搞个开放平台,那么多人在问同一个问题没人鸟,官方的SDK使用维护的QQ群里问问题也没人鸟,真是扯淡.另外上面说的用MJ的方式只能访问用户接口,不能访问微博接口的问题,估计是response_type=token这个方式过时了的.新浪这2货更新了接口也不去更新文档,新浪的文档里还说客户端必须设置回调页,我没设置也抓取到数据了,S..B新浪.

 

总结:

1.不用官方SDK,自己动手写网络部分代码时,回调页有没有无所谓如果有要一致,签名包名什么的跟我没关系.

2.拿不到code说明回调页不一致或者url拼写错误,如果都不是检查当前登录账号是否已设置为测试账号.

3.AFN框架需要几个框架要加进去.

4.新浪2..B.