雷鳴轟く午後、文京区のパーソナルスペースを離れ千代田区のワークエリアに陣取った筆者。ここ最近カスタマイズを重ねてきたAPI(OpenWhether API)による気象情報取得のためのPowerShellスクリプトであるが、ワークスペースでもWindows主体である。ワークスペースはセキュリティ上の制限も多く、インストールできるソフトも限られる。

  • 雷鳴轟く絵文字アイコン

    雷鳴轟く絵文字アイコン

しかし、PowerShellは標準で入っているため動作するのではないか?と思った。PowerShellスクリプトであれば、メールにコードを貼り付けて受信し、テキストエディターで●●.ps1としてUTF-8で保存すれば実行できるはず。前回までのコードである。

while ($true) {
    $apiKey = $env:OPENWEATHER_API_KEY

    # 文京区(おおよその緯度経度)
    $lat = 35.717
    $lon = 139.753

    $uri = "https://api.openweathermap.org/data/2.5/weather?lat=$lat&lon=$lon&appid=$apiKey&units=metric&lang=ja"
    $res = Invoke-RestMethod -Uri $uri -Method Get

    $date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"    
    $temp = [double]$res.main.temp
    $iconCode = $res.weather[0].icon

    $iconMap = @{
        "01d" = "☀"
        "01n" = "🌙"
        "02d" = "🌤"
        "02n" = "🌥"
        "03d" = "☁"
        "03n" = "☁"
        "04d" = "☁"
        "04n" = "☁"
        "09d" = "🌧"
        "09n" = "🌧"
        "10d" = "🌦"
        "10n" = "🌦"
        "11d" = "🌩"
        "11n" = "🌩"
        "13d" = "❄"
        "13n" = "❄"
        "50d" = "🌫"
        "50n" = "🌫"
}
    $emoji = $iconMap[$iconCode]
    $color = switch ($temp) {
        { $_ -ge 38 } { 'Red'; break }
        { $_ -ge 33 } { 'Yellow'; break }
        { $_ -le 32 } { 'Blue'; break }
        default       { 'White' }
    }

    $msg = "東京都文京区の現在の気温: {0:N1}°C({1} )" -f $temp, $emoji
    Write-Host "$date $msg" -ForegroundColor $color

    $log = "$date $msg"
    Out-File -FilePath "log.txt" -Append -InputObject $log

    for ($i = 300; $i -gt 0; $i--) {
        Write-Host "`r次の更新まで: $i 秒 " -NoNewline
        Start-Sleep -Seconds 1
    }

    Write-Host "`r更新中...                    "
}

ワークエリアでの実行してみたところ、

赤いエラーは嫌なものだ。しかし、とても簡単なエラー。"Invalid API key."とある。AIの力を借りるまでもなく、即座に気が付いた。

$apiKey = $env:OPENWEATHER_API_KEY

の部分だ。APIのキーがWindowsの環境変数(設定→システム→システムの詳細設定→環境変数)→システム環境変数に設定して読み込む仕様だが、ワークエリアでは、環境変数は使えない仕様だ。大切なキーの場合はできるだけ、テキスト保存したりしないほうが良かろうが、気象情報を取得するだけなので、ここを

$apiKey = "●●●●●●●●●●"

と直接キーを読み取る形にする。OpenWhetherにログインし、APIを再度表示させ、コピーしてここに入れる。改行を含まないように注意だ。そしてダブルクリック実行する。

  • ワークエリアでも実行可能だ

    ワークエリアでも実行可能だ

しかし、ここは文京区ではない。千代田区を表示させるべきである。そう持ち運び可能であるなら、その場所の天気情報である必要があるのだ。それはそうだ。エリアの指定は、以下の部分だ。

# 文京区(おおよその緯度経度)
$lat = 35.717
$lon = 139.753

これをユーザー入力させれば、$uriに入るレスポンスが自動的に変わるのであるから

$lat = Read-Host "緯度を入力してください"
$lon = Read-Host "経度を入力してください"

に変更する。ただし、全体のwhileループの外におかないといけない。そうでないと、毎回経度緯度を求められる。

  • ここではおおよその千代田区の緯度35.6940、経度139.7538を入力し、実行

    ここではおおよその千代田区の緯度35.6940、経度139.7538を入力し、実行

あとは、"東京都文京区の現在"の部分を"入力された緯度・経度地域の現在の気温"に変えるだけだ。完成したスクリプトは以下のようになる。

    $lat = Read-Host "緯度を入力してください"
    $lon = Read-Host "経度を入力してください"

while ($true) {
    $apiKey = "●●●●●●●●"

    $uri = "https://api.openweathermap.org/data/2.5/weather?lat=$lat&lon=$lon&appid=$apiKey&units=metric&lang=ja"
    $res = Invoke-RestMethod -Uri $uri -Method Get

    $date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $temp = [double]$res.main.temp
    $iconCode = $res.weather[0].icon

    $iconMap = @{
        "01d" = "☀"
        "01n" = "🌙"
        "02d" = "🌤"
        "02n" = "🌥"
        "03d" = "☁"
        "03n" = "☁"
        "04d" = "☁"
        "04n" = "☁"
        "09d" = "🌧"
        "09n" = "🌧"
        "10d" = "🌦"
        "10n" = "🌦"
        "11d" = "🌩"
        "11n" = "🌩"
        "13d" = "❄"
        "13n" = "❄"
        "50d" = "🌫"
        "50n" = "🌫"
}
    $emoji = $iconMap[$iconCode]
    $color = switch ($temp) {
        { $_ -ge 38 } { 'Red'; break }
        { $_ -ge 33 } { 'Yellow'; break }
        { $_ -le 32 } { 'Blue'; break }
        default       { 'White' }
    }

    $msg = "入力された緯度・経度地域の現在の気温: {0:N1}°C({1} )" -f $temp, $emoji
    Write-Host "$date $msg" -ForegroundColor $color

    $log = "$date $msg"
    Out-File -FilePath "log.txt" -Append -InputObject $log

    for ($i = 300; $i -gt 0; $i--) {
        Write-Host "`r次の更新まで: $i 秒 " -NoNewline
        Start-Sleep -Seconds 1
    }

    Write-Host "`r更新中...                    "
}
  • 緯度経度で実行するポータブル版

    緯度経度で実行するポータブル版

無事ワークエリアのコンソール上で実行できた。絵文字から察するに雨も止んでいるようだ。