[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+]

WSH を使った VBScript いろいろ / 応用例

WSH を使った VBScript なものを作りましたが、 その応用として、某U銀行の預金残高をメールで通知するものや、 イベントログをメールするものを作りました。
メールで流してはよくなさそうなものを扱っている気もしますが、 あくまでも例ということでご容赦ください。
もし実際に試されるときは、リスクを十分承知の上で、ご自分の責任で行ってください。


目次


某U銀行の預金残高をメールで通知する

準備 - IE を使ったり Outlook を使ったり

IE の使い方は こちら、 Outlook の使い方は こちら にあります。
以下のように、サブルーチンにしておきます。

Sub waitPage (objIE)
        Do While objIE.busy
        Loop
        Do While objIE.Document.readyState <> "complete"
        Loop
End Sub

Sub getPage (objIE, strURL)
        objIE.Navigate(strURL)
        Call waitPage(objIE)
End Sub

Sub sendMail (objMail, strTo, strSubj, strBody)
        objMail.To = strTo
        objMail.Subject = strSubj
        objMail.Body = strBody
        objMail.Send
End Sub

waitPage は、IE がページを取得し終わるまで待つためのものです。
getPage は、指定した URL を IE に取得させるものです。
sendMail は、Outlook にメールを送信させるためのものです。
詳細は割愛します。

ログインする

ログインするためのフォームは、以下のようになっていました。

<form name="INPUT">
<input type="text" name="tb_no1">
-
<input type="text" name="tb_no2">
<input type="password" name="log_pass">
</form>
<form name="SEND">
<input type="submit" name="submit" value="ログイン">
</form>

ログインに必要な ID が tb_no1tb_no2、 パスワードが log_pass です。
ブラウザ上では、ID とパスワードを入力してログインボタンを押せば、 ログインできます。これと同じことをやればいいわけです。

set objIE = WScript.CreateObject("InternetExplorer.Application")
'objIE.Visible = True
Call getPage(objIE, "https://www.u-bank.local/login/index.html")
objIE.Document.INPUT.tb_no1.value = "ひみつ1"
objIE.Document.INPUT.tb_no2.value = "ひみつ2"
objIE.Document.INPUT.log_pass.value = "ひみつ3"
objIE.Document.SEND.submit.Click
Call waitPage(objIE)

URL はうそっぱちです。本当の URL は各自でご確認ください。
ひみつ1〜3のところは、本当の値を入れます。 ここでは当然ひみつです。
ID やパスワードとログインボタンが別のフォームになっていてややこしいですが、 (上記では書いていない)JavaScript で書かれた処理は IE がやってくれますので、 気にせずに素直に書きます。

ここまででログイン処理が完了です。
ただし、ここまでを試そうとしても、IE が表示されないので、ちゃんと動いているのか どうかがわかりません。
コメントされた objIE.Visible = True を有効にすれば、IE が表示されます。
でもって、いま表示されているページに、残高が表示されています。 これをメールします。

Set objApp = CreateObject("Outlook.Application")
Set objMail = objApp.CreateItem(0)
Call sendMail(objMail, "宛先", "[Ub] " & _
    Date, objIE.Document.body.innerText)
set objMail = Nothing
set objApp = Nothing

宛先 のところに、 宛先となるメールアドレスを入力します。 次の引数はサブジェクトです。 とりあえず "[Ub] 日付" としましたが、気に入らなければお好きなものに変更してください。

ログアウトする

某U銀行のログアウトは、2段階になっています。
ログアウトのページに移動して、ログアウトボタンを押さなければいけません。
先ほどの、ログインしたところのページに、ログアウトのリンクがあります。 具体的には、以下のようになっています。

<script language="javascript">
  var C_DOC_URL = "https://sso.u-bank.local/logout";
  function getDOCURL() {
    return C_DOC_URL;
  }

  document.write('<a href="' + getDOCURL() + '/INYHAOFF.htm">');
</script>
ログアウト</a>

