思路和前面解析其它視頻網(wǎng)站的差不多竞思,都是一層層的撥開隱藏的東西表谊,獲取到真正的視頻地址。
1)需要準(zhǔn)備視頻網(wǎng)址盖喷。
2)一些驗證碼解析視頻固定的參數(shù)
3)從網(wǎng)址的地址中獲取需要的參數(shù)
4)解析視頻的鏈接地址
一)準(zhǔn)備參數(shù)(一些需要驗證的參數(shù))
self.scUrl= url;
self.MD5_KEY = @"d5fb4bd9d50c4be6948c97edd7254b0e";
self.SRC = @"76f90cbd92f94a2e925d83e8ccd22cb7";?
NSString *htmlString = [NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error:nil];
?NSString * tvid = [[[[[self matchString:htmlString toRegexString:@"data-(?:player|shareplattrigger)-tvid\\s*=\\s*[\\'\"](\\d+)"] firstObject] componentsSeparatedByString:@"="] lastObject] substringFromIndex:1];
?NSString * videoId = [[[[[self matchString:htmlString toRegexString:@"data-(?:player|shareplattrigger)-videoid\\s*=\\s*[\\'\"]([a-f\\d]+)"] firstObject] componentsSeparatedByString:@"="] lastObject] substringFromIndex:1];?
2)上步中用到了利用正則表達式去獲取到想要的信息
-(NSArray*)matchString:(NSString*)string toRegexString:(NSString*)regexStr{
? ? NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:nil];
? ? NSArray* matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [stringlength])];
? ? //match: 所有匹配到的字符,根據(jù)() 包含級
? ? NSMutableArray *array = [NSMutableArray array];
? ? for(NSTextCheckingResult * match in matches) {
? ? ? ? for(inti =0; i < [match numberOfRanges]; i++) {
? ? ? ? ? ? //以正則中的(),劃分成不同的匹配部分
? ? ? ? ? ? NSString * component = [string substringWithRange:[match rangeAtIndex:i]];
? ? ? ? ? ? [array addObject:component];
? ? ? ? }
? ? }
? ? return array;
)
二)拼接需要的解析視頻的地址
1)拼接地址
-(NSString*)rawDaTa:(NSString*)tvid videoId:(NSString*)videoId{
? ? NSString* raw =@"";
? ? NSString * time =[NSString stringWithFormat:@"%ld",(long)[NSDate date].timeIntervalSince1970];
? ? NSString* pa = [NSString stringWithFormat:@"%@%@%@",time,self.MD5_KEY,tvid];
? ? NSString* sc = [XJMD5 MD5ForLower32Bate:pa];
? ? self.api = @"http://cache.m.iqiyi.com/jp/tmts/%@/%@/?tvid=%@&vid=%@&src=%@&sc=%@&t=%@";
? ? raw = [NSString stringWithFormat:self.api,tvid,videoId,tvid,videoId,self.SRC,sc,time];
? ? return raw;
}
2)獲取到地址后爆办,就能直接去進行網(wǎng)絡(luò)請求,然后解析反回來的json數(shù)據(jù)课梳,獲取到視頻真正的地址
-(void)getVideoData:(NSString*)url{
? ? AFHTTPSessionManager * mn = [AFHTTPSessionManager manager];
? ? mn.responseSerializer = [AFHTTPResponseSerializer serializer];
? ? [mn GET:url parameters:nil progress:^(NSProgress *_Nonnull downloadProgress) {
? ? } success:^(NSURLSessionDataTask *_Nonnull task,id? _Nullable responseObject) {
? ? ? ? NSString * str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
? ? ? ? NSString * reStr = [str stringByReplacingOccurrencesOfString:@"var tvInfoJs="withString:@""];
? ? ? ? NSData * data = [reStr dataUsingEncoding:NSUTF8StringEncoding];
? ? ? ? NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
? ? ? ? if(![[dic objectForKey:@"code"] isEqualToString:@"A00000"])//error ?{
? ? ? ? ? ? self.anLyBlock([NSMutableArray array]);
? ? ? ? }
? ? ? ? else {
? ? ? ? ? ? NSArray * ary = [[dic objectForKey:@"data"] objectForKey:@"vidl"];
? ? ? ? ? ? NSMutableArray * videoAry = [[NSMutableArray alloc] init];
? ? ? ? ? ? //這里獲取第一個視頻的地址
? ? ? ? ? ? NSDictionary * videoDic = [ary firstObject];
? ? ? ? ? ? VideoModel * video = [VideoModel new];
? ? ? ? ? ? video.videoUrl = [videoDic objectForKey:@"m3utx"];
? ? ? ? ? ? video.srcUrl =self.scUrl;
? ? ? ? ? ? [videoAry addObject:video];
? ? ? ? ? ? if(self.anLyBlock)
? ? ? ? ? ? self.anLyBlock(videoAry);
? ? ? ? }
? ? } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
? ? ? ? if(self.anLyBlock)
? ? ? ? self.anLyBlock([NSMutableArray array]);
? ? }];
}
上面的解析方法中距辆,可能會有一些參數(shù)會被愛奇藝修改掉。如果解析不成功暮刃,看看是否是參數(shù)的問題跨算。
申明:這只是自己的一些研究而已,請不要用于商業(yè)用途椭懊。如果影響到你的利益诸蚕,請聯(lián)系我。