web-dev-qa-db-ja.com

AVplayerを検出し、WKWebViewから現在のビデオのURLを取得する方法

UIWebViewからURLを抽出するために以下のコードを使用しています:正常に機能していますが、この同じコードでを使用していますWKWebView機能しなくなりました。誰か助けてもらえますか? WKWebViewで再生されるビデオは、フルスクリーンではなくInlineplacybackです。

私のコードは:

 NotificationCenter.default.addObserver(self, selector: #selector(self.playerItemBecameCurrent(_:)), name: NSNotification.Name("AVPlayerItemBecameCurrentNotification"), object: nil)

 @objc func playerItemBecameCurrent(_ sender : NSNotification){
    let playerItem: AVPlayerItem? = sender.object as? AVPlayerItem
    if playerItem == nil {
        print("player item nil")
        return
    }
    // Break down the AVPlayerItem to get to the path
    let asset = playerItem?.asset as? AVURLAsset
    let url: URL? = asset?.url
    let path = url?.absoluteString

    print(path!,"video url")
}

応答URL:

https://r2---sn-po4g5uxa-5hql.googlevideo.com/videoplayback?txp=5531432&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime% = 0 2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&IP = 103.37.181.55&ratebypass = ID&はい= O-AM9UWIaxopyYZX4gikGuswG8EMi3dhH_PPBMIqY5cbXj&期限切れ= 1554400796&C = MWEB&fvip = 4&initcwndbps = 481250&ipbits&MIMEはビデオ%2Fmp4&DUR = 60.093&LMT = 1554142002789460&キー=を= yt6&MT = 1554379078&ITAG 18&ソース=ユーチューブ&GIR = YES&requiressl = YES&署名= 6C68366FC249958BB8E95A5D88074FF8BCB99745.DA113E66DD0B46863BAE52DAA3CAB31FD141F0E5&クレン= 2708520&MM = 31%2C29&MN = SN-po4g5uxa-5hql%2Csn-cvh7knek&EI = vPGlXPOWHIWD8QOO1KBo&MS = AU%2Crdu&PCM2 = NO&PL = 24&MV = M&CPN = I9d32bNmeq3kf0jn&CVER = 2.20190403&PTK = youtube_none&pltypeを= = contentugc

動画URLはWebページのURLではないので、取得方法を教えてください。ありがとう。

8
Virani Vivek

これは一種のハックですが、これを達成するために私が見つけた唯一の方法です。

まず、自分をWKWebViewナビゲーションデリゲートとして設定します:

self.webView?.navigationDelegate = self

これで、すべてのナビゲーションの変更をリッスンし、要求されたURLを保存します:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let urlStr = navigationAction.request.url?.absoluteString {
            //Save presented URL
            //Full path can be accessed via self.webview.url
        }

        decisionHandler(.allow)
    }

ここで必要になるのは、新しい画面がいつ表示されるようになるかを知り、保存したURLを使用することだけです(新しい表示画面のビデオURLを知るため)。

IWindowDidBecomeVisibleNotification通知を聞くことでこれを行うことができます:

NotificationCenter.default.addObserver(self, selector: #selector(windowDidBecomeVisibleNotification(notif:)), name: NSNotification.Name("UIWindowDidBecomeVisibleNotification"), object: nil)

次に、ナビゲーションウィンドウが自分のウィンドウでないかどうかを確認します。これは、新しい画面が開いたことを意味します。

@objc func windowDidBecomeVisibleNotification(notif: Notification) {
        if let isWindow = notif.object as? UIWindow {
            if (isWindow !== self.view.window) {
            print("New window did open, check what is the currect URL")
            }
        }
    }
9
MCMatan

wKNavigationDelegateのwebView(_:decidePolicyFor:decisionHandler :)メソッドのナビゲーションアクションのリクエストプロパティから完全なURLを取得します。

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if let urlStr = navigationAction.request.url?.absoluteString {
        //urlStr is your URL
    }

    decisionHandler(.allow)
}

また、プロトコルに準拠することを忘れないでください

webView.navigationDelegate = self
3
NavinBagul

ここに示すように、WKWebViewにJSを挿入することを試みることができます: https://paulofierro.com/blog/2015/10/12/listening-for-video-playback-within-a- wkwebview

2
Zaphod

Swiftの使用

以下のコードを使用して、webviewのURLからhtmlコンテンツを取得できます

let docString = webView.stringByEvaluatingJavaScriptFromString("document.documentElement.outerHTML")

この場合、HTMLコンテンツ全体が取得されます。

次に、html文字列内のhrefリンクを探します

let regex = try! NSRegularExpression(pattern: "<a[^>]+href=\"(.*?)\"[^>]*>")
let range = NSMakeRange(0, docString.characters.count)
let matches = regex.matches(in: docString, range: range)
for match in matches {
    let htmlLessString = (docString as NSString).substring(with: match.rangeAt(1))
    print(htmlLessString)
}

使用してYouTubeのURLかどうかを確認してください

正規表現: "@https?://(www。)?youtube.com/。[^\s。、"\'] + @ i "

これを達成する別の方法

ボックスの外側を考えてください!

Apiを呼び出してURLを取得できます。これは、php、.netなどのWeb言語を使用するとかなり簡単に思えます。

PHPでWebページ内のすべてのURLを取得するためのコード(必要な言語を使用してください)

$url="http://wwww.somewhere.com";
$data=file_get_contents($url);
$data = strip_tags($data,"<a>");
$d = preg_split("/<\/a>/",$data);
foreach ( $d as $k=>$u ){
    if( strpos($u, "<a href=") !== FALSE ){
        $u = preg_replace("/.*<a\s+href=\"/sm","",$u);
        $u = preg_replace("/\".*/","",$u);
        print $u."\n";
    }
}

YoutubeのURLなら一つずつチェックする。

$sText =  "Check out my latest video here http://www.youtube.com/?123";
preg_match_all('@https?://(www\.)?youtube.com/.[^\s.,"\']+@i', $sText, $aMatches);
var_dump($aMatches);

サンプルアプリが同じメソッドを使用しているかどうかを確認したい場合は、Webデバッグプロキシを入手して、Digを実行します

上記の説明の多くは他のサイトからのものです。

私はそれがあなたの必要性を要約することを願っています!幸せなコーディング!

2
Saranjith

これをViewControllerで試して、WKWebViewにURL Observerを追加します。

override func loadView() {
    let webConfig = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero, configuration: webConfig)
    webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
    view = webView
}

ObserveValueをオーバーライドしてURLリクエストを取得します。

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == #keyPath(WKWebView.url) {
        let urlRequest:String = webView.url?.absoluteString ?? ""
        print(urlRequest)
    }
}

最後に...オブザーバーを終了します:

deinit { webView.removeObserver(self, forKeyPath: "URL") }
1
cassiodiego