今回は、前回までに作成した「getss.ps1」でWebページのスクリーンショットを取得する処理を改善していく。現状では、Microsoft Edgeのヘッドレスモードを使ってWebページのスクリーンショットを撮っているが、コンテンツによってはこれができない。そうしたコンテンツを避けるように、PowerShellスクリプトの処理を変更する。
前回のgetss.ps1
前回改良したgetss.ps1では、PowerShellスクリプトの内部構造を整理し、Snipping Toolでデスクトップのスクリーンショットを撮るという機能を追加した。
#!/usr/bin/env pwsh
#========================================================================
# スクリーンショットを取得する
#========================================================================
#========================================================================
# 引数を処理
# -URI uri スクリーンショットを取得するリソースのURI
# -Width width スクリーンショットの幅
# -Height height スクリーンショットの高さ
#========================================================================
Param(
[Parameter(Mandatory=$false)][String]$URI = "desktop:",
[Int]$Width = 1200,
[Int]$Height = 800
)
#========================================================================
# デフォルトのスクリーンショットファイル
#========================================================================
$outfile="${env:HOME}/ss.png"
#========================================================================
# スクリーンショットの取得に利用するアプリケーション
#========================================================================
$msedge='C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
$snippingtool='SnippingTool.exe'
#========================================================================
# どの方法でスクリーンショットを取得するか判断
#========================================================================
switch -Wildcard ($URI)
{
'http*'
{
#========================================================
# Microsoft Edgeを使って取得
#========================================================
$method='msedge'
break
}
'desktop:*'
{
#========================================================
# Snipping Toolを使って取得
#========================================================
$method='snippingtool'
break
}
}
#========================================================================
# スクリーンショットを取得
#========================================================================
switch ($method)
{
#================================================================
# Microsoft Edgeを使って取得
#================================================================
'msedge'
{
$o1='--headless'
$o2='--screenshot="' + ${outfile} + '"'
$o3="--window-size=${Width},${Height}"
Start-Process -FilePath $msedge `
-ArgumentList $o1,$o2,$o3,$URI `
-Wait
break
}
#================================================================
# Snipping Toolを使って取得
#================================================================
'snippingtool'
{
Start-Process -FilePath $snippingtool
# ※ -Waitは指定しても機能しない
break
}
}
Webリソース以外のスクリーンショットも取得できるようにするため、引数で取っていたURLをURIへ拡張し、内部のフローを再整理した。今回は、これにWebコンテンツの種類を判定する処理を追加する。
Microsoft Edgeのヘッドレスモードでは取得できない
Microsoft Edgeのヘッドレスモードでは、スクリーンショットを取得できないケースがある。例えば、MIMEタイプがtext/htmlに分類されるリソースは取得することができるのだが、PDFやCSVといったデータは今のところ取得できない。将来的には取得できるようになるかもしれないが、今のところは無理なのだ。
処理は、「netcat.ps1」を作ったときと同じように実装する。まず、URIの拡張子などからMIMEタイプが明確なものについては、その段階でMIMEタイプを定めてしまう。処理の高速化のためだ。ここでMIMEタイプが判断できないものについては、curlでWebサーバに問い合わせてMIMEタイプを取得する。
MIMEタイプが確定したら、次はMIMEタイプに従って処理を分ける。ここではMIMEタイプがtext/htmlとtext/plainの場合のみ、処理をこれまで通り続けることにして、それ以外の場合には代わりに「http://example.com/」のスクリーンショットを撮るようにする。ここの処理は何でもよいのだが、実装しやすいのでとりあえずこうしておく。
コンテンツ種類の判断とそれを利用する処理へ変更していく
では書き換えだ。今回の目的に一致するようにgetss.ps1を書き換えていく。netcat.ps1で実装したものと似ているので、そこからコードを持ってきて書き換える方法で十分に対応できる。
まず、コンテンツ種類の確認にcurl.exeを使うので、このコマンドパスを変数に代入しておく。
#========================================================================
# スクリーンショットの取得に利用するアプリケーションほか
#========================================================================
$msedge='C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
$snippingtool='SnippingTool.exe'
$curl='C:\Windows\System32\curl.exe'
次に、引数に指定されたURIからコンテンツタイプを判断する処理を追加する。これは、netcat.ps1に追加したものとほぼ同じでよいと思う。拡張子が「.html」「.htm」「.shtml」になっていれば「text/html」、「/」で終わっていても「text/html」、「.txt」で終わっていれば「text/plain」とする。
#========================================================================