スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | | スポンサー広告

AIR beta3でFC2 PIYO APIを使ってみる

FC2 PIYOってのはFC2がやってるいわゆるミニブログ(twitterとかアレ系)サービスです。そんでこのFC2 PIYOはAPIが公開されていてイロイロできるらしいので、とりあえずひろばの発言を取得して表示するだけのモノをAIRで実装してみました。

まず、APIを使うためにはFC2 PIYOユーザ登録をして、設定のAPIの設定でAPIKEY(文字列)を発行してもらいます。API説明を読むと、広場の発言を取得するには

http://piyo.fc2.com/contents/api/?mode=public&key=__APIKEY__&limit=__%d__
みたいなリクエストを送信するようデス。そうすると、xml形式で発言のリストが返ってくるみたいですねー。

FC2 PIYOとイロイロなやりとりする部分をクラスにできそーですが、今回はひろばの発言を取得する機能のみのPiyoConnectクラスを作ってみました。
package {
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
/**
* PIYO-APIを利用するためのクラス。
*/
public class PiyoConnect extends EventDispatcher {
/** 通信完了時イベントタイプ */
public static const COMPLETE:String = "complete";
/** 通信エラー時イベントタイプ */
public static const ERROR:String = "error";
/** ローダ */
private var _loader:URLLoader;
/** PIYO-API URL */
private var _piyoUrl:String = "http://piyo.fc2.com/contents/api/";
/** APIKEY */
private var _apiKey:String;
/** レスポンスXML */
private var _responseXml:XML;
/**
* コンストラクタ。
* @param apiKey PIYO-APIキー
*/
public function PiyoConnect(apiKey:String) {
_apiKey = apiKey;
// ローダの生成
_loader = new URLLoader();
_loader.dataFormat = URLLoaderDataFormat.TEXT;
_loader.addEventListener(Event.COMPLETE, doLoadComplete);
_loader.addEventListener(IOErrorEvent.IO_ERROR, doLoadError);
}
/**
* 広場の発言を読み込みます。
* @param limit 取得する発言数
*/
public function loadPublic(limit:uint = 30):void {
var uri:String = _piyoUrl + "?mode=public&key=" + _apiKey + "&limit=" + limit;
var req:URLRequest = new URLRequest(uri);
_loader.load(req);
}
/**
* 通信完了イベントハンドラ。
* @param e イベントオブジェクト
*/
private function doLoadComplete(e:Event):void {
try {
_responseXml = new XML(_loader.data);
dispatchEvent(new Event(COMPLETE));
} catch (err:Error) {
dispatchEvent(new Event(ERROR));
}
}
/**
* 通信失敗イベントハンドラ。
* @param e イベントオブジェクト
*/
private function doLoadError(e:IOErrorEvent):void {
dispatchEvent(new Event(ERROR));
}
/**
* 通信結果XMLを戻します。
* @return XMLオブジェクト
*/
public function get responseXml():XML {
return _responseXml;
}
}
}
コンストラクタで先ほど取得したAPIKEYを指定して、loadPublicメソッドでひろばの発言を取得する寸法ですねー。先ほど見たURIを組み立てて、URLLoaderを使って通信をする仕組みデス。responseXmlプロパティで取得したXMLにアクセスできます。

URLLoader#loadは非同期なのでPiyoConnect#loadPublicメソッドも非同期になってます。なので、コイツを使う側はPiyoConnect#COMPLETEイベントリスナを登録して、ソイツのハンドラでresponseXmlプロパティにアクセスすることになります。

