SQLの窓 イラストAC フリー素材

2013年01月07日

コマンドプロンプトから VBScript を使って POST 投稿する

コマンドプロンプトから Windows PHP を使って POST 投稿する』では、PHP を使いました。PHP のほうが関数等整理されてドキュメントも揃っているから扱いやすく、応用もしやすいです。
( Google Chrome 拡張 : PHP Docs )

VBScript は Windows 標準ですが、込み入った処理は全て自作する必要があるので、通常あまり利用されません。ここでは、特に SHIFT_JIS を UTF-8 に変換する必要があるので(さらにパーセントエンコーディングも必要)、以下のコードをそのまま使う必要があります。
Set objHTTP = Wscript.CreateObject("MSXML2.XMLHTTP")
Set Stream1 = Wscript.CreateObject("ADODB.Stream")
Set Stream2 = Wscript.CreateObject("ADODB.Stream")
Set StreamBin = Wscript.CreateObject("ADODB.Stream")

strTargetUrl = "http://winofsql.sakura.ne.jp/lightbox/work/web/log.php"

strData = Replace( Wscript.Arguments(0), "\n", vbCrLf )
strData = "send=ok&text=" & EUC_URLEncode(strData)

' False は非同期
Call objHTTP.Open("POST",strTargetUrl,False)
' 標準 POST 用
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
' 仕様
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
' 送信
Call objHTTP.Send(strData)

' ***********************************************************
' SHIFT_JIS を UTF-8 に変換して URLエンコード
' ***********************************************************
Function EUC_URLEncode(str)

	Dim Buffer,LineBuffer,i,CWork

	Stream1.Open
	Stream1.Charset = "shift_jis"
	' shift_jis で入力文字を書き込む
	Stream1.WriteText str
	' コピーの為にデータポインタを先頭にセット
	Stream1.Position = 0
 
	Stream2.Open
	Stream2.Charset = "utf-8"
	' shift_jis を euc-jp に変換
	Stream1.CopyTo Stream2
	Stream1.Close

	' コピーの為にデータポインタを先頭にセット
	Stream2.Position = 0

	' バイナリで開く
	StreamBin.Open
 	StreamBin.Type = 1

	' テキストをバイナリに変換
	Stream2.CopyTo StreamBin
	Stream2.Close

	' 読み込みの為にデータポインタを先頭にセット
	StreamBin.Position = 0

	Buffer = ""
	StreamBin.Read(3)
	Do while not StreamBin.EOS
		LineBuffer = StreamBin.Read(16)
 
		For i = 1 to LenB( LineBuffer )
			CWork = MidB(LineBuffer,i,1)
			Cwork = AscB(Cwork)
			Cwork = Hex(Cwork)
			Cwork = Ucase(Cwork)
			if Len(Cwork) = 1 then
				Buffer = Buffer & "%0" & Cwork
			else
				Buffer = Buffer & "%" & Cwork
			end if
		Next
 
	Loop

	StreamBin.Close

	EUC_URLEncode = Buffer

End Function

このコードは、もともとは Twitter 投稿の為に作成したものですが、実際に日次のバッチ処理として運用しています。

更新された情報があった場合、夜間にインターネット上のサーバーの DB を更新する為の通信処理として使っています。

バッチファイル
@echo off
setlocal
set path=.\php;%PATH%
set myurl=http://xxxxx.sakura.ne.jp/lightbox/..../text.log

REM VBScript で投稿
cscript test.vbs "アップ ロードする\n文 字 列\nの指定"

REM 5秒間待機
timeout 5 /nobreak

REM 投稿後のログを PHP でダウンロード
php -r copy('%myurl%','text.log');

endlocal

このテストでは、バッチファイルで投稿後、ログを直接 PHP で取得しています。このコードでは、MSXML2.XMLHTTP というクライアント用のオブジェクトを使っているので、この投稿処理をループ内で使って連続処理を行う事もできます(サーバー用のオブジェクトである ServerXMLHTTP では連続処理はできません)。この何年かで、これらのオブジェクトは Microsoft によってこっそり更新されたりして振る舞いがいろいろ変ったりしていますが、ケースバイケースでどちらかを使わないと動かない場合があります。しかし、たいていにおいて クライアント側のオブドェクトで動作すると思います。

関連する記事

コマンドプロンプトから VBScript を使って POST 投稿する
PHP による『超簡易掲示板』 / アブリケーションからの POST 検証用
Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る



タグ:VBScript
【役に立つWindowsの最新記事】
posted by at 2013-01-07 14:30 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX