このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
次は写真だ。
日記から取り出せるのは写真の URL 文字列である。
なので、エクスポート時に URL を出力することはできるが、
肝心の写真自体は、mixi のサーバ上にある。
写真の URL はログインなしで参照することは可能なようだが、
エクスポータの機能を考えれば、
写真もローカルに保存しておいた方が安全と言える。
mixi の日記の写真は JPEG なのでバイナリデータだ。
どうやってダウンロードするか。
正当な方法でいくなら、ソケットを作成し、
mixi と HTTP で話すという手があるが、
これはあまりにも面倒である。
幸い、Microsoft の XMLHTTP 実装は、
HTTP 経由でバイナリデータを取得することができる、
responseBody プロパティを持っている。
ただ、この responseBody は特別なバイト配列を返す。
SafeArray ではないため、JavaScript から
その要素にアクセスすることができない。
幸い、配列を変数に取り出すことはできるので、
このバイト配列を ADODB.Stream と組み合わせれば、
ファイルに保存することができるようになる。
では、MixiSession クラスに、
download メソッドを追加してみよう
========== part of MixiSession.js ==========
// GET を発行してデータをダウンロードする
MixiSession.prototype.download = function (filename, url, query) {
// リクエスト前に指定ミリ秒待機する
WScript.Sleep(this._wait);
// クエリパラメータを用意
var param = HttpUtil.encodeForm(query)
if (param.length > 0) {
param = "?" + param;
}
// GET で送信
this._client.open("GET", String(url) + param, false);
this._client.send("");
// HTTP ステータスを検証
this._validateStatus();
// ファイルに書き出す
var stream = new ActiveXObject("ADODB.Stream");
stream.Open();
stream.Type = adTypeBinary;
stream.Write(this._client.responseBody);
stream.SaveToFile(filename, adSaveCreateOverWrite);
};
========== end of part of MixiSession.js ==========
Stream の Type を adTypeBinary にすると、
Stream はバイナリ入出力モードで動作する。
バイナリモードの場合、Write メソッドを使って、
バイト配列を書き込むことができる。
そして、テキストの時と同様、SaveToFile メソッドを
使えばファイルに書き込むことができるのである。
見ての通り、ADODB.Stream は便利な機能を持つ。
XMLHttpRequest と組み合わせると、
WSH の HTTP クライアントとしての基盤となるのだ。