如何确定托管我的swf的页面?

时间:2010-09-05 20:46:42

标签: flash actionscript

我有一个可以在网络上的几个不同位置托管的SWF(包括facebook.com)。如何从Actionscript中确定哪个页面托管我的SWF?

3 个答案:

答案 0 :(得分:3)

没有一种防弹方法可以满足您的需求。

最常见,最简单的方法是:

1)使用ExternalInterface.call调用javascript并返回本地。

类似的东西:

var location:String = ExternalInterface.call('window.location.href');

2)在HTML嵌入代码中将flashvar传递给你的swf。

<强>优点:

两者都很容易实现

<强>缺点:

并非总是可行/可用。

当您的swf作为第三方窗口小部件嵌入时,它很可能不会被授予对javascript的访问权限。实际上,默认情况下,除非嵌入代码明确将allowscriptaccess设置为“*”(每个人),否则您的swf将无法访问JS。

在flashvars的情况下,显然必须通过嵌入代码传递该数据。但是您通常不控制此代码,因此它可能在某些情况下有效但在其他情况下无效。

还有第三种方式(可能还有其他方式)相当hackish和更多参与,但我实际上使用过一次并且工作正常。基本的想法是这样的。而不是直接为您的swf服务,让嵌入代码加载一个您可以控制服务器端的页面。我们称之为yoursite.com/loader.php。这个脚本抓取http referrer并将其传递给你的swf(警告:是的,http referrer不是强制性的,可能在请求中不存在或被欺骗;在正常情况下,这不是一个实际问题,因为大多数浏览器确实发送此数据)。

现在,这是棘手的部分。你必须以某种方式将这些数据写入你的swf。有一些选项可以在服务器端动态编译swf。您也可以尝试解析swf格式(它已经相当详细记录)。但这似乎是我试图做的事情(我的意思是,服务器过度杀伤)。

所以我决定使用一个加载实际swf的简单loader.swf。这个loader.swf有一个字符串变量(让我们称之为referrer),其中一些占位符数据很容易找到,2)在二进制文件中随机发生非常不合理,3)足够大以容纳一个url(我的意思是大字符串如“$ BEGIN_PLACEHOLDER $ 0123456789 $ END_PLACEHOLDER $”,其中“0123456789”只是一个重复的填充物,使占位符足够大;我有一个1000字节的字符串或类似的东西,只是为了安全;这必须是你的actionscript代码中的一个文字字符串,否则它将被编译为多个常量,你将无法在swf二进制文件中找到它。

php脚本只是用fopen打开加载器,查找开始和结束标记并用引用来替换整个字符串(如果我没记错的话,我添加了一些字符来填充此字符串)。然后脚本返回读取swf并注入referrer。在运行时,这样做的结果是在加载器swf中,referrer只是一个普通的编译时变量。然后这个加载器swf加载了实际的swf,并通过查询字符串传递了referrer的值,因此app最终被调用如下:yourdomain.com/app.swf?referrer=the_referrer_value。然后,在应用程序中,引用者只是一个普通的flashvar。

现在,为了实现这一点,加载器被导出为“未压缩”的swf。如果它是压缩的,你必须首先解压缩,等等。另外,这是我使用加载器swf而不是在真实的应用程序中这样做的方式;加载器本身很小,所以它没有被压缩,但真正的应用程序无法解压缩。

它有点牵扯而不是最优雅,但要使整个工作起作用并不是很难,并且对服务器的要求不高。

答案 1 :(得分:1)

为了在每种情况下获得引用者,您必须动态生成SWF shell。这类似于Juan在SWF中替换字符串的方法,但更安全,更简单。

http://www.libming.org/

使用Ming库生成一个带有引用者的SWF以及您想要的任何其他参数。 Ming是用C语言编写的,有PHP,Ruby等版本。

大多数像YouTube和Vimeo这样的大男孩可能会使用这种方法进行视频嵌入分发和跟踪。

答案 2 :(得分:0)

获取托管swf的页面的URL的唯一方法是通过ExternalInterface调用,它可以执行JavaScript来获取window.location之类的东西。有一些关于它的SO问题,您可以在其中找到详细信息。

但是既然你提到了facebook,你可能无法在那里使用那种方法,因为facebook不允许swf文件在其页面中执行JavaScript(allowcriptaccess参数设置为“never”),我相信。但我对此并不是百分之百确定,所以你可能想要检查一下你自己。