flaファイルが無い場合にswfの中身を書き換えたくなった場合の対処法
FlashLite1.1のswfのなかに直接埋め込まれていたURLを書き換えなければならないミッションが発生しました。
毎回動的に書き換える訳ではなくて、単純にサーバが変わるからそれに合わせて書き換えなければ行けないという感じです。
普通だったらflaファイルをFlashからオープンしてごにょごにょしていけばいいんですが、なんとflaファイルがないという状況に・・・
しかも200ファイル以上。。。
仕方ないので、10個のswfをとりあえずテキストエディタで開きました。
やっぱハードコーディングされてるお(´・ω・`)
まあSWFEdiotrとかでいつも動的に変数の値書き換えているし、楽勝じゃね?
って思った僕が間違いでした。
まず最初にやろうと思った方法がこちら。
- swftophpでphpに変換(mingで処理しているコードに変換してくれます)
- php使って、swftophpで変換したphpファイルをテキストとしてオープンして該当箇所だけ書き換える
- SWFEditor使って変数を書き換え
しかし世の中そんなに甘くない・・・
SWFEditorで変数が書き変わらない。。。
たぶんrootに定義されてない変数でmcの名前とかもわからんしこれはムリ・・・
上記の処理の為に正規表現とかがっつりつかっていた僕にはあまりにもショックな出来事でした。
次にとった対策がこちら。
- バイナリとかswfファイルとかしらん
- swfファイルオープンしてそのままstr_replaceで書き換えちまえ!
予想通り失敗
まあそりゃ、Flashの場合ヘッダだのなんだのってあるしね。。。
しばらく悩んでいましたが、良い解決策が思いつかない。
もう泣くしか・・・とおもってたらどこからともともなく声が聞こえてきました。
「flaがなければswfmillを使えばいいじゃない」
あんな遅い(SWFEditorと比べてね。)swfmillがつかえるかってんだ。
って思いましたが、いや別に動的に書き換える訳じゃないから速度べつに関係ないしって
いや、まさかまさかそんな簡単にできる分けない。
ってことで考えた手順がこんな感じです
- swfからxmlに変換
- xmlの文字列を書き換える
- xmlからswfに変換
- 俺幸せになれる。
つーことでこんな感じにスクリプト書いて幸せになりました。
swftoxmls.sh
for file in n `find ./ -name "*.swf" -print`
do
res=`expr $file : "\(.*\).swf"`
swfmill -e cp932 swf2xml $file $file.xml
php -f replacexml.php $file
swfmill -e cp932 xml2swf $file.xml $file
done
replacexml.php
<?php
$baseDir = "./";
if ( !isset( $argv[1] ) ) {
echo "no file name\n";
exit;
}
$file = str_replace("./","",$argv[1]);
$file .= ".xml";
if ( !file_exists($baseDir.$file) ) {
echo "file not found\n";
exit;
}
// 中身を書き換える
$xml = file_get_contents($baseDir.$file);
$xml = str_replace('hogehoge.jp','polidog.jp',$xml);
$fp = fopen($baseDir.$file,"w");
if ( $fp ) {
fwrite($fp,$xml);
fclose($fp);
echo "write by $file\n";
}
else {
echo "write error\n";
exit;
}
この2つのファイルを変換したいswfが入っているディレクトリに入れておきます。
そして以下のようにシェルスクリプトたたくだけ。
./swftoxmls.sh
これで僕は幸せになれました^^
めでたしめでたし。
そうそう余談ですが、swftophpは結構よくて出来ていますが、やはりFlashLite1.1かそのまま出力されたPHPを実行してもSyntaxエラーはっせいしまくりんぐです\(^o^)/