はじめに
利用しているWebサービスのメンテナンス情報をチェックしたい!!
でも、専用のWeb APIもなけりゃRSSも提供されていない。
毎日確認しに行くのはかったるいし、絶対忘れる。
そんな作業を自動化するために、PowerShellで自動化スクリプトを作成しました。
やりたいこと
- 所定のWebサイトのソースを取得する。
- 前回実施した結果と比較する。
- 違っていた場合はメッセージ通知。
環境
- Windows7
- Internet Explorer11
- PowerShell2.0
PowerShellコード
# Webサイトソース保存先
$OUTPUT_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path
$CURRENT_FILE = $OUTPUT_DIR + "\current-website.txt"
$BEFORE_FILE = $OUTPUT_DIR + "\before-website.txt"
# 前回実行したファイルが存在する場合、コピーする
if (Test-Path $CURRENT_FILE) {
copy $CURRENT_FILE $BEFORE_FILE
}
# Webサイト情報取得
$wc = new-object System.Net.WebClient
$wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko")
$wc.Headers.Add("Accept-Language", " ja-JP")
$wc.DownloadFile("http://www.hogehoge.co.jp", $CURRENT_FILE)
# 今回と前回の差分を取得する
if ($(diff $(cat -Encoding UTF8 $CURRENT_FILE) $(cat -Encoding UTF8 $BEFORE_FILE)).Length -gt 0) {
$wsobj = new-object -comobject wscript.shell
$wsobj.popup("Webサイト更新あり") >$null 2>&1
exit 1
} else {
exit 0
}
解説
if (Test-Path $CURRENT_FILE) {
copy $CURRENT_FILE $BEFORE_FILE
}
ファイルが存在するかどうかのチェックは、Test-Pathコマンドレットを利用します。
引数のファイル(ディレクトリでも可)が存在した場合、Trueが返ります。
存在しない場合は、Falseです。
$wc = new-object System.Net.WebClient
$wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko")
$wc.Headers.Add("Accept-Language", " ja-JP")
$wc.DownloadFile("http://www.hogehoge.co.jp", $CURRENT_FILE)
WebClient.DownloadFile メソッドを利用して、ファイルをダウンロードします。
第一引数は、ダウンロード元URL
第二引数は、保存先パス
を指定します。
WebClient.Headers.Addメソッドを利用することでHTTPリクエストヘッダにパラメータを追加することが出来ます。
if ($(diff $(cat -Encoding UTF8 $CURRENT_FILE) $(cat -Encoding UTF8 $BEFORE_FILE)).Length -gt 0) {
前回ダウンロード結果と今回ダウンロード結果をDIFF比較しています。
DIFF結果の文字列長が0より大きい場合は差異があると判断しています。
もう少しいい方法がありそうな予感…
$wsobj = new-object -comobject wscript.shell
$wsobj.popup("Webサイト更新あり") >$null 2>&1
wscript.sheel.popupはボタン押下結果を標準出力するため、nullに捨てています。
おわりに
Webサイト更新があった場合にポップアップを表示していますが、その後ブラウザを起動してWebサイトを表示するように修正しました。
PowerShell楽しいです(^q^)