すごくまわりくどいですが、getDOCURL() は C_DOC_URL を返すだけなので、 ログアウトのリンクは、 https://sso.u-bank.local/logout/INYHAOFF.htm です。
ここに移動するのは、こうするだけです。

Call getPage(objIE, "https://sso.u-bank.local/logout/INYHAOFF.htm")

そして、ログアウトのリンクの先にあるログアウトボタンは、以下の通りです。

<form name="SEND" action="/gogologout">
<input type="submit" value="OK">
</form>

このボタンを押せば、ログアウト完了です。

objIE.Document.SEND.submit()
Call waitPage(objIE)
set objIE = Nothing

まとめ

以上を連結すると、以下のようになります。

個人情報をもろメールで流すというリスクや、 某U銀行が HTML を変更したらそれにあわせて書き換える必要などありますが、 使い方を間違えなければ、便利なものになる…かもしれません。
そのまま使わずに、いろいろ手を加えて遊んでみてください。

Dim objIE, objMail, objApp

Sub waitPage (objIE)
        Do While objIE.busy
        Loop
        Do While objIE.Document.readyState <> "complete"
        Loop
End Sub

Sub getPage (objIE, strURL)
        objIE.Navigate(strURL)
        Call waitPage(objIE)
End Sub

Sub sendMail (objMail, strTo, strSubj, strBody)
        objMail.To = strTo
        objMail.Subject = strSubj
        objMail.Body = strBody
        objMail.Send
End Sub

' Login
set objIE = WScript.CreateObject("InternetExplorer.Application")
'objIE.Visible = True
Call getPage(objIE, "https://www.u-bank.local/login/index.html")
objIE.Document.INPUT.tb_no1.value = "ひみつ1"
objIE.Document.INPUT.tb_no2.value = "ひみつ2"
objIE.Document.INPUT.log_pass.value = "ひみつ3"
objIE.Document.SEND.submit.Click
Call waitPage(objIE)

' Mail
Set objApp = CreateObject("Outlook.Application")
Set objMail = objApp.CreateItem(0)
Call sendMail(objMail, "宛先", "[Ub] " & Date, objIE.Document.body.innerText)
set objMail = Nothing
set objApp = Nothing

' Logout
Call getPage(objIE, "https://sso.u-bank.local/logout/INYHAOFF.htm")
objIE.Document.SEND.submit()
Call waitPage(objIE)
set objIE = Nothing


イベントログをメールで通知する

昨日のイベントログを取得して、メールするものを作りました。
WMI のオブジェクトを作成し(といってもよくわかっていません…)、 作成された日時が昨日のログを取得します。

Dim objMail, objApp
Dim nowDate, prevDate
Dim objWMI, colEvents
Dim strBody

nowDate = CDate(Date)
prevDate = DateAdd("d", -1, nowDate)
Set objWMI = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colEvents = objWMI.ExecQuery("Select * from Win32_NTLogEvent " _
        + "Where TimeWritten >= '" & prevDate _
        & "' and TimeWritten < '" & nowDate & "'")

For Each objEvent In colEvents
        strBody = strBody + _
                  "File:" & objEvent.LogFile +  _
                  " / Type:" & objEvent.Type + _
                  " / Category:" & objEvent.Category & vbNewLine + _
                  "Time: " & objEvent.TimeWritten & vbNewLine + _
                  "Message: " & objEvent.Message & vbNewLine
Next
Set colEvents = Nothing
Set objWMI = Nothing

TimeWritten が昨日以上今日未満のログを取得し、それぞれを文字列にしています。

あとは、変換した文字列をメールするだけです。

Set objApp = CreateObject("Outlook.Application")
Set objMail = objApp.CreateItem(0)
objMail.To = "宛先"
objMail.Subject = "[NTEventLog] : " & Date
objMail.Body = strBody
objMail.Send
Set objMail = Nothing
Set objApp = Nothing

こちらは再三出てきてますので、割愛します。

Powered by Apache PostgreSQL Usupi Logo Kuri Logo
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-]
usu@usupi.org Last modified : Tue Jun 15 23:17:05 2004