はじめに
開発環境も開発言語も全然知らない時に、無い知恵を絞って作ってみたもので、参考になるものではないです。(今では少し触れる程度はできるようになったと思いたい。)
Webスクレイピングのちゃんとした記事を探している方は、別を当たった方が良いです。
この記事は「非エンジニアな人は(簡単な事も出来なくて)大変だなぁ」と暖かい目で見て下さい。
いきさつ
毎月決まった日に、全部署を回って、現在の複合機の印刷枚数を記録表に記入しなさい。
と、業務の引き継ぎを受けました。その記録を付ける事に意味があるのか疑問だったりしましたが、社内資料の作成に使用するとのことで、言う通りにこの地道な作業を実行しておりました。
ただ、そう長くは続きませんでした。
...非常にめんどくさい
少し経った頃、複合機にはHTTPでアクセスができ、複合機の本体まで行かなくても印刷枚数を確認できる事に気付きました。すぐ気付けよって感じですね。
おかげで、各部署へ出向いて印刷枚数を調べて記録用紙に書き込むという手間がなくなりました。しかし、毎月複数のURLを開いて、そこに書いてある数字を管理表にコピペしていくというのも、めんどくさくなってしまいました。
そこでなんとかできないかと、PoweshellでHTTPアクセスをして、該当部分を抜き出し、IP(機種)毎にCSVに吐き出すスクリプトを作ってみました。
Poweshellは別途ソフトをインストールする事なく動いてくれるので、便利ですね。逆に言えば始めから入ってるだけなのかもしれませんが。開発環境がなく、Windows付属のものでなにかないだろうか、と探していたところPowershellを使ってみるきっかけとなりました。
$ip = @()
$ip += "192.168.100.10" #○○部
$ip += "192.168.100.20" #△△部
$ip += "192.168.100.30" #××部
$ip += "192.168.100.40" #□□部
for ( $i = 0; $i -lt $ip.Length; $i++)
{
$url ="http://"+$ip[$i]+"/count.htm"
$check = Invoke-WebRequest $url
if ( $check -eq $null )
{
$mail_subject = "Script Error"
$mail_body = "プリンタカウント収集"
. .\send_mail.ps1 #接続失敗したらメールでお知らせ
continue
}
$client = New-Object System.Net.WebClient
if( $check -match "charset=UTF-8" )
{
$client.Encoding = [System.Text.Encoding]::UTF8
}
$response = $client.DownloadString($url)
$pos_s = $response.IndexOf("var info=") + 10 #カウント数値を取得
$pos_e = $response.IndexOf(";",$pos_s) - 1
$counter = $response.SubString($pos_s,$pos_e-$pos_s)
$counter = $counter.Split(",")
$counter_i = @()
$counter_d = @()
$counter_i += "データ取得日"
$counter_d += Get-Date -format "yyyy/MM/dd"
$counter_i += "データ取得時間"
$counter_d += Get-Date -format "HH:mm"
for ( $ib = 0; $ib -lt $counter.Length/2; $ib++ )
{
$counter_i += $counter.Replace("'","")[0+($ib*2)]
$counter_d += $counter[1+($ib*2)]
}
$counter_ii = $counter_i -join ","
$counter_di = $counter_d -join ","
$filename = $ip[$i]
Write-Output $counter_di | Add-Content $filename".csv" -Encoding Default
Remove-Variable check
}
接続できなかった時は、メールでお知らせ。
$to = "mail@address.dayo"
$from = "mail@address.dayo"
$smtp = "mail.address.dayo"
$port = 587
$user = "mail@address.dayo"
$pass = "password" | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $user,$pass
$subject = "$mail_subject"
[string]$body = @()
$body += "[$mail_body]にエラー発生"
Send-MailMessage -To $to -From $from -SmtpServer $smtp -Subject $subject -Body $body -Encoding UTF8 -Port $port -Credential $credential
事務の部門って、データを扱う&ルーチンワーク多い所だと思います。パソコンと相性良いですよね。
でもそれって、スキルのあるエンジニアの人が事務やったら自分含めみんなクビになっちゃうだろうとか。大企業なんてすでに、効率的な事務をしているんだろうなと思うと、将来に不安をおぼえてしまいますね。