— boreal-kiss.com

FLASHによる外部RSSリーダー作成メモ

JavaScriptのソースコードのみで任意のドメイン上に設置できる外部RSSリーダー(FLASH)作成に関するメモ。このRSSリーダーによりドメインA上に、ドメインB上のFLASHファイルを用いて、ドメインC上のRSSフィード情報を表示することができる。FLSHは「FLASHファイルのあるドメイン」と異なるドメイン上のXMLファイルを普通読むことができないので、FLASHファイルのあるドメイン上に 外部XMLファイルを擬似的に生成してFLASHファイルにロードしてやる必要がある。以下はそのクロスドメインの問題に関する、JavaScript – PHP – FLASHの連携について自分がつまずいたところを強調して解説してある。

ユーザー側JavaScriptソースコード。”http://boreal-kiss.com/js/url_request_rss20.js”にて定義された関数url_request()の引数に取得したいRSSフィードURL(例えば “http://blog.borel-kiss.com/index.xml”)を記述。これによりこのソースコードを記述した地点にFLASHファイル(“http://boreal-kiss.com/flash/rss/rss_reader_20_load_php.swf”)が表示され取得情報を表示する。

<script type="text/javascript" src="http://boreal-kiss.com/js/url_request_rss20.js"></script>
<script type="text/javascript" language="JavaScript">
url_request("http://blog.borel-kiss.com/index.xml");
</script>

関数url_request()の中身。FlashVars属性を用いてJavaScriptからFLASHファイル内で定義された変数に値を渡しFLASHファイルを表示。ここではJavaScript内の変数urlの中身をFLASH内の変数url_xmlに渡している。

function url_request(url){

var flash_obj = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="176" height="60" id="rss_reader_20_load_php" align="middle">'
+ '<param name="allowScriptAccess" value="always" /">'
+ '<param name="movie" value="http://boreal-kiss.com/flash/rss/rss_reader_20_load_php.swf" /">'
+ '<param name="quality" value="high" /">'
+ '<param name="wmode" value="opaque" /">'
+ '<param name="FlashVars" value="url_xml='+url+'" /">'
+ '<embed src="http://boreal-kiss.com/flash/rss/rss_reader_20_load_php.swf" quality="high" wmode="opaque" bgcolor="#333333" width="176" height="60" name="rss_reader_20_load_php" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" FlashVars="url_xml='+url+'" /">'
+ '</object">';

document.write(flash_obj);
}

FLASH内ActionScriptのソースコード(抜粋)。JavaScriptから受け取った値をurl_xmlに格納、そして同じ内容をLoadVarsクラス内オブジェクトmyData.url_inに格納しなおす(起動時にmyData.url_inに格納しようとしたらうまくいかなかった)。sendAndLoadメソッドでmyDataの情報(ここではmyData.url_in)をPHPファイルに送信し処理後のPHPファイルの内容をXMLクラスnewsXMLに格納する。格納後内容の解析をスタート。ここでPHPファイルは絶対パスで指定する必要がある。異なるドメイン間で通信する場合、相対パスで表記したファイルをFLASHが認識できなかった。

//XMLクラス
var newsXML:XML = new XML();

//ファイル読み込み時に空白を無視(今回は必要ないかも?)
newsXML.ignoreWhite = true;

//FLASHファイル起動時にJavaScriptから値を受け取っている。
var url_xml:String;

//LoadVarsクラス内のオブジェクトmyData.url_inにurl_xmlを格納。
var myData:LoadVars = new LoadVars();
myData.url_in = url_xml;

//PHPファイル("load.php")にmyDataの中身を送り、
//PHPファイルで処理後の内容をnewsXMLに格納する。
//PHPファイルは絶対パスで指定。
myData.sendAndLoad("http://boreal-kiss.com/flash/rss/load.php", newsXML);

newsXML.onLoad = function(result:Boolean){
(newsXMLロード後の処理)
}

サーバー側PHPソースコード(“load.php”<body>タグ内の内容)。FLASHから変数url_in(RSSフィードURL。例えば “http://blog.borel-kiss.com/index.xml”)を受け取り、その内容をその場に表示。このPHPファイル自体がFLASHファイルの置かれている同一ドメインに生成された疑似XMLファイルの役割を果たす。PHPのソースコードはHTMLファイル内に表記されているため、この疑似XMLファイルには取得したいXMLファイルの内容の他に<html>や<body>タグ等も含まれる。FLASHでこの疑似XMLファイルの中身を解析する際に注意が必要。

<?php
$url = $_POST["url_in"];
readfile($url);
?>

追記(2007/12/17):上記内容の場合、読み込んだXMLファイルのエンコーディング(EUC-JPなど)によっては文字化けしてFLASHに格納される。文字化けを回避する具体的な方法についてはこちらを参照。

0 comments
Submit comment