如何使用 C# 获取 .mp4 视频的直接 URL?

Posted

技术标签:

【中文标题】如何使用 C# 获取 .mp4 视频的直接 URL?【英文标题】:How do I get direct URL of the .mp4 video using C#? 【发布时间】:2016-01-12 16:49:11 【问题描述】:

我需要某种可以从 mp4engine 中提取链接的算法。

Here is the example of a page I want to scrap.

在这种情况下,所需的输出是:http://mp4engine.com:182/d/a2chmyndcqqgkpskitclvbgu5pgwxve2vmlrdsctpwbte2flb4i4hrz6/.hack_Roots (Dub) Episode 001-360p.mp4

我尝试使用htmlAgilityPack 获取播放器代码,但它是p,a,c,k,e,d,我无法在我的C# Windows Phone 8.1 项目中执行它。想过用Jurassic包来执行JS,但是WinPhone8.1好像不行

这是我使用 HAP 获得的脚本:

<script type='text/javascript'>eval(function(p,a,c,k,e,d)while(c--    )if(k[c])p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c]);return p ('15("14").13(f:"0://2.1:e/d/c/.b (a) 9 8- 7.6",12:"0://2.1/4/h.g",11:"0://2.1/i/10/z.y",x:"w",v:u,t:s,5:"0",r:"0://2.1/4/q /p",o:[3:"n",m:"0://2.1/4/h.g",3:"l",k:f:\'0://2.1:e/d/c/.b (a) 9 8- 7.6\',\'5\':\'0\',3:"j"],);',36,42,'http|com|mp4engine|type|player|provider|mp4|360p|001|Episode|Dub|hack_Roots|a2chmyndcqqgkpskitclvbgu5pgwxve2vmlrdsctpwbte2flb4i4hrz6||182|file|swf|jw6||download|config|html5|src|flash|modes|six|skins|skin|420|height|722|width|1484|duration|jpg|hahgl235zwv2|00000|image|flashplayer|setup|flvplayer|jwplayer'.split('|')))

我也尝试过使用内置的 WebView 控件:

WebView wv = new WebView();
//... navigation to string and all that
var res = await wv.InvokeScriptAsync("eval", null);

不幸的是,该函数返回空字符串(res = ""

我还搜索了可以解码的base64 字符串,但页面似乎没有。

如何获取视频网址?

【问题讨论】:

【参考方案1】:

HtmlAgilityPack 只取静态 HTML 代码,需要执行动态内容(javascript)取数据。

你有三种方式:

1 - 在你的 c# 中为 javascript 实现一个美化代码(在这里你可以看到一个例子:http://jsbeautifier.org/)。在这种情况下并且仅针对您的情况,您可以提取视频网址,因为它在上面,但这并不常见。

2 - 使用 .net 网络浏览器连接到页面并执行 javascript 代码来抓取数据,在这种情况下,您的应用程序必须是 Windows 窗体应用程序。

3 - 使用无头浏览器连接到页面并执行 javascript 代码来抓取数据。你可以使用著名的 phatomjs。此处示例:C# example of using PhantomJS webdriver ExecutePhantomJS to filter out images

【讨论】:

【参考方案2】:

&lt;div id="player_code" ... 内,最后一个&lt;script&gt; 标记包含视频网址所在的混淆javascript 代码。这个site 可以取消混淆这段代码,结果将如下所示:

jwplayer("flvplayer").setup(
    file: "http://mp4engine.com:182/d/a2chmyndcqqgkpskitclvbgu5pgwxve2vmlrdsctpwbsg7asjwghgk4p/.hack_Roots (Dub) Episode 001-360p.mp4",
    flashplayer: "http://mp4engine.com/player/jw6.swf",
    image: "http://mp4engine.com/i/00000/hahgl235zwv2.jpg",
    duration: "1484",
    width: 722,
    height: 420,
    provider: "http",
    skin: "http://mp4engine.com/player/skins/six",
    modes: [
        type: "flash",
        src: "http://mp4engine.com/player/jw6.swf"
    , 
        type: "html5",
        config: 
            file: 'http://mp4engine.com:182/d/a2chmyndcqqgkpskitclvbgu5pgwxve2vmlrdsctpwbsg7asjwghgk4p/.hack_Roots (Dub) Episode 001-360p.mp4',
            'provider': 'http'
        
    , 
        type: "download"
    ],
);

如您所见,file: 包含视频 URL。因此,在您的 C# 代码中,您可以下载页面的 HTML 代码,在 &lt;div id="player_code" ... 中查找最后一个 &lt;script&gt; 标记,并使用同一站点上列出的 C# port 对其进行解混淆。

【讨论】:

以上是关于如何使用 C# 获取 .mp4 视频的直接 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Youtube v3 API 获取 Youtube 视频的 mp4 url

Android平台直接从URL播放mp4视频失败,有啥解决办法吗?

我想要一个 .mp4 格式的 vimeo 直接视频文件链接的示例 url。

如何将flv格式转换成mp4格式

如何在 android 中使用 facebook 复制 Url 获取 facebook 视频详细信息

如何使用远程 URL 在 Android 模拟器中播放 mp4 视频?