根据我的经验,你不能。但尽量让它更难下载。
浏览器让抓取变得太容易了
因为这就是浏览器的设计目的:提供内容 - 这意味着将内容提供给用户。为了向您展示它是多么容易,以下是我通常在几乎任何视频流媒体网站上抓取视频的方式:
准备好您喜欢的浏览器调试器的网络选项卡并让视频加载。然后在加载的资源中查找。视频通常以 .flv 或 .mp4 格式传输,音频以 .mp3 格式传输。当您发现 url 时,打开一个新选项卡/窗口并在那里打开链接。然后浏览器将下载该文件。
让它变得更难
这里有一些方法可以让抓取者的生活变得更加艰难。就像我之前说的,这些都不是万无一失的方法,但至少可以防止滑倒。
视频到画布技术
最近我在研究 JS 中的运动检测时,从 HTML5Doctor 看到了这篇文章。这涉及通过 a 流式传输您的视频,然后使用一些 JS 将视频复制到 a 。这是一个视频在前面的示例,而后面的画布则接收来自同一视频的数据。
基本上,你要做的是:
在 HTML 上预定义或动态插入 DOM。这是用户看到的“玩家”。
通过 JS 动态创建一个视频标签,将其附加到隐藏的 DOM 中,并给它一个 url 以进行流式传输。这将是画布的视频源。
然后使用 JS,您会定期从刚创建的数据中抓取数据并将其绘制到 .通过这一步,视频被馈送到画布上。
这是整个例程的基础。由于您的播放器现在是画布并且隐藏了真正的视频,您可以尝试右键单击所有您想要的并保存。由于画布的作用类似于页面上的图像,因此您只能保存画布上显示的帧的快照。至于控件,JS 有一个 API 用于控制,因此您可以创建自定义按钮和滑块。
但是,如果他们知道您正在这样做,他们会找到您隐藏的视频元素,而您就完蛋了。这导致我们在服务器端的帮助下找到了补充这种仅前端技术的下一个方法。
临时资源网址
您可以做的一件事来防止这种方法是防止链接被重复使用。使链接一次性、临时、一次性使用。播放器使用一次性 url 加载后,将其丢弃。使其无法使用。
类似于 CSRF 预防,当浏览器请求包含您的视频的页面时,让它生成一个随机令牌并将其存储在服务器端的某个存储中以供以后参考。同时,将其附加到视频的 url,如下所示:
//我们使用此 url 从您的网站加载一些 id 为 1234324 的视频
//并且页面加载时生成的令牌被附加为sid
http://yoursite.com/media.php?video_id=1234324&sid=a0s9d8a98a0d98asd09809wq0e9
现在,当您的播放器加载视频时,它将使用带有令牌的这个 url。让服务器验证令牌。
如果它很好,请流式传输视频并从服务器销毁令牌以避免重复使用。这实质上使 url “只使用一次”。如果使用了无效的令牌,则返回适当的标头作为响应,例如 403。
为了增加一点安全性,通过将其时间戳与令牌一起存储来强制 URL 过期。然后将请求时间戳与存储的时间戳进行比较,如果它仍在“使用窗口”内。使这个“使用窗口”足够短,以供页面上的播放器使用,但又不足以让小伙伴们抓住该网址并将其粘贴到另一个选项卡/窗口/下载器中。