前回、気象庁のWebサイトから取得した「現在の気温データ」をGoogle ChartsでグラフとしてレンダリングするようにPowerShellスクリプトで実装した。最終的には、このグラフを画像として自動的に保存するようにしたい。その前段階として、今回は、グラフのPNGデータをBase64エンコードされた文字列として表示する方法について説明する。
→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。
現在の気温をグラフにするPowerShellスクリプト
まずは前回のおさらいをしよう。ちょっと長いが、もう一度P前回作成したPowerShellスクリプト「test-7.ps1」を掲載する。
#!/usr/bin/env pwsh
#========================================================================
# 気温データを取得して整理する
#========================================================================
$URL = 'https://www.data.jma.go.jp/obd/stats/data/mdrr/tem_rct/alltable/mxtemsad00.html'
$SrcFile = New-TemporaryFile
curl --get $URL > $SrcFile 2> $null
#========================================================================
# Google Charts用HTMLの用意
#========================================================================
$DataName = '現在の気温'
$GraphTitle = '東京都の現在の気温'
$GoogleChartsHTML1 = @"
<html>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
// Load the Visualization API and the corechart package.
google.charts.load('current', {'packages':['corechart']});
// Set a callback to run when the Google Visualization API is loaded.
google.charts.setOnLoadCallback(drawChart);
// Callback that creates and populates a data table,
// instantiates the pie chart, passes in the data and
// draws it.
function drawChart() {
// Create the data table.
var data = new google.visualization.DataTable();
data.addColumn('string', '');
data.addColumn('number', '$DataName');
data.addRows([
"@
$GoogleChartsHTML2 = @"
]);
// Set chart options
var options = {'title':'$GraphTitle',
'width':500,
'height':300};
// Instantiate and draw our chart, passing in some options.
var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>
"@
#========================================================================
# 東京の気象データを抽出
#========================================================================
# 東京都の気象データを抽出
$s = (Get-Content $SrcFile | Select-String '>東京都</td')
# HTMLタグなどの不要なデータを削除
$s = $s -replace '</[^>]+>',' ' `
-replace '<[^>]+>','' `
-replace '([^)]+)[*]*',''
# 地名と気温を抽出
$GraphData = ""
$Indent = " "
foreach ($l in $s) {
$a = $l -split " "
if ($GraphData) {
$GraphData = $GraphData + ",['" + $a[2] + "'," + $a[3] + "]"
}
else {
$GraphData = "$Indent['" + $a[2] + "'," + $a[3] + "]"
}
}
#========================================================================
# Google Charts用のHTMLを出力
#========================================================================
$GoogleChartsHTML1
$GraphData
$GoogleChartsHTML2
#========================================================================
# 作業用の一時ファイルを削除
#========================================================================
Remove-Item $SrcFile
このPowerShellスクリプトを実行すると、その時点で気象庁のWebページに掲載されている東京の各地の気温をグラフとしてレンダリングするための、次のようなHTMLが生成される。
<html>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
// Load the Visualization API and the corechart package.
google.charts.load('current', {'packages':['corechart']});
// Set a callback to run when the Google Visualization API is loaded.
google.charts.setOnLoadCallback(drawChart);
// Callback that creates and populates a data table,
// instantiates the pie chart, passes in the data and
// draws it.
function drawChart() {
// Create the data table.
var data = new google.visualization.DataTable();
data.addColumn('string', '');
data.addColumn('number', '現在の気温');
data.addRows([
['小河内',17.4],['青梅',21.1],['練馬',21.3],['八王子',20.8],['府中',21.0],['東京',20.9],['江戸川臨海',19.9],['羽田',20.4],['大島',20.2],['大島北ノ山',20.3],['新島',20.0],['神津島',19.0],['三宅島',19.6],['三宅坪田',20.2],['八重見ヶ原',18.9],['八丈島',19.3],['父島',21.1]
]);
// Set chart options
var options = {'title':'東京都の現在の気温',
'width':500,
'height':300};
// Instantiate and draw our chart, passing in some options.
var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>
生成されたHTMLファイルをMicrosoft Edgeで閲覧すると、次のようになる。
生成するグラフに関しては、HTML中のJavaScriptの部分を書き換えればいろいろとカスタマイズすることができる。まずはこの枠組さえ作ってしまえば、後で求めるグラフへ変更すればよいだけだ。
グラフをbase64エンコードされたPNG画像の文字列として取得
new google.visualization.BarChart()で返ってくるオブジェクトだが、このオブジェクトには「getImageURI()」というメソッドがある。このメソッドを呼び出すと、グラフをPNG画像としてHTMLファイル内に組み込んだ場合の表現が返ってくる。要するに、PNG画像をbase64でエンコードした文字列のようなものが返ってくるメソッドだと考えてもらえれば良い。
chart.getImageURI();
これで文字列を取得して、base64の部分をデコードすれば、PNG画像ファイルとして作成することができることになる。
今回はこのbase64エンコードされた文字列を表示できるようにしてみよう。生成されるHTMLに次のようにレンダリング用のp要素を追加しておく。
<div id="chart_base64"></div>
JavaScriptからこの要素にbase64エンコードされたPNG画像の文字列を表示する処理を次のような感じで実施する。
// チャートイメージをbase64エンコードされたPNG画像データとして出力
google.visualization.events.addListener(chart, 'ready', function () {
document.getElementById('chart_base64').innerHTML = chart.getImageURI();
});
前回作成したPowerShellスクリプトに、上記3つの処理を仕込めばbase64エンコードされたPNG画像の文字列が得られることになる。
base64エンコードされたPNG画像の文字列を表示する処理を組み込む
先ほどの3つの処理を前回のPowerShellスクリプトに組み込むと次のようになる(test-8.ps1)。なお、チュートリアルに掲載されていた英語のコメントは日本語に書き換えてある。
#!/usr/bin/env pwsh
#========================================================================
# 気温データを取得して整理する
#========================================================================
$URL = 'https://www.data.jma.go.jp/obd/stats/data/mdrr/tem_rct/alltable/mxtemsad00.html'
$SrcFile = New-TemporaryFile
curl --get $URL > $SrcFile 2> $null
#========================================================================
# Google Charts用HTMLの用意
#========================================================================
$DataName = '現在の気温'
$GraphTitle = '東京都の現在の気温'
$GoogleChartsHTML1 = @"
<html>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
// Google Visualization APIおよびコアチャートパッケージを読み込み
google.charts.load('current', {'packages':['corechart']});
// Google Visualization API読み込み完了後に実行
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
// データテーブルを作成
var data = new google.visualization.DataTable();
data.addColumn('string', '');
data.addColumn('number', '$DataName');
data.addRows([
"@
$GoogleChartsHTML2 = @"
]);
// チャートオプションを設定
var options = {'title':'$GraphTitle',
'width':500,
'height':300};
// 初期化およびチャートの生成
var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
// チャートイメージをbase64エンコードされたPNG画像データとして出力
google.visualization.events.addListener(chart, 'ready', function () {
document.getElementById('chart_base64').innerHTML = chart.getImageURI();
});
// チャートを描画
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
<div id="chart_base64"></div>
</body>
</html>
"@
#========================================================================
# 東京の気象データを抽出
#========================================================================
# 東京都の気象データを抽出
$s = (Get-Content $SrcFile | Select-String '>東京都</td')
# HTMLタグなどの不要なデータを削除
$s = $s -replace '</[^>]+>',' ' `
-replace '<[^>]+>','' `
-replace '([^)]+)[*]*',''
# 地名と気温を抽出
$GraphData = ""
$Indent = " "
foreach ($l in $s) {
$a = $l -split " "
if ($GraphData) {
$GraphData = $GraphData + ",['" + $a[2] + "'," + $a[3] + "]"
}
else {
$GraphData = "$Indent['" + $a[2] + "'," + $a[3] + "]"
}
}
#========================================================================
# Google Charts用のHTMLを出力
#========================================================================
$GoogleChartsHTML1
$GraphData
$GoogleChartsHTML2
#========================================================================
# 作業用の一時ファイルを削除
#========================================================================
Remove-Item $SrcFile
このPowerShellスクリプトを実行すると、次のようなHTMLが生成される。
<html>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
// Google Visualization APIおよびコアチャートパッケージを読み込み
google.charts.load('current', {'packages':['corechart']});
// Google Visualization API読み込み完了後に実行
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
// データテーブルを作成
var data = new google.visualization.DataTable();
data.addColumn('string', '');
data.addColumn('number', '現在の気温');
data.addRows([
['小河内',17.6],['青梅',21.6],['練馬',21.3],['八王子',20.9],['府中',21.1],['東京',20.9],['江戸川臨海',19.9],['羽田',20.4],['大島',20.2],['大島北ノ山',20.3],['新島',20.0],['神津島',19.0],['三宅島',19.6],['三宅坪田',20.2],['八重見ヶ原',18.9],['八丈島',19.3],['父島',21.1]
]);
// チャートオプションを設定
var options = {'title':'東京都の現在の気温',
'width':500,
'height':300};
// 初期化およびチャートの生成
var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
// チャートイメージをbase64エンコードされたPNG画像データとして出力
google.visualization.events.addListener(chart, 'ready', function () {
document.getElementById('chart_base64').innerHTML = chart.getImageURI();
});
// チャートを描画
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
<div id="chart_base64"></div>
</body>
</html>
このHTMLをMicrosoft Edgeで閲覧すると、次のようになる。
グラフの下に表示された文字列が、base64でエンコードされたPNG画像だ。文字列の先頭の「data:image/png;base64,」は決まり文句のようなものだと思ってもらえれば良い。それ以降の文字列が、base64でエンコードされたPNG画像の部分だ。
この文字列を全て掲載すると次のようになる。
data:image/png;base64,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
このままでは扱いにくいが、PNG画像データとして閲覧できる状態までエンコードして保存しておけば、いろいろと便利に扱えるようになる。
次はPowerShell Seleniumから操作する
上記データはMicrosoft EdgeがGoogleのサービスを利用してグラフをレンダリングした結果として表示されている。つまり、PowerShellから先ほどのbase64エンコードされたPNG画像の文字列を得ようとした場合、PowerShellからMicrosoft Edgeを操作してページに表示された文字列を取得する必要がある。
ということで、しばらく前に紹介した「PowerShell Selenium」の出番だ。今度は、PowerShell Seleniumを使ってPowerShellからMicrosoft Edgeを操作し、このbase64エンコードされたPNG画像の文字列を取得すればよいわけだ。