新浪微博开发获取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.