2011/02/16

HTTPオブジェクトで受信したCookieを使用したアクセスを行う

会員制のサイトなどのコンテンツにアクセスするには、IDとパスワードを入力してログインしなければならない場合があります。
このようなサイトでは、サーバが正しいログイン情報を受取った時にユーザーを識別するセッションIDを生成して「Set-Cookie」というレスポンスヘッダで送信し、それを受取ったブラウザなどのクライアントプログラムが次回以降のアクセス時に「Cookie」というリクエストヘッダでセッションIDを送信することで認証済みであることを証明するという方式がよく用いられています。

NILScriptのHTTPオブジェクトには、受取ったCookieを保持して次回アクセス時に送信するという機能が用意されており、このような認証が必要なサイトのコンテンツにも簡単にアクセス出来ます。
以下に示すのは、mixiにログインして指定コミュニティのトップページのテキストを抽出・表示するというスクリプト例です。
var user="user@example.com",pass="password";
var url="https://mixi.jp/view_community.pl?id=38328";
try{
    var http=new (require('HTTP').HTTP)();
    http.getText({
        url:"https://mixi.jp/login.pl",
        method:"post",
        body:{
            next_url:"/home.pl",
            email:user,
            password:pass,
            sticky:"",
        }
    });
    println(String((new (require('LooseXML').HTML)(http.getText(url)))
    .$0('#communityIntro')).replace(/]*>/ig,'\n').replace(/<.*?>/ig,''));
}finally{
    free(http);
}
HTTPクラスには「HTTP.getText()」のようなクラスメソッドが用意されていますが、Cookieを用いたアクセスを行うには、new HTTP()でインスタンスを生成する必要があります。
次に、このHTTPオブジェクトのgetText()メソッドでログイン情報を送信します。送信先URLとパラメータ名などは、ログインフォームのHTMLなどから探してください。

ログインに成功すれば、このHTTPオブジェクトにCookieが保存されます。
なお、リクエストオプションオブジェクトで「ignoreCookies:true」を指定すれば、受取ったCookieを無視させることも出来ます。
以降は、普通にこのHTTPオブジェクトのgetText()メソッドやsaveTo()メソッドを呼び出せば、アクセス先サーバから過去に受取って保存されたCookieが送信され、ログイン済みでないとアクセス出来ないコンテンツなどにもアクセス出来ます。

HTTPオブジェクトには次回アクセス時に再利用するためにKeep-Alive状態になっているTCPStreamオブジェクトなども保持されているので、使い終ったらfree(http)のようにして解放する必要があります。

なお、この機能はずっと実装するのを忘れたまま放置されていて、つい最近実装されました。使用するには、最新版にアップデートしてください。

0 件のコメント:

コメントを投稿