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<length;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;

}

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,271评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,533评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,580评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,203评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,204评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,664评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,014评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,991评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,536评论 1 326
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,558评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,678评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,267评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,997评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,429评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,580评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,259评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,744评论 2 366

推荐阅读更多精彩内容