以前試していた、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に対応したいところ。CPANのMIME::Lite::HTMLを試してみたがいまいちだった。Pythonの場合は非公式ライブラリを見つけた。
IEのオートパイロットの方がもしかしたら確実??