今回は、前回までに作成した「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」とする。

#========================================================================

この記事は
Members+会員の方のみ御覧いただけます

ログイン/会員登録(無料)

会員サービスの詳細はこちら