それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

MHTMLをCDOで作る方法修正版

以前試していたCDO.Message/CreateMHTMLBodyを使う方法は、時々失敗するようで。原因を調べていたら

なるほど、煎じ詰めるとCDOが下請けに使ってるURLMON.DLLとの関係がアレなんで、http1.1の圧縮使っているページではエラーが出ると。
単純にはIEの設定でhttp1.1を切れ、と。
覚書:CDOSYSのCreateMHTMLBodyがエラーを吐く

というわけでやってみた。原理は、IEのインターネットオプションのレジストリを一時的に書き換え。ものすごく乱暴な対応法だけど、まとめてDLするだけならこれで十分だったりする。実際はコマンド引数を使うようにWSHを書いています。

/////////JSからCDOを使って、MHTMLを作成する
//HTTP1.1問題暫定対応版
EnableHttp1_1(false);
var obj = WScript.CreateObject("CDO.Message");
var filename = "test.mht";
var url = "http://www.google.com";
//var url = "http://www.yahoo.co.jp";
obj.MimeFormatted = true;
obj.CreateMHTMLBody( url, 0, "", "" );
obj.GetStream().SaveToFile( filename, 2 );//2 allow overwrite;
EnableHttp1_1(true);

function EnableHttp1_1(val){
  WshShell = new ActiveXObject( "WScript.Shell" );
  $path = "HKEY_CURRENT_USER\\Software\\"
          +"Microsoft\\Windows\\CurrentVersion\\"
          +"Internet Settings\\EnableHttp1_1";
  str = WshShell.RegWrite( $path, val ? 0x00000001 :0x00000000 ,"REG_DWORD");
}

レジストリ書き換えるのはうれしい解決じゃない。できればHTTP1.1のDeflateに対応したいところ。CPANMIME::Lite::HTMLを試してみたがいまいちだった。Pythonの場合は非公式ライブラリを見つけた。

IEのオートパイロットの方がもしかしたら確実??