このアーカイブは同期化されません。 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 から情報を取り出してみよう。