- 2009-04-20 (月) 0:32

- Tweet
モバイルサイト向けのアクセス解析ツールでセッションを保持させるために、swfにGETパラメータを仕込まないといけない状況になりました。
このアクセス解析ツールでは、
- html→htmlへの遷移ではセッションがうまくとれる
- html→swfへの遷移ではGETパラメータを渡して強引にセッションを取得
- swf→htmlへの遷移もGETパラメータを渡してセッションを継続させる
という課題がありました。swfが間に入るとひと手間かかってしまいます。詳しい流れは下図を参照してください。

とても簡単そうに見えますね。しかし!作業は難航しました。
Flash lite1.xでは普通にやってるとGETパラメータを処理できない
まずはFlash lite1.1の予習から
- docomoの904iまではFlash Lite1.1。かなり多くの端末に1.1が搭載されている。docomoの資料
- flashvarsが使えない
- GETパラメータも受け取れない
- _urlプロパティがないので、無理やり取得もできない
- 取得したとしてもindexOf()がないので解析しようがない
というわけで、通常GETパラメータをFlash lite1.x上では扱うことができません。
じゃあ、swf→php→htmlとして、swfのGETパラメータをリファで取ってphpで処理すればいいんじゃね?と思ったらdocomoはリファを渡さない
swf→htmlの遷移の間にphpを挟み、環境変数のHTTP_REFFER(リファのURLを取得)を使って、GETパラメータを抜き取ろうと思いました。しかし!
- docomoはHTTP_REFFERを渡さない
どうしようもありません。ググっているとHTTP_REFFERなどの環境変数に頼ったコーディングはよくないともありました。
結局swfを動的にGETパラメータの変数をswfに埋め込んで…という手法で
どうしようもなかったので、ついに避けていた手法をとることにしました。swfmillという選択肢もありましたが、とりあえず簡単っぽく実現しやすいものを選びました。
FACEs: 携帯Flash (FLASH Lite 1.1) へ普通にパラメータを渡す
このソースを少しいじくって今回の要望に沿う形にしてみました。「?」以下のGETパラメータをそっくりそのままFlashの中に変数として持たせます。

- swfをゴニョゴニョして表示するphp (swf.php)
-
<?php require_once "wrap.php"; $params = strstr($_SERVER["REQUEST_URI"], "?"); echo swf_param_insert('hoge.swf', "trackParams", $params); ?> - wrap.phpで追加した関数
-
function swf_param_insert($file, $varsName, $item){ header("Content-Type: application/x-shockwave-flash"); $tags = build_string($varsName, $item); $src = file_get_contents($file); $i = (ord($src[8])>>1)+5; $length = ceil((((8-($i&7))&7)+$i)/8)+17; $head = substr($src,0,$length); return( substr($head,0,4). pack("V",strlen($src)+strlen($tags)). substr($head,8). $tags. substr($src,$length) ); } function build_string($varsName, $item) { $s = sprintf( "x96%sx00%sx00x96%sx00%sx00x1d", pack("v",strlen($varsName)+2), $varsName, pack("v",strlen($item)+2), $item ); return(sprintf( "x3fx03%s%sx00", pack("V",strlen($s)+1), $s )); }
バイナリに分解してゴニョゴニョしてますが、わけわかんないです。わかんないのでfunction名も適当です。ヘッダのファイルサイズを増やして、tag(変数)を埋め込んでいるということがなんとなくわかる程度です。
SWFのバイナリに詳しく知りたいかたは以下のリンクを辿るかググってみてください。そのあと僕に手取り足取り教えるか、けしからん動画をください。
- 埋め込み方の丁寧な解説 ← これを読めば仕組みがわかると思う
- Flash SWF バイナリ – Yoya Wiki
- Flash SWF バイナリいじり (ブロックの分解)
- BeInteractive! [技術勉強会行ってきた]
今回説明したサンプル
- ソース一式(wrap.phpはバスキュールさんのところから拾ってきて、上のソースを追加してください
-
- 動作サンプル
- redirect.php
- swf.php?what_i_need=money →hoge.swfにGETパラメータを付与して表示。ボタンを押すとgoogleにGETパラメータを受け流します。適当にGET部分を変えて表示してみてください
で、この技術、ほかに使えんの?
ご存知のとおりバスキュールさんのGyorolや2009年の年賀サイトでこれが使われてると思われます。最近はバスキュールさん以外のとこでもケータイ連動やってましたね。だいぶ浸透してきてるのかな?
- Newer: SWFObjectのDynamic Publishingを使うとIEとかでStage.stageWidthとheightが一瞬ゼロになるという都市伝説は実在した!
- Older: 超便利なローダーBulkLoaderの落とし穴にハマってきました
Comments:0
Trackbacks:1
- Trackback URL for this entry
- http://katapad.com/wp/2009/04/20/flash-lite1x_and_docomo_with_get_params/trackback/
- Listed below are links to weblogs that reference
- flash lite1.1やdocomo端末でswfにGETパラメータを保持させることが、こんなにも難しいと知ってたらFlasherにはなりませんでした。あっ、すこし言い過ぎました from Katapad Design
- trackback from 独身SEの世迷言 改め 既婚SEの乱文 09-07-23 (木) 23:33
-
”[Flex] htmlからflashにパラメータを渡す方法…”~
htmlからflashにパラメータを渡す方法
embedタグのsrc属性にGETパラメータを書く
<embed src="hoge.swf?hoge=hoge">flash(action script)内での受取方法
this.parameters もしくはApplication.application….