PiyoConnectクラスを使って発言を取得して表示するPiyoクラスはこんなカンジです。
package {
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
/**
* ひろばの発言を表示するサンプル
*/
public class Piyo extends Sprite {
/** コネクタ */
private var _connect:PiyoConnect;
/** コンテンツ表示領域 */
private var _content:Sprite;
/**更新ボタン */
private var _reloadBtn:TextField;
/**
* コンストラクタ。
*/
public function Piyo() {
// ウィンドウリサイズ対応
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
// コンテンツ表示領域の生成
_content = new Sprite();
addChild(_content);
// 更新ボタンの生成
_reloadBtn = new TextField();
_reloadBtn.x = 10;
_reloadBtn.y = 10;
_reloadBtn.autoSize = TextFieldAutoSize.CENTER;
_reloadBtn.text = "更新";
_reloadBtn.background = true;
_reloadBtn.backgroundColor = 0xFFFFFF;
_reloadBtn.border = true;
_reloadBtn.selectable = false;
_reloadBtn.addEventListener(MouseEvent.CLICK,
function (e:MouseEvent):void {
_reloadBtn.visible = false;
_connect.loadPublic();
});
_reloadBtn.visible = false;
addChild(_reloadBtn);
// コネクタの生成
_connect = new PiyoConnect("f1******************************");
_connect.addEventListener(PiyoConnect.COMPLETE, doLoadComplete);
_connect.addEventListener(PiyoConnect.ERROR,
function (e:Event):void {
var textField:TextField = new TextField();
textField.autoSize = TextFieldAutoSize.LEFT;
textField.text = "通信に失敗しました。";
_content.addChild(textField);
});
// 読み込み開始
_connect.loadPublic();
}
/**
* 発言読み込み完了イベントハンドラ
* @param e イベントオブジェクト
*/
private function doLoadComplete(e:Event):void {
var xml:XML = _connect.responseXml;
// 現在の表示内容をクリア
removeChild(_content);
_content = new Sprite();
addChild(_content);
addChild(_reloadBtn);
// 発言リストの生成
var itemList:XMLList = xml..itemlist;
var ty:Number = 0;
for (var i:int = itemList.length() - 1; i >= 0; i--) {
var item:XML = itemList[i];
var message:Sprite = createMessage(item);
message.x = Math.random() * (stage.stageWidth - message.width);
message.y = Math.random() * (stage.stageHeight - message.height);
message.addEventListener(MouseEvent.MOUSE_DOWN,
function (e:MouseEvent):void {
var msg:Sprite = Sprite(e.currentTarget);
_content.addChild(msg);
msg.startDrag();
});
message.addEventListener(MouseEvent.MOUSE_UP,
function (e:MouseEvent):void {
e.currentTarget.stopDrag();
});
_content.addChild(message);
}
// 更新ボタンを表示
_reloadBtn.visible = true;
}
/**
* メッセージ表示スプライトを生成し、戻します。
* @param 表示データを保持するXMLノード
* @return 生成したスプライト
*/
private function createMessage(src:XML):Sprite {
var sprite:Sprite = new Sprite();
// 背景
var bg:Sprite = new Sprite();
sprite.addChild(bg);
// タイトル
var title:TextField = new TextField();
title.x = 0;
title.y = 0;
title.autoSize = TextFieldAutoSize.LEFT;
title.text = src..nickname + " (" + src..date + ")\n";
sprite.addChild(title);
// 本文
var body:TextField = new TextField();
body.x = 0;
body.y = title.height;
body.autoSize = TextFieldAutoSize.LEFT;
body.text = src..body;
sprite.addChild(body);
// 背景を描画
bg.graphics.beginFill(0xCCCCFF);
bg.graphics.drawRect(0, 0, sprite.width, title.height);
bg.graphics.endFill();
bg.graphics.beginFill(0xEEEEFF);
bg.graphics.drawRect(0, body.y, sprite.width, body.height);
bg.graphics.endFill();
// 枠を描画
var frame:Sprite = new Sprite();
frame.graphics.lineStyle(0, 0x0000FF);
frame.graphics.drawRect(0, 0, sprite.width, sprite.height);
sprite.addChild(frame);
return sprite;
}
}
}
コンストラクタに渡してる文字列は先ほど発行してもらったAPIKEYです。インスタンス生成後、PiyoConnect#COMPLETEイベントにdoLoadCompleteメソッドをハンドラとして登録しています。その後loadPublicメソッドを実行してます。

doLoadCompleteメソッドでは、itemListエンティティのリストを取り出してソレをループで処理してます。ループ内では、対象itemListエンティティからnicknameエンティティ/ bodyエンティティ/dateエンティティを取り出して、ソイツラを表示するSpriteを生成/表示というカンジです。

実際にitemListエンティティからSpriteを生成するのはcreateMessageメソッドでやってます。

今回のサンプルのADFファイルはこんなカンジです。
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.0.M6">
<id>com.fc2.blog96.100th.Piyo</id>
<version>0.1</version>
<name>Piyo</name>
<filename>Piyo</filename>
<description>PIYO-API sample.</description>
<copyright>HundredthMonkey</copyright>
<initialWindow>
<content>Piyo.swf</content>
<visible>true</visible>
<systemChrome>standard</systemChrome>
<title>Piyo</title>
<transparent>false</transparent>
</initialWindow>
</application>
adt -certificate -cn SelfSigned 1024-RSA sampleCert.pfx password
こんなカンジで署名ファイル作って、
amxmlc -default-size 640 480 -default-frame-rate=30 -default-background-color=0xFFFFFF Piyo.as
swfファイル作って、
adt -package -storetype pkcs12 -keystore sampleCert.pfx Piyo.air Piyo.xml Piyo.swf
ってするとさっきの署名ファイルのパスワード聞かれるので、ソレを入力するとPiyo.airができあがります。
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2008.02.19 | | Comments(0) | Trackback(0) | Adobe AIR

コメント

コメントの投稿


秘密にする

«  | HOME |  »

プロフィール

HundredthMonkey

Author:HundredthMonkey
プログラマ。

ブロとも申請フォーム

この人とブロともになる

メールフォーム

名前:
メール:
件名:
本文:

ブログ内検索


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。