ios解析优酷视频地址

客户端解析优酷等三方网站的真实的播放地址。

解析优酷真实的地址,只需要获取到优酷的网页的播放地址即可。

流程:1)获取到视频在网页上的地址

            2)获取需要的参数拼接完整的API

            3)获取真实的视频地址(需要手动拼接cookie,需要验证cokkie)


第一步:拼接需要的API:(后面用于获取真实的播放地址)

NSString * playApi = @"https://ups.youku.com/ups/get.json?vid=%@&ccode=0508&client_ip=192.168.1.1&utid=%@&client_ts=%d";

需要注意的是:ccode优酷会间隔一段时间去更新这个参数。如果不能解析,那么去网上找一下最新的ccode。

1)将网页链接地址传入下面的方法,获取到参数vid

-(NSString*)comIdFlagStr:(NSString*)url{

    NSString* str =nil;

    if([RemoveEmpt removeEmptWithString:url].length>0)    {

        NSArray* strArr = [url componentsSeparatedByString:@"id_"];

        if(strArr.count>1)        {

            NSArray* neArry = [[strArr lastObject] componentsSeparatedByString:@".html"];

            if(neArry.count>1)            {

                str = [neArry firstObject];

            }

        }

    }

    returnstr;

}

2)获取utid参数。

#define utidURL @"https://log.mmstat.com/eg.js";

-(NSString*)comETag{

    NSString* etgm =nil;

    NSString* utidURLStr =utidURL;

    NSURL* url = [NSURL URLWithString:utidURLStr];

    NSError*error;

    NSStringEncoding encoding;

    NSString * dataString = [[NSString alloc] initWithContentsOfURL:urlusedEncoding:&encoding error:&error];

    NSArray *  arr = [dataString componentsSeparatedByString:@";"];

    for(NSString* str in arr)    {

        if([str hasPrefix:@"goldlog.Etag"])        {

            NSString * etag = [[str componentsSeparatedByString:@"="] lastObject];

            NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、[]{}#%-*+=_\\|~<>$€^•'@#$%^&*()_+'\""];

            etag = [etag stringByTrimmingCharactersInSet:set];

            etgm = etag;

            break;

        }

    }

    returnetgm;

}

3)拼接clients_ts参数

NSDate* date = [NSDatedate];

 NSInteger index = (NSInteger)date.timeIntervalSince1970;

4)拼接完整的api

二:获取真实的地址

1)需要先拼接cookie,用于验证信息

-(NSMutableDictionary *)cookDic{

    if(!_cookDic)    {

        _cookDic = [[NSMutableDictionary alloc] init];

        [_cookDicsetObject:[self getYsuid:3] forKey:NSHTTPCookieValue];

        [_cookDic setValue:[NSDate dateWithTimeIntervalSinceNow:60*60*24] forKey:NSHTTPCookieExpires];

        [_cookDic setValue:@"http://www.youku.com" forKey:NSHTTPCookieName];

        [_cookDic setValue:@"www.youku.com" forKey:NSHTTPCookieDomain];

        [_cookDic setValue:@"0" forKey:NSHTTPCookieVersion];

        [_cookDic setValue:@"www.youku.com" forKey:NSHTTPCookiePath];

    }

    return _cookDic;

}

2)获取ysuid参数

-(NSString*)getYsuid:(NSInteger)length{

    NSString* ysuid  =@"";

    NSString * source = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    NSMutableString * str = [[NSMutableString alloc] init];

   for(int i=0; i

        NSInteger number =arc4random()%52;

        NSString* sourceStr = [source substringWithRange:NSMakeRange(number,1)];

        [str appendString:sourceStr];

    }

    NSInteger timeVal = [NSDate date].timeIntervalSince1970;

    NSString* yu = [NSString stringWithFormat:@"%ld%@",(long)timeVal,str];

    ysuid = yu;

    return ysuid;

}

3)baseUrl就是网页地址

