@kyanny's blog

自分の不名誉になるような考えを最初に大胆に表明することは、自立への第一歩となる - ニーチェ ドイツ哲学者

SWF::Fileというモジュールを使ってみた

とあるサイト上にとあるFlashムービーファイルがあり、ムービーにリンクがはってあって他のページへ飛ぶようになっており、時間経過にしたがってリンク先が変わっていき、そのリンク先を月に一度か二度、手動で変更する必要があり、とろいムービーを眺めながらリンクの記述にミスがないかクリックして調べ、Flashなのでリンク先を確認して戻ってくるとまた最初からムービーがロードされる、という非常に面倒くさい仕事があって、しぶしぶムービーをクリックするのにもいいかげん飽き飽きしていたので、俺の変わりに自動でリンクをクリックしてチェックしてくれるスクリプトを書こうと思い立った。

最初はWWW::Mechanizeで.swfファイルをgetしてきてprint $mech->contentなんてやってターミナルの画面が文字化けでひどいことになったりして、まあswfファイルはテキストじゃないんだから当たり前なんだけど、どうしたもんか、そうだきっとCPANにはswfファイルをうまく扱えるモジュールがアップされているはず!と思って探してみたら、SWF::Fileというモジュール(群)を見つけた。

で、いっぱいあってよくわかんないのでpodを読んだり読まなかったりしていたら、samples/readme.txtというのを見つけた。その中に、

linkext.plx - extract URL referred by 'getURL' action.

というサンプルスクリプトがあるらしく、これがまさに欲しい機能そのまんまの、swfファイルをParseしてリンク先のURIを調べてくれる。こいつにちょっと手を加えて、「wgetで対象のファイルをダウンロードしてきて、Parseして、見つかったURIにWWW::Mechanizeでアクセスして、リンク先が存在するならページのタイトルを出力する」なんていうお手軽スクリプトを作った。wgetを使っていちいちローカルにダウンロードしてるあたりが我ながらダサい。MechというかLWP::UserAgentがswfファイルをgetしてきて変数に格納したとき、それをSWF::Parseかなんかに渡してもどうもうまくいかなかったけど、SWF::なんちゃらというのを上手く使えばきっといちいちダウンロードなんてしてこなくても直接Parseができるんだろう。

Flashで検索してひっかかったものには、他にWx::ActiveX::Flashなんていうのもあって、こちらもFlashファイルをどうこうするものっぽいんだけど、二年以上前からバージョンアップしてないのはなんでだろと思ったら、要するにActiveXを使うものだからWindows上でしか動かないので、あんまり人気がないってことなのかなあとちょっとかなしいきもちになった。

このへんもうちょっとうまくできるようになれば、Mechからswfファイルも普通のHTMLのリンクと同じようにたどったりできるかなぁと思ったけど、Mechユーザの声としては「そんなことよりさっさとJavascriptエミュレート機能実装汁!」ってのが圧倒的に多数派なんだろうなあ、と、作者氏の悲鳴が聞こえてきそうなFAQ(の最初のほう)を読んでみてしみじみ思った。

もうちょっといろいろできるようになったら面白くなりそうなので、暇をみつけていじってみたいなあと思う。ただ、そのためにはいじる対象のswfファイルが必要なわけだが・・・誰が作るんだそれは?