2006 年 7 月 27 日 22 時 38 分

最新日記一覧ページの取得


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


さて、長々と脱線していたので、話を軌道に戻そう。
今日は MixiSession の実装をする。

まず、以前作った _encodeForm 関数を、
「HttpUtil」クラスの静的メソッドにしよう。

========== HttpUtil.js ==========

var HttpUtil = {

    // application/x-www-form-urlencoded でエンコード
    encodeForm : function (hash) {

        var entries = [];
        var prop, key, value;

        for (prop in hash) {
            key = encodeURIComponent(prop);
            value = encodeURIComponent(hash[prop]);
            entries.push(key + "=" + value);
        }
       
        return entries.join("&"); // 「;」でもいいかも
    }

}; // var 文の終端

========== end of HttpUtil.js ==========

クラスといってもユーティリティクラスなので、
昨日書いたような厳密な定義は不要だ。
単純な Object を作成して、
メソッドをプロパティとして持たせるだけで構わない。

中括弧で書く構文は、オブジェクトリテラルである。
上記は、下記と同じコードになる。

var HttpUtil = new Object();
HttpUtil.encodeForm = function (hash) {
    // 同じなので省略…
};

値のみ持つ構造体的なオブジェクトや、
1 つのインスタンスしか使わないオブジェクト等は、
オブジェクトリテラル構文を使うとすっきり書ける。

さて、MixiSession に戻ろう。

コンストラクタはログインして認証を行う。
fetch メソッドは GET のラッパ、
post メソッドは POST のラッパである。
基本は 7/23 のコードなので、それを移植しよう。

========== MixiSession.js ==========

// クラスのコンストラクタ
function MixiSession(mailAddress, password) {

    // 内部で利用する XMLHttpRequest を作成
    this._client = new XMLHttpRequest();

    // ログイン用のパラメータを用意し、
    var form = {
        next_url: "/home.pl",
        email: mailAddress,
        password: password
    };

    // ログイン処理にアクセスして Cookie を得る
    this.post("https://mixi.jp/login.pl", form);

}

// クラスのメソッド

// GET を発行して結果の HTML を返す
MixiSession.prototype.fetch = function (url, query) {

    // クエリパラメータを用意
    var content = HttpUtil.encodeForm(query);
    if (content.length > 0) {
        content = "?" + content;
    }

    // GET で送信
    this._client.open("GET", url + content, false);
    this._client.send("");
    return this._client.responseText;
};

// POST を発行して結果の HTML を返す
MixiSession.prototype.post = function (url, form) {

    // リクエストボディを用意
    var content = HttpUtil.encodeForm(form);

    // POST で送信
    this._client.open("POST", url, false);
    this._client.setRequestHeader("Content-Type",
            "application/x-www-form-urlencoded");
    this._client.send(content);
    return this._client.responseText;
};

========== end of MixiSession.js ==========

ログインは、フォームへの送信を伴うので、
コンストラクタからは post メソッドを利用すればよい。

JavaScript は C# や Java と同じで、
コンストラクタのコードが実行されている段階では、
既にインスタンスの構築が完了している。
なので、メンバメソッドを呼び出しても問題ないのだ。

まだエラー処理はしていないので、
7/23 のコードとそこまで大きな差はない。

では、テスト用のコードを書いてみよう。

========== Main.js ==========

function main() {

    var session = new MixiSession(
            "自分のメールアドレス", "パスワード");

    WScript.Echo(session.fetch("http://mixi.jp/list_diary.pl"));

}

main();

========== end of Main.js ==========

クラスの中に処理を隠蔽したのでシンプルになった。

今日は、自分の最新日記一覧ページを取得するので、
http://mixi.jp/list_diary.pl」に接続する。

そして、上記のコードをまとめた、
WSH 起動用の wsf ファイルを編集する。

========== MixiExporter.wsf ==========

<?xml version="1.0"  encoding="shift-jis" ?>
<job>
    <script language="javascript" src="./lib/XMLHttpRequest.js" />
    <script language="javascript" src="./lib/HttpUtil.js" />
    <script language="javascript" src="./lib/MixiSession.js" />
    <script language="javascript" src="./Main.js" />
</job>

========== end of MixiExporter.wsf ==========

さて、実行してみよう。

長い HTML がずらずらと表示される。
どうやら成功したようだ。

明日は、この HTML から情報を取り出してみよう。



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