web-dev-qa-db-fra.com

Comment détecter AVplayer et obtenir l'url de la vidéo actuelle de WKWebView?

J'utilise le code ci-dessous pour extraire l'url de UIWebView : cela fonctionne très bien mais, ce même code utilisant pour WKWebView cela ne fonctionne plus. Quelqu'un peut-il m'aider? La vidéo lue dans WKWebView est Inlineplacyback pas en plein écran.

Mon code est:

 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 de réponse:

https://r2---sn-po4g5uxa-5hql.googlevideo.com/videoplayback?txp=5531432&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clm% 2Cmm% 2Cmn% 2cms% 2Cmv% 2Cpcm2% 2Cpl% 2Cratebypass% 2Crequiressl% 2Csource% 2Cexpire & ip = 103.37.181.55 & ratebypass = yes & id = o-AM9UWIaxopyYZX4gikGuswG8EMi3dhH_PPBMIqY5cbXj & expirent = 1554400796 & c = MWEB & FVIP = 4 & initcwndbps = 481250 & ipbits = 0 & mime = vidéo% 2Fmp4 et dur = 60.093 & LMT = 1554142002789460 & key = yt6 & mt = 1554379078 & itag = 18 & source = youtube & gir = yes & requireSSL = yes & signature = 6C68366FC249958BB8E95A5D88074FF8BCB99745.DA113E66DD0B46863BAE52DAA3CAB31FD141F0E5 & clen = 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

Il s'agit de l'URL de la vidéo et non de l'URL de la page Web, alors aidez-moi à l'obtenir. Merci.

8
Virani Vivek

C'est une sorte de piratage, mais le seul moyen que j'ai trouvé pour y parvenir.

Définissez-vous d'abord comme délégué de navigation WKWebView:

self.webView?.navigationDelegate = self

Écoutez maintenant toutes les modifications de navigation et enregistrez l'url demandée:

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)
    }

Maintenant, il vous suffit de savoir quand le nouvel écran devient visible et d'utiliser l'URL que vous avez enregistrée (pour connaître l'URL vidéo du nouvel écran visible).

Vous pouvez le faire en écoutant IWindowDidBecomeVisibleNotification notification:

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

Vérifiez ensuite si la fenêtre de navigation n'est pas la vôtre, et cela signifie qu'un nouvel écran s'est ouvert:

@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

récupère l'URL complète dans la propriété request de l'action de navigation dans la méthode WKNavigationDelegate de la vue Web (_: decidePolicyFor: decisionHandler :).

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

    decisionHandler(.allow)
}

n'oubliez pas non plus de se conformer au protocole

webView.navigationDelegate = self
3
NavinBagul

Vous pouvez essayer d'injecter JS dans votre WKWebView comme indiqué ici: https://paulofierro.com/blog/2015/10/12/listening-for-video-playback-within-a- wkwebview

2
Zaphod

Utilisation de Swift

Vous pouvez obtenir le contenu html à partir de l'URL de la vue Web en utilisant le code ci-dessous

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

Dans ce cas, vous obtiendrez tout le contenu html,

Recherchez ensuite les liens href à l'intérieur de la chaîne html

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)
}

Vérifiez s'il s'agit d'une URL YouTube en utilisant

Expression régulière: "@https?: // (www.)? Youtube.com/. [^\S.,"\'] + @ I "

Une autre façon d'y parvenir

Sortez des sentiers battus!

Vous pouvez effectuer un appel API pour obtenir l'URL. Cela semble assez facile en utilisant les langages web comme php, .net etc.

Le code pour obtenir toutes les URL dans une page Web en PHP (Utilisez la langue qui vous convient)

$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";
    }
}

Pour vérifier un par un s'il s'agit d'une URL YouTube.

$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);

Si vous vouliez vérifier si les exemples d'applications utilisent la même méthode, obtenez un proxy de débogage Web et creusez dessus

Beaucoup des explications ci-dessus sont tirées d'autres sites.

J'espère que cela résume votre besoin! Bon codage!

2
Saranjith

Essayez ceci dans votre ViewController, pour ajouter un observateur d'URL sur WKWebView:

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

Substitution de la valeur observeValue pour obtenir la demande d'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)
    }
}

Enfin ... déinit l'Observateur:

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