Flashで、違うサーバーのCGIと連携する方法
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
[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フレーム目に記述します。
そして、ステージ上にamazonData_txtという名前のダイナミックテキストを、ステージと同じサイズで作ります。行指定は「複数行」にします。
PHPをアップしたサーバーの同一ディレクトリに、パブリッシュしたswfファイルをアップし、ブラウザで確認してください。
サーバー間のセキュリティのハードルを見事に超え、検索結果のHTMLが表示されるかと思います。
取得されたHTMLタグをコピーしてHTMLファイルにペーストし、ブラウザで見ると、アマゾンのデータが取得されていることを視覚的に確認することができます。