ios解析優(yōu)酷視頻地址

客戶端解析優(yōu)酷等三方網(wǎng)站的真實(shí)的播放地址。

解析優(yōu)酷真實(shí)的地址,只需要獲取到優(yōu)酷的網(wǎng)頁(yè)的播放地址即可。

流程:1)獲取到視頻在網(wǎng)頁(yè)上的地址

? ? ? ? ? ? 2)獲取需要的參數(shù)拼接完整的API

????????????3)獲取真實(shí)的視頻地址(需要手動(dòng)拼接cookie,需要驗(yàn)證cokkie)


第一步:拼接需要的API:(后面用于獲取真實(shí)的播放地址)

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

需要注意的是:ccode優(yōu)酷會(huì)間隔一段時(shí)間去更新這個(gè)參數(shù)。如果不能解析,那么去網(wǎng)上找一下最新的ccode。

1)將網(wǎng)頁(yè)鏈接地址傳入下面的方法,獲取到參數(shù)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參數(shù)。

#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參數(shù)

NSDate* date = [NSDatedate];

?NSInteger index = (NSInteger)date.timeIntervalSince1970;

4)拼接完整的api

二:獲取真實(shí)的地址

1)需要先拼接cookie,用于驗(yàn)證信息

-(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參數(shù)

-(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就是網(wǎng)頁(yè)地址

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

}

這就完整的解析出來(lái)真正的播放地址

后面會(huì)補(bǔ)充解析樂(lè)視的地址

如有不合理的地方,請(qǐng)斧正。

申明:這只是自己的一些研究而已,請(qǐng)不要用于商業(yè)用途。如果影響到你的利益,請(qǐng)聯(lián)系我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容