【问题标题】:Use Greasemonkey to load my own video player, cross-domain使用 Greasemonkey 加载自己的视频播放器,跨域
【发布时间】:2011-12-21 02:10:24
【问题描述】:

我制作了一个脚本来转换所有wmvavimp3wavmp4等链接以使用嵌入式jwplayer。播放器加载但不播放视频,而是显示以下错误:Task Queue failed at step 5: Playlist could not be loaded due to cross-domain policy restrictions.

在线搜索让我意识到我需要一个名为 crossdomain.xml 的文件或类似的托管文件。现在,由于这是一个可以在任何网站上运行的脚本,我显然不能这样做。

我想可能将整个播放器内联到数据 uri 中。我也试过这样:DEMO

这是我带播放器的网站:http://player.longtailvideo.com/player.swf

我正在尝试做的事情可能吗?我想它就像 img 的数据 uri 一样工作。我错过了什么吗?

编辑:!

【问题讨论】:

  • 错误是不言自明的。
  • @yoda:什么错误?你是说跨域的吗?您是否阅读了整个问题?
  • 是的,我做到了。我坚持我说的话。 Playlist could not be loaded due to crossdomain policy restrictions
  • @yoda:我理解错误,对解决问题有什么想法吗?
  • 绕过它的唯一方法不是使用greasemonkey(也称为客户端脚本),而是使用服务器端脚本。

标签: javascript flash uri base64 greasemonkey


【解决方案1】:

数据 URI 不适用于 <object><embed> 节点。这就是为什么GM_getResourceURL() will not work for this either

此外,当使用直接<embed> 方法时,player.swf 文件必须与视频位于同一域中,否则跨站点安全将阻止视频加载。这个特定的块可以被构建到这个特定的player.swf 中。

然而,当使用 Longtailvideo 的 jwplayer.setup () 功能(无论如何他们推荐)时,播放器似乎可以工作。

您必须使用播放器的托管版本,但幸运的是,http://player.longtailvideo.com/player.swf 提供了一个。
它会给出NetworkError: 404 Not Found - http://someSite/crossdomain.xml 错误,但视频会播放。

这是一个有效的示例 GM 脚本:

// ==UserScript==
// @name     _Video embed fun
// @include  http://YOUR_SITE/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
// @require  http://player.longtailvideo.com/jwplayer.js
// ==/UserScript==

//--- Find all hyperlinks to select video files.
var videoLinks  = $("a[href$='.mpg'], a[href$='.mp4'], a[href$='.wmv']");

//--- For each video link, activate our video player.
videoLinks.each ( function (J) {
    var jThis   = $(this);
    var vidURL  = jThis.attr ('href');
    var contID  = 'myVidContainer_' + J;

    jThis.after ('<div id="' + contID + '">Loading the player ...</div>');

    jwplayer (contID).setup ( {
        flashplayer:    "http://player.longtailvideo.com/player.swf",
        file:           vidURL,
        height:         344,
        width:          480
    } );
} );



警告:

  1. 某些媒体类型(或该播放器)似乎内置了额外的 XSS“保护”。这意味着例如 .wmv 文件将不起作用,而许多 .mp4 文件可以。

  2. 视频文件显然必须与此播放器位于完全相同的域中。因此,包含视频foo.com\somevid.mp4 的目标页面foo.com\somepage.htm (通常)可以正常工作,但如果视频是cdn.foo.com\somevid.mp4,它将无法正常工作。

使用此播放器的唯一万无一失的方式,仍然是以下两个选项:

  • 编写您自己的 Firefox 插件,该插件不限制跨域将本地文件 (player.swf) 修补到页面中。你可以使用 Greasemonkey 或 Scriptish 代码。

  • 让您的 GM 脚本将视频 AJAX 传输到您自己的服务器(可以是运行 XAMPP 等的本地计算机)。然后该机器将把视频和player.swf 发回给你,可能是&lt;iframe&gt;

【讨论】:

  • 那么为什么使用 mp3 阅读器也能做到这一点:jsfiddle.net/jwHqr
  • 糟糕!我测试中的一些 XSS 限制是由我的安全插件引起的。我已经用脚本更新了我的答案——因为当一些傻瓜记得放松他的 RequestPolicy 设置时,它会起作用。 ;)
  • 它工作得非常好,在规定的限制范围内。从更新的答案加载脚本并访问test page
  • 我编辑了这个问题,以包含我对它的外观的快照。如您所见,它仍然无法与 wmv 一起使用,而这正是我所需要的
  • 正如我试图解释的那样:WMV 格式不适用于您选择的播放器。这是设计使然(无论是 WMV 格式,还是该播放器或两个都)。寻找其他玩家(怀疑)或开发两种万无一失的方法之一。
猜你喜欢
  • 2013-10-22
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2017-03-30
相关资源
最近更新 更多