在开发社交类app时,我们常常需要和新浪微博打交道,获取微博信息。前几天在项目中想要把微博更新内容作为数据源,但是之前除了使用ShareSDK分享信息到微博外,没有试过读取数据。在新浪提供给我们的接口当中,使用第三方OAuth授权可以帮助我们轻松的获取需要的数据,但是OAuth授权似乎有些麻烦,网上也暂时没看到完整的教学过程,于是打算自己写一篇完整的操作过程。首先,新浪微博提供获取了数据的接口,接口类型为GET请求,请求链接如下:
这是获取数据的四个接口,我们要使用的是第二个statuses/friends_timeline,接口的参数内容包括了
由于应用不直接登录新浪微博,所以我们需要借助OAuth2.0来获取授权码允许我们接收数据。因此需要的参数为access_token、count、page三个参数。第一个就是使用OAuth授权的,因此,我们先来看看获取授权码的接口:
这个请求也是GET请求,链接参数如下:
上面参数中的client_id、redirect_uri是必须加载链接上的,分别是申请新浪微博分享应用的appKey和授权回调地址,没有的自行百度(使用ShareSDK分享到新浪微博)。官网下面给了我们一个请求实例
参数自行对应,有了链接我们就要开始代码了,下面的代码不会涉及数据的解析和tableView的协议函数。我们还需要一个UIWebView来完成我们的授权码请求,UIWebView的请求如下:
<span style="font-size:14px;">- (void)getAccredit
{
NSString * oauthURL = @"https://api.weibo.com/oauth2/authorize?client_id=281311494&redirect_uri=http://www.baidu.com&response_type=code&display=mobile";
UIWebView * webView = [[UIWebView alloc] initWithFrame: CGRectMake(0, 64, CGRectGetWidth(self.view.bounds), [UIScreen mainScreen].bounds.size.height - 64)];
webView.delegate = self;
NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: oauthURL]];
[webView loadRequest: request];
[self.navigationController.view addSubview: webView];
}</span>
首先我们要知道这个UIWebView作为一个临时存在的请求授权码的控件,后面肯定是要移除出父视图的,而且这个链接也不会直接就返回授权码给我们,我们还要在webView中先登录。webView会在每一次链接页面加载之后调用协议方法,所以我们需要判断加载链接的结果是否为我们需要返回的数据,如果是我们需要的数据,那么数据字符串将以我们的授权回调地址开头(比如我的回调地址是http://www.baidu.com),那么回调的正确结果是http://www.baidu.com/?………,所以协议方法如下:
<span style="font-size:14px;">- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString * absoluteStr = webView.request.URL.absoluteString;
if ([absoluteStr hasPrefix: @"http://www.baidu.com/?"]) {
[webView removeFromSuperview];
NSRange range = [absoluteStr rangeOfString: @"code="];
if (range.location != NSNotFound) {
NSString * code = [absoluteStr substringFromIndex: range.location + range.length];
__weak typeof(self) weakSelf = self;
LXDNetworkRequest * networkRequest = [LXDNetworkRequest new];
[networkRequest postRequestJSONWithMainURL: getAccessTokenMainURL() params: getAccessTokenParam(kAppKey, kAppSecret, code, kRedirectURI) completionHandler: ^(NSDictionary *receiveData) {
[weakSelf getAccessTokenFromData: receiveData];
} failedHandler: ^(NSError *error) {
NSLog(@"%@", error);
}];
}
}
}</span>
在确保返回正确的结果之后我们移除了UIWebView,code后面的一段字符串就是我们需要的数据,但是这个数据还不是我们最终需要的授权码,我们还需要进行一次数据请求,返回后的NSDictionary中就有我们需要的授权码。这个请求是POST请求,我使用了自身封装的请求类来请求,链接的接口和部分链接地址函数如下:
<span style="font-size:14px;">static inline NSString * getAccessTokenMainURL()
{
return @"https://api.weibo.com/oauth2/access_token";
}</span>
<span style="font-size:14px;">static inline NSString * getAccessTokenParam(NSString * appKey, NSString * appSecret, NSString * code, NSString * redirectURI)
{
return [NSString stringWithFormat: @"client_id=%@&client_secret=%@&grant_type=authorization_code&code=%@&redirect_uri=%@", appKey, appSecret, code, redirectURI];
}</span>
这次的请求就完成了我们需要的授权码,然后回到最开始的新浪微博数据请求链接,我们可以通过下面的链接获取我们需要的数据:
<span style="font-size:14px;">static inline NSString * getSinaInfoURL(NSString * access_token, int count, int page)
{
return [NSString stringWithFormat: @"https://api.weibo.com/2/statuses/friends_timeline.json?access_token=%@&count=%d&page=%d", access_token, count, page];
}</span>
参数1为授权码,参数2为请求一次获取的文章数目,参数3为请求的页码数
下面送上app的效果: