Flashのセキュリティ上の制限に、「同じサーバー上のCGIしか叩けない」というのがあります。違うサーバーの場合は、XMLを設置したりすれば、なんとかなりますが、手間だし、アップ権限がなかったら、そもそもXMLを置くことができません。

しかし、サーバー事情により、複数のサーバーにデータが分かれて置かれている場合や、全く見ず知らずのサーバーからデータを取りたいときには、この仕様は大きなハードルになります。

そこで、この障害を乗り越える方法を、ソースを交えてレポートします。PHPのpearと連携することにより実現しました。pearが導入されていない環境の場合は、pearのインストールを行ってからお試しください。

[1]:連携したいサイトのHTML確認

まず、データの送受信を行いたいCGIの、HTMLタグを確認します。ここではAmazonのサイトを例に挙げました。以下のURLです。

[2]:HTML内の、formタグ確認

サーチボックスのformタグを確認します。以下の情報が得られます。

  • 送信形式:POST
  • formデータの送信先:http://www.amazon.co.jp/exec/obidos/search-handle-form/
  • ドロップダウンボックスの情報
      name・・・url value・・・index=blended(ここでは「全ての商品」の指定のみ抜粋)
  • hiddenタグ情報
      name・・・search-type value・・・quick-search
  • textタグ情報
      name・・・field-keywords value・・・(任意の検索文字列)

[3]:PHP作成

前項で得られたデータを元にして、POST送信の返値を表示するPHPを作成します。
POSTのデータをPHPでやりとりするには、PHPのpearという仕組みが必要です。
以下の様に記述しました。関数の引数の、どこに何が入っているかは、前項と照らし合わせてご確認ください。

<?php ini_set('include_path', '(pearのあるディレクトリを指定する。)' . PATH_SEPARATOR . ini_get('include_path')); require_once "(pearのあるディレクトリを指定する。)/HTTP/Request.php"; $req =& new HTTP_Request( "http://www.amazon.co.jp/exec/obidos/search-handle-form/" ); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addPostData("url", "index=blended" ); $req->addPostData("search-type", "quick-search" ); $req->addPostData("field-keywords", $_POST["searchKeyword"] ); if (!PEAR::isError($req->sendRequest())) { $response1 = $req->getResponseBody(); } else { $response1 = ""; } echo $response1; ?>

上記のソースを、amazonDataGet.phpという名前でサーバーにアップします。

なお、$_POST["searchKeyword"]は、検索商品名が代入された「searchKeyword」という変数名のPOSTデータが、Flashから送られることを意味しています。詳しくは次項を参照してください。

[4]:Flash作成

CGIを叩くFlashを作成します。下記のActionScriptを、タイムラインの1フレーム目に記述します。

System.useCodepage=true; var _lv:LoadVars=new LoadVars(); _lv.searchKeyword="(任意の検索商品名)"; _lv.sendAndLoad("./amazonDataGet.php",_lv , "POST"); _lv.onData=function( _returnData_str:String ){ //改行が多過ぎて結果の確認がしずらかったため、まずムダな改行を削除。 var str_array:Array=String(_returnData_str).split("\n\n"); var return_str:String=""; for(var i:Number=0; i < str_array.length; i++){ return_str=return_str+String(str_array[i]); } _root.amazonData_txt.text=return_str; };

そして、ステージ上にamazonData_txtという名前のダイナミックテキストを、ステージと同じサイズで作ります。行指定は「複数行」にします。

PHPをアップしたサーバーの同一ディレクトリに、パブリッシュしたswfファイルをアップし、ブラウザで確認してください。
サーバー間のセキュリティのハードルを見事に超え、検索結果のHTMLが表示されるかと思います。
取得されたHTMLタグをコピーしてHTMLファイルにペーストし、ブラウザで見ると、アマゾンのデータが取得されていることを視覚的に確認することができます。

HTML5飯