今回からはWebページをスクリーンショット画像で保存するPowerShellスクリプト「getss.ps1」を作成していく。基本となる機能はMicrosoft Edgeのヘッドレスモードだ。Microsoft Edgeのヘッドレスモードにはスクリーンショットを取得する機能があるので、これを利用してスクリプトを仕上げていく。

Microsoft Edgeのヘッドレスモード

Microsoft Edgeはヘッドレスモードで実行することで、ウインドウを表示することなくコンテンツを取得することができる。ヘッドレスモードを有効にするオプションは「--headless」だ。

さらに、このモードにはスクリーンショットを取得する機能も用意されている。「--screenshot」オプションで有効化できる。「--screenshot」オプションはさらにフルパスを引数に取るようになっており、ここでPNGファイルへのパスを指定するようになっている。指定されたパスにPNG画像データをファイルとして保存する仕組みだ。

前回はこの動作を確認するための次のコマンドを実行した。

& 'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe' --headless --screenshot=C:\Users\daichi\ss.png https://docs.microsoft.com/ja-jp/powershell/

まず、Microsoft Edgeの実行ファイルのパスが「C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe」だ。このパスは空白を含んでいるので、PowerShellで実行する場合には「&」を指定する必要があるので、実行は「& 'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'」となる。

これにヘッドレスモードを使いたいので「--headless」を、スクリーンショットを取りたいので「--screenshot=C:\Users\daichi\ss.png」を指定する。スクリーンショットの対象として「https://docs.microsoft.com/ja-jp/powershell/」を指定して実行完了だ。

なお、試してみる場合にはC:\Users\daichi\ss.pngはユーザーごとに異なるので「${env:HOME}\ss.png」のようにしていただきたい。

getss.ps1へ書き換える

スクリプトはシンプルなところから書いていくのがポイントだ。必要に応じて気軽に書き換えることができるのがスクリプトの利点であり、最初からガチガチに書かない方が良いと思う。

もう一度、先ほどの実行を確認する。

& 'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe' --headless --screenshot=C:\Users\daichi\ss.png https://docs.microsoft.com/ja-jp/powershell/

これを、今まで作ってきた「netcat.ps1」を参考にしながら、シンプルなスクリプトに書き換えていく。netcat.ps1と共通点が多くなるはずだが、それでも使わない部分を削ってシンプルな状態にする。今回は次のようなスクリプト「getss.ps1」にまとめた。

#!/usr/bin/env pwsh

#========================================================================
# スクリーンショットを取得する
#========================================================================

#========================================================================
# 引数を処理
#   -URL url        WebリソースのURL
#========================================================================
Param(
    [Parameter(Mandatory=$true)][String]$URL = ""
)

#========================================================================
# デフォルトのスクリーンショットファイル
#========================================================================
$outfile="${env:HOME}/ss.png"

#========================================================================
# スクリーンショットの取得に利用するアプリケーション
#========================================================================
$msedge='C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'

#========================================================================
# どの方法でスクリーンショットを取得するかを判断
#========================================================================
$method='msedge'

#========================================================================
# Webページのスクリーンショットを取得
#========================================================================
switch ($method)
{
    #================================================================
    # Microsoft Edgeを使って取得
    #================================================================
    'msedge'
    {
        $o1='--headless'
        $o2='--screenshot="' + ${outfile} + '"'

        Start-Process   -FilePath $msedge           `
                -ArgumentList $o1,$o2,$URL      `
                -Wait
        break
    }
}

コマンドラインとの違いは、Microsoft Edgeの実行に「&」ではなく「Start-Processコマンドレット」を使っていること、スクリーンショットを取得する方法としてMicrosoft Edge以外のアプリケーションも想定していること、などだ。

現在のMicrosoft EdgeはGoogle Chromeと同じ基盤を使っているのでかなり強力だ。しかしそれでも、スクリーンショットが取れないWebページが出てくるかもしれない。その場合にはFirefoxといった全く異なる実装系のアプリケーションを使うことになる可能性がある。そのため、仕組みとして組み入れた。

また、getss.ps1はWebページのみならずデスクトップやアプリケーションのスクリーンショットを取る方法としても使っていこうとしているので、このような感じでスクリーンショットを取るアプリケーションを分岐させる処理を加えている。

getss.ps1の動作を確認

早速、整理したgetss.ps1を実行して動作を確認してみよう。実行すると次のようになる。

getss.ps1 https://docs.microsoft.com/ja-jp/powershell/
  • getss.ps1を実行

    getss.ps1を実行

${env:HOME}\ss.pngに画像が保存されているので、確認すると次のようになっている。

  • 生成されたスクリーンショット画像: ${env:HOME}/ss.png

    生成されたスクリーンショット画像: ${env:HOME}/ss.png

想定通りに動作していることがわかる。

これから書き換えていく・加えていく機能

getss.ps1の基本的な構造はこれで良い。今後は次の機能を実現するべく、PowerShellスクリプトを拡張していく。

  • 取得するスクリーンショットのサイズ(幅×横)を指定する。
  • 保存するファイルパスを指定する。
  • スクリーンショットが取得できないWebリソースの判定と代替処理。
  • デスクトップのスクリーンショットを取る処理を追加。
  • アプリケーションのスクリーンショットを取る処理を追加。
  • Microsoft Edge以外のWebブラウザを使う処理を追加する。

上記の処理を実現できると、自動処理でスクリーンショットを取得して、さらにそのまま書類に貼り付けて使うところまで自動化しやすくなる。netcat.ps1と同じく実用的なPowerShellスクリプトとして活用できるようになるわけだ。

PowerShellスクリプトとしての機能はそれほど難しいものではなく、仕組みとしてはnetcat.ps1で使っていたものとそれほど変わらない。本連載の読者であれば、このくらいの難易度のPowerShellスクリプトを作成するのは、それほど難しくないはずだ。ラッパースクリプトとして応用が効きやすいので活用してもらえればと思う。