2010年1月22日金曜日

HTMLを後でiPhoneで見る

前回のエントリで、
Web上でチェックした項目を、iPhoneでさっと見れるようなアプリもあったらいいな。

と書いたのですが、ReadItLater,Instapaperというサービスを教えてもらいました。

両方とも、URLをサービスに送信して登録できて、iPhoneアプリからそのHTMLを見る事ができます。もちろん、Webからでも。
これで、気になった記事をバシバシとうろくして、喫煙所でゆっくりと見れる!
iPhoneのUIはReadItLaterの方が好きなので、こっちをメインにしてみようかなぁー

なかなか便利なので、空うさぎにReadItLater、InstapaperにURLを登録する機能をつけてみようかと考え中です。
それとともに、短縮URLの元URLと、HTMLタイトルを取ってくるようにしてリンクのリストを作ろうかと。

元URLはHEADでリクエストを投げて、Locationが入っていたらその値を元エントリとしてます。

var req : URLRequest = new URLRequest(url);
req.method = URLRequestMethod.HEAD;
req.followRedirects = false;
var loader:URLLoader = new URLLoader();

var expandUrl:String;

function onResult(event:HTTPStatusEvent):void {
for each(var rh : URLRequestHeader in event.responseHeaders) {
if (rh.name == "Location") {
expandUrl = rh.value;
return;
}
}
}

loader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, onResult);
loader.load(req);


HTMLのタイトルは、単純にHTMLを取得して、<title>のタグの値を取得してます。
ここの所は@kisさんにサンプルコードを頂きました。

@aqubi 使い物にならないものならこちらで! http://d.hatena.ne.jp/nowokay/20100121

文字コードが問題になるので、HTMLヘッダのContent-Typeにcharsetが入っていたら、その文字コードで判断してるんですが、結構charsetが入っていないサイトが多いんですね。。

この部分のActionScript3は、

var req : URLRequest = new URLRequest(expandUrl);
req.method = URLRequestMethod.GET;
_loader = new URLLoader();
_loader.dataFormat = URLLoaderDataFormat.BINARY;
_loader.addEventListener(Event.COMPLETE, onResult);
_loader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpResponse);
_loader.load(req);

という感じで、dataFormatをURLLoaderDataFormat.BINARYにしてバイナリでまず取得。
HTTPStatusEventでresponseHeadersの中から、Content-Typeを引っこ抜いて、charsetをとる。


protected function onResult(event:Event):void {
var bytes:ByteArray = _loader.data as ByteArray;
var content:String = ba.readMultiByte(bytes.length, charset);
}

結果をreadMultiByteで変換してStringを作成。
んで、titleを取ってくる感じ。

charsetが入っていない場合でも、utf-8であるものも結構多い気がするのでとれなかったらutf-8にして文字化けしたらごめんなさいね。。。って感じかなぁー。うーむ。

ちなみに、AIRには、flash.html.HTMLLoaderというLoaderもあって、これを使うとHTMLをレンダリングしてくれる状態まで情報を取得/用意してくれます。
ここから取得できる、HTMLHistoryItemというオブジェクトには、リダイレクト前のURL、リダイレクト後のURL、HTMLのタイトルが取得できるようになっているんで、今回必要な情報はばっちりとれちゃいます。んが、悪意あるHTMLだったときにどんな事になるか分かんないので怖くて使ってません。

ということで、現在つくっている空うさぎではこんな感じの画面がでるようになっています。


ここまでやると、ペーストした値がURLだったら、短縮URLに変換するとかしてみたいなぁ。とも考え中。
• • •