-(void)getVideoMessage:(NSString*)api{

    [self.videoTSArr removeAllObjects];

    //获取cookie

    NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:self.cookDic];

    NSArray * cookies=[NSArray arrayWithObjects:cookie,nil];

    NSDictionary * headers=[NSHTTPCookie requestHeaderFieldsWithCookies:cookies];


    AFHTTPSessionManager * afMn = [AFHTTPSessionManager manager];

    afMn.responseSerializer = [AFHTTPResponseSerializer serializer];

    [afMn.requestSerializer setValue:self.baseUrl forHTTPHeaderField:@"Referer"];

    [afMn.requestSerializer setValue:[headersobjectForKey:@"Cookie"] forHTTPHeaderField:@"Cookie"];

    [afMnGET:api parameters:nil progress:^(NSProgress*_Nonnull downloadProgress) {

    }success:^(NSURLSessionDataTask *_Nonnull task,id  _Nullable responseObject) {

        NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

        NSDictionary* videoDic = [dic objectForKey:@"data"];

        if([videoDic objectForKey:@"error"]!=NULL)   {

            NSLog(@"%@",[[videoDic objectForKey:@"error"]objectForKey:@"note"]);

            self.anLyBlock([NSMutableArray array]);

        }

        else {

            NSArray* streamArr = [videoDic objectForKey:@"stream"];

            for(NSDictionary* item in streamArr)//视频.ts地址 {

                if(![[item objectForKey:@"audio_lang"]isEqualToString:@"guoyu"])continue;

                VideoModel* video = [VideoModelnew];

                video.srcUrl=  api;

                video.videoUrl= [item objectForKey:@"m3u8_url"];

                video.size= [[item objectForKey:@"size"]integerValue];

                video.streamType= [item objectForKey:@"stream_type"];

                video.videoMilliseconds= [[item objectForKey:@"milliseconds_video"]integerValue];

                video.hdtv= [self hdtv:[item objectForKey:@"stream_type"]];

                [self.videoTSArr addObject:video];

            }

            if(self.videoTSArr.count<=0){

                for(NSDictionary* item in streamArr) {

                    VideoModel* video = [VideoModel  new];

                    video.srcUrl=  api;

                    video.videoUrl= [item  objectForKey:@"m3u8_url"];

                    video.size= [[item  objectForKey:@"size"]integerValue];

                    video.streamType= [item  objectForKey:@"stream_type"];

                    video.videoMilliseconds= [[item  objectForKey:@"milliseconds_video"]integerValue];

                    video.hdtv= [self  hdtv:[item  objectForKey:@"stream_type"]];

                    [self.videoTSArr  addObject:video];

                }

            }

            self.anLyBlock(self.videoTSArr);

        }

    }failure:^(NSURLSessionDataTask * _Nullable task,NSError * _Nonnull error) {

        //失败

        if(self.anLyBlock)

            self.anLyBlock([NSMutableArray array]);

    }];

}

判断清晰度

-(NSString*)hdtv:(NSString*)type{

    NSString* ht =@"h1";

    if([type isEqualToString:@"hd3"])

        ht =@"1";

    else if([type  isEqualToString:@"hd2"])

        ht =@"2";

    else if([type isEqualToString:@"mp4hd"]||

             [type isEqualToString:@"mp4"])

        ht =@"3";

    else if([type  isEqualToString:@"mp4hd3"]||

             [type  isEqualToString:@"mp4hd2"]||

             [type  isEqualToString:@"flvhd"]||

             [type  isEqualToString:@"flv"])

        ht =@"4";

    else if([type  isEqualToString:@"3gphd"])

        ht =@"5";

    else if([type  isEqualToString:@"3gp"])

        ht =@"6";

    return ht;

}

这就完整的解析出来真正的播放地址

后面会补充解析乐视的地址

如有不合理的地方,请斧正。

申明:这只是自己的一些研究而已,请不要用于商业用途。如果影响到你的利益,请联系我。

你可能感兴趣的:(ios解析优酷视频地址)