客戶端解析優(yōu)酷等三方網(wǎng)站的真實的播放地址。
解析優(yōu)酷真實的地址剃诅,只需要獲取到優(yōu)酷的網(wǎng)頁的播放地址即可巷送。
流程:1)獲取到視頻在網(wǎng)頁上的地址
? ? ? ? ? ? 2)獲取需要的參數(shù)拼接完整的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優(yōu)酷會間隔一段時間去更新這個參數(shù)矛辕。如果不能解析笑跛,那么去網(wǎng)上找一下最新的ccode。
1)將網(wǎng)頁鏈接地址傳入下面的方法,獲取到參數(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
二:獲取真實的地址
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參數(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)頁地址
-(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;
}
這就完整的解析出來真正的播放地址
后面會補(bǔ)充解析樂視的地址
如有不合理的地方陈哑,請斧正。
申明:這只是自己的一些研究而已妖胀,請不要用于商業(yè)用途芥颈。如果影響到你的利益惠勒,請聯(lián)系我赚抡。