InDesignでSocketクラスの上位クラスを作りHTTPでアクセス


VBS for Adobe InDesign+更新履歴・メモ: Socketオブジェクトで遊ぶ。いや遊ばれる

で、InDesignのSocketオブジェクトを発見というか発掘され、InDesignからWebの情報を引っ張ると言うことをやっておられます。

正直InDesignだけでWebにアクセス出来るだなんて考えたこと無かったのですごいと思いました。

それで、サンプルプログラムを書き直したくなったんでちょっとやってみました。PerlのLWPモジュール風に簡単にHTTPのアクセスが出来ればいいよねーという感じで、ものすごく機能絞ったプロトタイプ的なものを作成。

(function(){
    
    function Lwp() {
        // コンストラクタ。ここでUser-Agent名や
        // timeout値など準備しておくといいよね
        this.userAgent = 'InDesign/5.0.3 '
        +'(Windows; U; Windows NT 6.0; ja;)';
    };
    Lwp.uri =function(uri) {
        var rex = new RegExp( 'http://([^:/]+)(?::(\d+))?(.+)' );
          // via http://pc11.2ch.net/test/read.cgi/php/1015692614/57
        var urlObj =[];
        if ( uri.match(rex) ) {
            urlObj.host = RegExp.$1;
            urlObj.port = RegExp.$2 ?RegExp.$2 :80;
            urlObj.path = RegExp.$3;
        }
        return urlObj;
    }
    Lwp.prototype.get = function (uri) {
        var conn = new Socket;
        var urlObj = Lwp.uri(uri);
        if (conn.open ( urlObj.host + ':' + urlObj.port, 'UTF-8' ) ) {
            conn.write ('GET ' + urlObj.path + " HTTP/1.0\n"
            + 'Host: ' + urlObj.host + "\n"
            + 'User-Agent: ' + this.userAgent + "\n"
            + "\n");
          var reply = conn.read(999999);
          conn.close();
            return reply.substring(reply.indexOf("\n\n") + 2 );
        }
    }
    
    // main
    
    var lwp = new Lwp;
    var contents = lwp.get('http://www.yahoo.co.jp/');
    
    var txf = app.activeDocument.textFrames[0];
    txf.contents = contents;
    
})();

それならブログのほうはどうだ? これはUTF-8だぞ。ところが302エラー。せうぞーさんのところもYUJIさんのところも302エラー。どうもサーバーとドメインの関係で、取得できないっぽい。

Socketでのアクセスなので、一般のブラウザ的なアクセスをさせるには、ちゃんとしたユーザエージェントとして振る舞うよう作らなくては駄目。そのためには、ちゃんとリクエストヘッダに必要な情報を入れるとか(Hostをみて名前ベースバーチャルホストを実現しています)、レスポンスヘッダを読んで適当な処理をさせたりする(転送はちゃんとやらないと駄目とか)ことが重要だとおもいます。

と言うわけで、自分ところのblog(blog.dtpwiki.jpをcocolog.nifty.comのIPに割り当て、cocologの名前ベースバーチャルホストで表示)は、元ソースでは表示できなかったわけですが、上記ソースで取得できています。

上記ソースのように、クラスとして、httpのユーザエージェントを作ると、作りやすいと思います。