如何從html格式檔案中獲取M3u8的介面
阿新 • • 發佈:2019-02-05
一般的移動端的開發介面都是固定的,比如一個連線http://www.baidu,com/vide.///請求過來的資料是json或者是xml格式檔案 但是也有是webViewd的介面這樣的話我們不免會一頭霧水,如何下手獲取我們想要的介面呢 ,下面一個例子說明一下HTML中獲取M3u8連線
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @class URLRetreive; @protocol URLRetreiveDelegate <NSObject>//自定義協議 - (void)retreiveDidFinshedWithURLString:(NSString *)urlString;//獲取連線方法 - (void)retreiveDidFailedWithError:(NSError *)error;//出錯方法 @end @interface URLRetreive : NSObject @property (nonatomic, assign) id<URLRetreiveDelegate> delegate;//設定代理屬性 @property (nonatomic, strong) NSString *videoOriginalUrlString;//視訊的原始地址 @property (nonatomic, strong) NSString *errorMessage; + (id)retreive;//單例方法 - (void)start;//開始解析
#import "URLRetreive.h" @interface URLRetreive ()<UIWebViewDelegate> @property (nonatomic, strong) UIWebView *webContent;//載入網頁原始碼,並解析 - (void)_loadWebContent;//載入網頁內容方法 - (void)_retreiveURL;//解析網頁 @end @implementation URLRetreive + (id)retreive{ static URLRetreive *retreive = nil; if (retreive == nil) { retreive = [[URLRetreive alloc] init]; } return retreive; } - (void)start{ [self _loadWebContent]; self.errorMessage = nil; } - (void)_loadWebContent{ self.webContent = [[UIWebView alloc] init]; self.webContent.delegate = self; NSURL *url = [NSURL URLWithString:self.videoOriginalUrlString]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); [self.webContent loadData:data MIMEType:@"text/html" textEncodingName:@"gbk" baseURL:url]; }]; } - (void)_retreiveURL{ NSString *m3u8Url = [self.webContent stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"video\").src"]; //判斷是否是真實的m3u8地址 NSRange range = [m3u8Url rangeOfString:@"m3u8"]; if (range.length != 0) { if (self.delegate && [self.delegate respondsToSelector:@selector(retreiveDidFinshedWithURLString:)]) { [self.delegate retreiveDidFinshedWithURLString:m3u8Url]; } } //如果視訊正在稽核,無法觀看,需要主動提示給使用者 NSString *errorMsg = [self.webContent stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"msg\").innerHTML"]; if (errorMsg.length != 0) { @synchronized(self.errorMessage){ if (!self.errorMessage) { self.errorMessage = [errorMsg stringByReplacingOccurrencesOfString:@"<br>" withString:@"\r\n"]; NSLog(@"錯誤資訊 = %@", self.errorMessage); NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:0 userInfo:@{@"errorMessage": self.errorMessage}]; if (self.delegate && [self.delegate respondsToSelector:@selector(retreiveDidFailedWithError:)]) { [self.delegate retreiveDidFailedWithError:error]; } } } } } #pragma mark UIWebview Delegate Methods - - (void)webViewDidFinishLoad:(UIWebView *)webView{ //網頁載入完成,開始解析地址 [self _retreiveURL]; } - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ if (self.delegate && [self.delegate respondsToSelector:@selector(retreiveDidFailedWithError:)]) { [self.delegate retreiveDidFailedWithError:error]; } } @end
使用
<pre name="code" class="objc"> URLRetreive *urret = [URLRetreive retreive];
urret.videoOriginalUrlString = @"http://v.youku.com/v_show/id_XOTU4MDAwODI0_ev_1.html";
urret.delegate = self;
[urret start];
實現代理方法
- (void)retreiveDidFinshedWithURLString:(NSString *)urlString { NSLog(@"22222"); NSLog(@"%@", urlString); } - (void)retreiveDidFailedWithError:(NSError *)error { NSLog(@"%@", error); }