ホーム > タグ > php

php

flash lite1.1やdocomo端末でswfにGETパラメータを保持させることが、こんなにも難しいと知ってたらFlasherにはなりませんでした。あっ、すこし言い過ぎました

モバイルサイト向けのアクセス解析ツールでセッションを保持させるために、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のバイナリに詳しく知りたいかたは以下のリンクを辿るかググってみてください。そのあと僕に手取り足取り教えるか、けしからん動画をください。

今回説明したサンプル

で、この技術、ほかに使えんの?

ご存知のとおりバスキュールさんのGyorol2009年の年賀サイトでこれが使われてると思われます。最近はバスキュールさん以外のとこでもケータイ連動やってましたね。だいぶ浸透してきてるのかな?

Home > Tags > php


Search
Feeds
Meta

Return to page top