2006 年 7 月 21 日 19 時 49 分

mixi トップに接続してみる


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


今日は、XMLHttpRequest を利用して、
mixi のトップページに接続してみる。

コードを書く前に、先にファイルの整理をしよう。

js や vbs などの単独ファイルは、
大きなプログラムを書くとどうしても肥大化してしまい、
可読性やメンテナンス性に難がある。

WSH には、複数のスクリプトファイルをまとめた
wsf という XML ベースのファイル形式があり、
js や vbs と同じように実行が可能である。
これを使えば、コードを整理することができる。

まず、スクリプト群を入れる作業フォルダを用意しよう。
「W:\Mixi Exporter」 とでもしとくかな。

そして、そこに「lib」フォルダを作る。
ライブラリ的な機能を持ち再利用できそうなスクリプトは、
このフォルダ内に入れることにしよう。
ま、このあたりは好みの問題か。

昨日作った XMLHttpRequest.js は、
テストのために追加したコードを除き、
XMLHttpRequest 関数 1 つだけ定義された状態で、
「lib」フォルダ配下に置く事にしよう。

そして、ツールの本体となる wsf ファイルを作る。

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

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

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

実に単純である。

HTML の script 要素と同じような記述を使い、
複数の script 要素を並べることができる。
script 要素は上から順番に評価・実行される。

wsf の script 要素は直接コードを書くこともできるのだが、
保守性・役割分担の観点からそれはやめておく。

上記では、XMLHttpRequest.js を取り込んだ後に、
Main.js を取り込んで順に実行するスクリプトとなる。

Main.js は、色々書き換えてテストするためのファイルで、
これからは、Main.js を編集しながら試行錯誤する。

では、XMLHttpRequest を使って、
mixi のトップページを取り出すコードを、
Main.js に書いていこう。

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

function main() {
    var client = new XMLHttpRequest();

    client.open("GET", "http://mixi.jp", false);
    client.send("");

    WScript.Echo(client.responseText);
}

main();

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

まずは、XMLHttpRequest を作成する。
new XMLHttpRequest() と new をつけているが、
XMLHttpRequest に関してはつけてもつけなくても同じだ。
new がある方が自然に見えるので付けておこう。
今はあまり気にせず無視しておいてもらいたい。

XMLHttpRequest の利用は、open メソッドから始まる。
第 1 引数は、HTTP のメソッドで、通常は "GET" だ。
第 2 引数は、接続する URL である。
そして第 3 引数は、同期・非同期の指定だ。

XMLHttpRequest は、スクリプトを停止させずに、
バックグラウンドでダウンロードする仕組みを持っている。
これは、ブラウザでのユーザの操作を止めずに、
裏で処理をすることができるので、
AJAX 系のインタラクティブな Web ページでは必須の処理だ。

今回はバッチ系ツールなので、
ダウンロードされるまで制御を返さなくても良い。
そこで第 3 引数に false を指定して同期モードにする。

単純なリクエストなら、open の後に send を呼ぶだけだ。
send メソッドは 1 つ引数を取る。
この引数は、送信したいデータを表すが、
ページを取得するだけならば不要なので、空文字列にする。

    client.send("");

同期モード(open の第 3 引数が false)の場合、
send はサーバとのデータ転送が終わるまで戻ってこない。

サーバが返した HTML データは、
responseText プロパティに入っている。
これを、WScript.Echo メソッドで画面出力している。


では実行してみよう。コマンドプロンプトを開き、
作業フォルダ(MixiExporter.wsf のフォルダ)に移動し、
「cscript MixiExporter.wsf」で実行する。

C:\>cd /d "W:\Mixi Exporter"

W:\Mixi Exporter\>cscript MixiExporter.wsf

単にファイルをダブルクリックしても実行出来るのだが、
この場合、出力用メソッドである、WScript.Echo が、
メッセージボックスを出してしまうことがある。
これはスクリプトが wscript で実行されている時に起きる。

cscript を使えば、WScript.Echo は、
コンソールに出力してくれるので、デバッグに便利である。
なので、テストは当分の間コマンドプロンプトで行おう。

接続に成功すれば、コンソール上に、
HTML がずらーっと表示されるはずだ。
Microsoft 実装の XMLHttpRequest は、
文字コードを自動的に変換してくれる機能を持つので、
コンソールでは文字化けしていないはずだ。

さて、HTML を良く見てみよう。

ServerXMLHTTP が利用されている環境であれば、
これは、将に mixi のトップページであるはずだ。
そう、「ログイン」のフォームがあるトップページだ。

普段 Internet Explorer を使っている方の場合、
Internet Explorer で http://mixi.jp を開いた場合、
自分のページが表示されると思う。
それは、Internet Explorer (= WinInet) が
Cookie を自動的に送信しているからだ。

ServerXMLHTTP (= WinHTTP) が使われていた場合、
WinInet のキャッシュは使わないため、
初めて mixi にアクセスしたのと同じ状況となるのだ。
自動化ツールの場合、こちらの挙動であることが望ましい。

ちなみに、ServerXMLHTTP が使えない環境、
もしくは XMLHttpRequest.js を書き換えて、
XMLHTTP を使うようにした場合は、
XMLHTTP の下にある WinInet が裏で Cookie を送るので、
自分のトップページの HTML が表示されるはずである。



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