2006 年 8 月 17 日 20 時 47 分

写真のダウンロード


このアーカイブは同期化されません。 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 クライアントとしての基盤となるのだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.