使用OAuth2.0授权访问新浪微博数据

在开发社交类app时,我们常常需要和新浪微博打交道,获取微博信息。前几天在项目中想要把微博更新内容作为数据源,但是之前除了使用ShareSDK分享信息到微博外,没有试过读取数据。在新浪提供给我们的接口当中,使用第三方OAuth授权可以帮助我们轻松的获取需要的数据,但是OAuth授权似乎有些麻烦,网上也暂时没看到完整的教学过程,于是打算自己写一篇完整的操作过程。首先,新浪微博提供获取了数据的接口,接口类型为GET请求,请求链接如下:

这是获取数据的四个接口,我们要使用的是第二个statuses/friends_timeline,接口的参数内容包括了

由于应用不直接登录新浪微博,所以我们需要借助OAuth2.0来获取授权码允许我们接收数据。因此需要的参数为access_tokencountpage三个参数。第一个就是使用OAuth授权的,因此,我们先来看看获取授权码的接口:

这个请求也是GET请求,链接参数如下:

上面参数中的client_idredirect_uri是必须加载链接上的,分别是申请新浪微博分享应用的appKey授权回调地址,没有的自行百度(使用ShareSDK分享到新浪微博)。官网下面给了我们一个请求实例

https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com/response&response_type=code

参数自行对应,有了链接我们就要开始代码了,下面的代码不会涉及数据的解析和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的效果:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值