1. ホーム
  2. スクリプト・コラム
  3. vbs

GZIP圧縮されたHTTPコンテンツを取得するためのVBSコード

2022-02-08 11:32:42

多くのウェブサイトでは、読み込み速度を向上させるために、HTTPサーバーのGZIP圧縮機能を有効にしています。クライアントから送信されたHTTPリクエストがGZIPエンコードを許容することを宣言すると、サーバーは自動的にHTTPレスポンスのコンテンツをGZIPで圧縮します。しかし、VBSでGZIPエンコードを自動的に解凍するのは、それほど簡単ではありません。

GZIP圧縮は、Msxml2.XMLHTTPを始めとして、コンポーネントによって扱いが異なります。

'By Demon
'http://demon.tw
Dim http
Set http = CreateObject("Msxml2.XMLHTTP")
http.open "GET", "https://www.baidu.com", False
http.setRequestHeader "Accept-Encoding", "gzip"
http.send
WScript.Echo http.responseText

テストの結果、Msxml2.XMLHTTPはGZIPの伸張を自動で行ってくれて、GOOD!

次に、Msxml2.ServerXMLHTTPです。

'By Demon
Dim http
Set http = CreateObject("Msxml2.ServerXMLHTTP")
http.open "GET", "https://www.baidu.com", False
http.setRequestHeader "Accept-Encoding", "gzip"
http.send
WScript.Echo http.responseText

残念ながら、返されたコードは文字化けしています。WinHttp.WinHttpRequest.5.1をもう一度見てみてください。

'By Demon
Dim http
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
http.open "GET", "https://www.baidu.com", False
http.setRequestHeader "Accept-Encoding", "gzip"
http.send
WScript.Echo http.responseText

やはり文字化けしている。XMLHTTPコンポーネントは一般的な使用には十分すぎるほどですが、Cookieが送れない、Referencesの偽造ができないなど、うまくいかないこともあります。そこで、やはりGZIPをデコードする方法を考えなければならないのですが、VBSでアルゴリズムを書くか、サードパーティのコンポーネントを呼び出すかの2つの方法しかありません。

アルゴリズムは、あまり効率的ではないと思うので、興味のある方はお遊びで書いてみてください。Chilkat.Gzipというサードパーティ製のコンポーネント(サードパーティ製を使うなんて、本当に年なんだなぁ)がいい感じです。

Dim Gzip
Set Gzip = CreateObject("Chilkat.Gzip")
Gzip.UnlockComponent ""
'By Demon
Dim http
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
http.open "GET", "https://www.baidu.com", False
http.setRequestHeader "Accept-Encoding", "gzip"
http.send
WScript.Echo Gzip.UncompressString(http.responseBody, "utf-8")

ところでこのコンポーネントは30日間の無料お試しで有料なのですが、それでもVBSで実装すべきなのでしょうか?

元記事: http://demon.tw/programming/vbs-http-gzip.html