2009年12月22日火曜日

opensocial-actionscript-client を試してみた

mixiアプリ用に、いい感じにユーザ情報を取得してくれるAPIはないものかと探しまわって、opensocial-actionscript-clientというライブラリが見つかったので、試してみました。とはいえ、まだまだ頻繁に更新が入っていて、実用に耐える代物になるのかはよく分からないので、ほんとに試してみただけ。

ライブラリは、Google Code のページDownloads にありますが、12月18日(金)の時には、一部ファイルの中身が空っぽだったりと、不完全なものだったので、直接 Source から、SVNでダウンロードしました。


ファイルを取得できたら、src/org/ 以下を適切な場所に移動してあげてください。

JsWrapperClient クラスが、Externalinterface でもってJSとのやり取りをするんだと思います。このクラスを初期化して準備が完了するまで、利用することができない様子。

package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.text.TextField;
    
    import org.opensocial.client.base.Person;
    import org.opensocial.client.core.Feature;
    import org.opensocial.client.core.OpenSocialClientEvent;
    import org.opensocial.client.features.AsyncDataRequest;
    import org.opensocial.client.features.PeopleRequestOptions;
    import org.opensocial.client.features.ResponseItemEvent;
    import org.opensocial.client.jswrapper.JsWrapperClient;
    
    [SWF(width=210, height=130, backgroundColor=0xaaaaaa, frameRate=30)]
    
    public class Main extends Sprite
    {
        
        private var _client:JsWrapperClient;
        
        public function Main()
        {
            // ラッパークライアントの初期化とスタート
            // 完了してからリクエスト処理へ
            _client = new JsWrapperClient('opensocial.flash');
            _client.addEventListener(OpenSocialClientEvent.CLIENT_READY, 
                function(e:OpenSocialClientEvent):void {
                    _client.removeEventListener(OpenSocialClientEvent.CLIENT_READY, arguments.callee); 
                    request();
                }
            );
            _client.start();
        }
        
        private function request():void 
        {
            // リクエストオプションインスタンスを作成する
            var options:PeopleRequestOptions = new PeopleRequestOptions()
                                                    .setUserId('@me')
                                                    .setGroupId('@self');
            
            // 非同期データリクエストインスタンスを作成する
            var req:AsyncDataRequest = new AsyncDataRequest(Feature.PEOPLE_GET, options);
            
            // 完了時のイベントリスナーを追加する
            req.addEventListener(ResponseItemEvent.COMPLETE, 
                function(e:ResponseItemEvent):void {
                    req.removeEventListener(ResponseItemEvent.COMPLETE, arguments.callee);
                    
                    // 結果表示用
                    var loader:Loader = new Loader();
                    loader.x = loader.y = 5;
                    addChild(loader);
                    
                    var tf:TextField = new TextField();
                    tf.width = tf.height = 90;
                    tf.x = 100; tf.y = 10;
                    addChild(tf);
                    
                    // 取得したデータを取り出す
                    var person:Person = e.response.getData();
                    
                    // ニックネームを取得
                    var displayName:String = person.getDisplayName();
                    tf.appendText(displayName + "\n");
                    
                    // サムネイル画像を取得
                    try {
                        var urlRec:URLRequest = new URLRequest(person.getThumbnailUrl());
                        loader.load(urlRec);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
                            function(event:Event):void {
                                trace('load complete');
                            }
                        );
                    } catch (e:Error) {
                        throw Error('load error');
                    }
                    
                }
            );
            
            // 呼び出しを行う
            req.send(_client);
        }
        
    }
}


本当に単純に表示だけ。

必要な機能があるかどうかは、Docs とにらめっこしないといけないです。そもそもどういう機能が必要なんだろう...。

0 件のコメント:

コメントを投稿