LotusScriptでWebクライアントを実装する

■唐突ではあるがNotes/DominoのLotusScriptなど、Visual Basic系の開発環境で任意のWebサイトにデータをGET/POSTする方法をまとめておく。利用するCOMオブジェクトは「MSXML2.XMLHTTP」「ADODB.Stream」の2つ。ADODB.Streamが必要な理由は、Webサーバから受け取ったコンテンツの文字コードを正しく識別するためだ。以下の例はExcelのVisual Basic for Applicationsで一応動作検証をしている。
まず単純にGETメソッドで特定のWebページのコンテンツを読込む処理から。一例としてYahoo!JAPANのトップページを読込む。やや面倒なのは文字コードを正しく処理するためにADODB.Streamオブジェクトをいったんバイナリモードにしてページ内容を読み込んでから、テキストモードに変換して読み出すという点だ。
テキストモードに変換した後に読み出すときは、Webページの文字コードに合わせてADODB.StreamオブジェクトのCharsetプロパティに「Shift_JIS」「UTF-8」「euc-jp」などの文字コードを現す文字列を設定してからReadTextメソッドで読み出すこと。
MSXML2.XMLHTTPオブジェクトのOpenメソッドで、3番目の引数は同期モードか非同期モードかの区別を表す。False(偽)にしておくと同期モードになるため、Webページが完全にダウンロードされるまで次の行には進まない。Visual Basicプログラムなら同期処理の方が便利だろう。
Dim oHttp, oStream As Variant
Set oHttp = CreateObject(“MSXML2.XMLHTTP”)
Set oStream = CreateObject(“ADODB.Stream”)
oHttp.Open “GET”, “http://www.yahoo.co.jp/”, False
oHttp.Send
oStream.Open
oStream.Type = 1 ‘ いったんバイナリモードにする
oStream.Write oHttp.responseBody
oStream.Position = 0
oStream.Type = 2 ‘ テキストモードに変換する
oStream.Charset = “euc-jp” ‘ Webサイトに合った文字コードを設定
Open “temp.html” For Output As 1
Print #1, oStream.ReadText
Close #1
次にPOSTメソッドでWebサイト上の入力フォームにデータを送信する処理。Yahoo!やGoogleはプログラムなどによって自動で検索データを送信することを許可していないようなので、@niftyの検索機能でテストしてみた。それでも検索結果のテキストファイルは形が崩れているが、一応正しく検索されていることがわかる。
Dim oHttp, oStream As Variant
Dim vData As Variant
Set oHttp = CreateObject(“MSXML2.XMLHTTP”)
Set oStream = CreateObject(“ADODB.Stream”)
oHttp.Open “POST”, “http://search.nifty.com/cgi-bin/search.cgi”, False
oHttp.setRequestHeader “Content-type”, “application/x-www-form-urlencoded”
vData = “select=2&Text=AAA”
oHttp.Send vData
送信するフォームデータはVariantとして宣言し、GETメソッドの場合と同じ形式でQuery String(問い合わせ文字列:パラメータと値を半角等号で連結、そのペアを半角&記号で連結するという形式)を代入する。それをMSXML2.XMLHTTPオブジェクトのSendメソッドの引数にすればいいだけだ。「oStream.Open」以下は上記のコードと全く同じなので省略する。
送信するデータの中に半角英数字以外の文字が含まれている場合は、当然URLエンコードする必要がある。たとえば「高橋源一郎」という文字列は「%E9%AB%98%E6%A9%8B%E6%BA%90%E4%B8%80%E9%83%8E」というふうにURLエンコードする必要がある。LotusScriptであれば@関数に@URLEncodeというそのものずばりの関数が用意されているので1行でURLエンコードが完了してしまう。非常に便利である。
vData = Evaluate(“@URLEncode(“”Shift_JIS””;””” & vData & “””)”)
oHttp.Send vData(0)
LotusScriptのEvaluate関数を使った結果は配列変数になることを忘れないようにしたい。@URLEncode関数は1個しか値を返さないので配列のインデックスが0の値が戻り値である。したがって「oHttp.Send vData(0)」となる。「oHttp.Send vData」では正しくWebページが返ってこない。
VBScriptやVisual Basic for Applicationsの場合には残念ながらURLエンコード用の関数が用意されていない(Active Server PagesならServerオブジェクトのメソッドとして用意されている)。ただベクターなどからフリーウェアで変換ルーチンをダウンロードできるようなので、そちらをお試し頂きたい。
さて、このようにVisual Basic系の言語で任意のWebページに自由にデータを登録することで何をやりたいのかと言えば、他システムとデータをやりとりするインターフェースをもたない社内のWebアプリケーションに、自動でデータを登録することである。
勘の良い方はもうお分かりのとおり、デスクネッツ・スタンダード版にバッチ処理でデータを登録できないかと考えていたのだ。Notes/DominoならLotusScriptを使えば自動で文書を登録するくらい簡単にできてしまうのだが、デスクネッツ・スタンダード版には(そしておそらくEnterprise版も)そのようなAPIが存在しないので、直接Webフォームにデータを送り込むしかない。
そして最終的にはデスクネッツの電子会議室に自動でスレッドを立てられるようになった。それについては別途ご説明する。