Board logo

標題: [PHP] 修改 Flash 檔案內的連結 [打印本頁]

作者: wmh    時間: 2008-7-14 22:19     標題: [PHP] 修改 Flash 檔案內的連結

要修改 Flash 檔案內的連結?不是直接開啟 .fla 檔修改就好了嗎?

非也非也,這是假設當你沒有原始的 .fla 檔案,只有 .swf 的播放檔時,又需要修改檔案內預設的連結位置。通常這種情境是發生在你要播放客戶所製作的 flash 檔,而客戶的 flash 內的連結又是固定的,你需要做 click 的統計時,這時需要先導到你的統計程式頁面,再轉向到原始的連結所需的修改。

這個方法是從一套 open source 的廣告系統 OpenX 學來的,OpenX 是完全 open 的,各個版本的原始碼可以由 https://svn.openx.org/ 下載。會需要用到的檔案有兩個,第一個是 lib-swf.inc.php,是在 server 端轉 .swf 檔用的,第二個是 fl.js,這是用來播放 .swf 用的。

Server 端的轉檔

server 使用 PHP,以下是一個完整的範例
//先 require lib-swf.inc.php
require 'lib-swf.inc.php';

//把 .swf 檔的內容讀入到一個變數內
$swf_file = file_get_contents('your_flash.swf');

//偵測目前 flash 檔案內有幾個固定的連結
$info = phpAds_SWFInfo($swf_file);

//所有要轉換的連結都放到這個變數內 (所有固定的連結都做轉換)
$convert_links = range(1, count($info));

//偵測版本判斷是否要壓縮
$compress = false;
if (phpAds_SWFVersion($swf_file) >= 6 && phpAds_SWFCompressed($swf_file)) {
  $compress = true;
}

//轉換並回傳結果
list($result, $parameters) = phpAds_SWFConvert($swf_file, $compress, $convert_links);

//儲存為新的檔案
$fp = fopen('new_file.swf', 'wb');
fwrite($fp, $result);
fclose($fp);
以上為一個轉檔的流程,其中第 8 行先取得原 flash 檔案內的連結,回傳結果為一個 array 如下所示:
Array
(
  [1] => Array
    (
      [0] => http://jsgears.com/
      [1] => _blank
    )
)
如果找到兩個連結,則回傳的 array 會包含兩組資料。每一組資料內又是一個 array,第一個值為連結的位置,第二個值為開啟連結的方式。通常這個結果會需要儲存下來,以便修改了連結之後,仍要導向回原本的連結。例如原始連結為 http://jsgears.com/,可能會被修改為連到 http://jsgears.com/ck.php?banner ... 2F%2Fjsgears.com%2F,這裡會先紀錄一個 click 之後再導回原本的連結。至於實際的作法在此就不多說了,先回到轉檔的主題。

第 11 行 $convert_links 要放的是哪些連結要準備被修改為參數化的連結,如果只有一個連結,就放 array(1),如果是兩個連結要修改,就放 array(1, 2),依此類推,如果全部都要修改,就直接如上面的例子,使用 range(1, count($info)),就會把所有的連結編號都放進去。

第 14 行到第 17 行為判斷轉檔後的檔案是否要壓縮,這部份不用修改,直接照抄即可。

第 20 行就是進行轉檔了,透過 phpAds_SWFConvert() 把原始檔案及相關參數帶入,回傳一個 array,第一個值為轉檔後的結果,第二個值為實際轉換成功的連結數量。如果要嚴謹一點的話,可以再判斷一下第二個回傳值是否正確,並做相關處理。

而轉換完成後回傳的第一個值直接另存新檔後,即為我們要的結果,到此完成第一個階段。

新 Flash 檔的播放方式

新的 .swf 檔要透過 JavaScript 來播放,以下為完整的範例:
<div id="ad_1"></div>
<script type="text/javascript" src="fl.js"></script>
首先 html 內要新增一個 <div>,並且給一個 id,接著引用 fl.js。
<script type="text/javascript">
var ox_swf = new FlashObject('http://jsgears.com/ad/new_file.swf', 'Ad1', '300', '160', '6');
ox_swf.addVariable('atar1', '_blank');
ox_swf.addVariable('alink1', 'http://jsgears.com/ck.php?bannerid=123&redirect=http%3A%2F%2Fjsgears.com%2F');
ox_swf.write('ad_1');
</script>
適當的地方放入以上的 code,第 2 行 new 了一個 FlashObject,參數依序為:檔案路徑、產生新區塊的 id、長、高、Flash 版本。Flash 版本通常給 6 即可,或是可由上面 server 端轉檔時,透過 phpAds_SWFVersion() 這個函數得知。

接著第 4~5 行分別為帶入連結的開啟方式及連結位置,然後第 7 行是將要播放的 flash 寫入先前新增的 <div> 區塊。

結果

最後產出的結果可以自訂 flash 內的連結,先轉向我們要的連結後,再重新導向到原始的連結。沒提到的細節表示不在這個主題內的,有興趣的人請自行嘗試囉。
作者: windgod    時間: 2009-8-22 13:14

好強!從來沒想過可以這麼做!
作者: flw    時間: 2009-8-30 14:58

樓主好勁, 但是我是菜鳥一名, 一好些地方看不明白, 請指教.

文中說: 會需要用到的檔案有兩個,第一個是 lib-swf.inc.php, 第二個是 fl.js,
我也download了. 但是不明上面說的code是加在那裏.

最上面兩組CODE是 lib-swf.inc.php的嗎, 要copy加進lib-swf.inc.php內嗎?
而下面兩組CODE是加在網頁中的嗎? 即我要顯示的網頁內嗎?

我有需要是因為最近找到一個好帖有關slide+ php.
http://www.maani.us/slideshow/index.php?menu=Tutorial
是很好用, 但是別人一點圖片就會轉到他們公司.
如能如你所言成功轉換就很好, 但我就是不懂...
望有人能指教.

[ 本帖最後由 flw 於 2009-8-30 15:10 編輯 ]
作者: wmh    時間: 2009-8-30 16:56

lib-swf.inc.php 是轉 .swf 檔用的,你要把原本的 swf 透過第一段的範例在 server 上跑一次,把檔案內的連結給改掉,改成你自己的。

fl.js,是用來播放 .swf 用的,也就是在你的網頁上要放 swf 時用的。




歡迎光臨 jsGears.com 技術論壇 - AJAX, JavaScript, jQuery, 網站開發, 前端效能優化 (http://jsgears.com/)