FlashからLingr APIは扱えるのか

Comet技術の先駆である「自称・世界最強のWebチャット」Lingrが今月初頭にAPIを公開して注目を集めていたんですが、これを応用して(JavaScriptを貼れる)任意のサイトへ埋め込めるというサービスがid:urekat氏よりリリースされていました

Lingrブログパーツ(Lingr Blog Widget)です。

http://ssktkr.com/lingrjs/

ブラウザ上でAPIを利用する場合、クロスドメインの制約が最大の問題となってくるわけですが、こちらではComet部だけJSONでダイレクトに接続し、非Cometな機能は別サーバのCGIを仲介することで巧く実現しているみたいです。はてダに貼れないのが残念。

JavaScriptではなくFlashで同様のものを実現できないかとふと思って、クロスドメインの制約を乗り越えられるかどうか実際に試してみました。折角なので、昨日インストールしたFlex2 SDKでLet's try。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import mx.controls.*;
            import mx.rpc.events.*;
            public function sendOK(event:ResultEvent):void {
                Alert.show('OK:' + event.toString());
            }
            public function sendNG(event:FaultEvent):void {
                Alert.show('NG:' + event.toString());
            }
        ]]>
    </mx:Script>
    <mx:HTTPService id="srv"
        url="http://www.lingr.com/api/explore/get_new_rooms?api_key=xxxxxxxxxxxxxxxx"
        method="get" result="sendOK(event)" fault="sendNG(event)" />
    <mx:Panel title="Data Access Test" width="100%" height="100%" id="main_panel"
        paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">
        <mx:Label text="push to get data"/>
        <mx:Button label="Get Data" click="srv.send()" />
    </mx:Panel>
</mx:Application>

URL末尾のxxxxxxxxxxxxxxxは、http://www.lingr.com/developers/apiから取得したAPI keyが入ります。これをtest.mxmlとして保存して、mxmlcで適当なサイズにコンパイル

C:\> mxmlc -default-size 400 200 test.mxml

手元にあるスタンドアローン版のFlash Playerが7止まりだったので(9が配布されてないか結構探したものの見つからず)、できあがったtest.swfを埋め込んだHTMLを別途に作成してぽちっと実行。

NG:[FaultEvent fault=[RPC Fault faultString="Security error accessing url" faultCode="Channel.Security.Error" faultDetail="Destination: DefaultHTTP"] messageId="1DCEA973-C548-38B0-86CE-B1EBF3F4E379" type="fault" bubbles=false cancelable=true eventPhase=2]

残念ながら結果はNGに。ローカルからのアクセス制限を疑いましたが、Flex公式の解説にあったURLで試してみると次のようにOKが返ったので違う模様。

OK:[ResultEvent messageId="0B2AB699-3E14-82B1-C493-B1FED2F2F3F7" type="result" bubbles=false cancelable=true eventPhase=2]

念のため同じswfファイルをサーバにアップして確認してみましたが、やっぱり結果は同じでした。おそらくwww.lingr.comの直下にFlashのカスタムポリシーファイル(crossdomain.xml)が置かれてないのが原因。

FlashJavaScriptはページ上で連携できるので、先程のLingr miniに皮を被せるような手法で実現できないこともないわけですが、それは随分スマートじゃないなぁと。

あと、個人的に欲しいなぁと思っているものを書いちゃいましょうか。
Flashで動くブログ・アクセサリとしてのチャットモジュール(DHTMLでつくる場合に比べて、クロスドメイン制約を回避できるのでLingrの全機能に完璧にアクセスできるし、コンテナページのCSSの影響を受けないのでとてもポータブル)

http://blog.japan.cnet.com/kenn/archives/003536.html

とありますし、swfからの直アクセスも考慮されてそうなんですが。それとも私が見落としてるだけで、どこか他の場所にポリシーファイルがあるのかも。