Invoke-RestMethod による天気予報

by manamana 28. June 2013 12:00

昨日の気象情報取得で使ったのは、WebServiceX.Net という海外のサイトです。
データが英語なのでちょっと使いにくいかもしれません。
もう少し一般的な情報源はないかとさがしたところ、ライブドアの天気予報を見つけました。

ライブドアお天気Webサービス

このサービスは XML ではなく JSON でデータを返してくれます。
…実は JSON を扱った事がなかったのですが、便利なコマンドレットがありました。

Invoke-RestMethod

このコマンドレットは、PowerShell 3.0から追加された Webサービス用のものです。
特筆すべきは、XML/JSONのパースを自動的に行う点で、何も考えずにサービスが利用できます。 
便利過ぎます。 

#@PSTOOL

$ws = $_Excel.Activesheet
$ws_master = $_Excel.ActiveWorkbook.Worksheets.Item("Master")
$addin = $_Excel.ComAddins.Item("ExPSTool").Object

#==== 天気情報格納用の型
$MyType = @"
    public class OtenkiType {
        public string dateLabel;
        public string date;
        public string telop;
        public string imageurl;
        public string temperature;
    }
"@
#--- 型の追加(※既存の場合はエラーになるので SilentlyContinue)
Add-Type -TypeDefinition $MyType -ErrorAction:SilentlyContinue

$Otenki = New-Object -TypeName OtenkiType

$city = $ws.Range("LWWSId").Value2
$json = Invoke-RestMethod -uri "http://weather.livedoor.com/forecast/webservice/json/v1?city=$city"

#--- 概況等は直接出力
$ws.Range("LWWS_URL").Value2 = $json.link
$ws.Range("LWWS_Time").Value2 = $json.publicTime
$ws.Range("LWWS_Description").Value2 = $json.description.text

#--- 3日分のデータはMasterシートのテーブルに出力して参照する
$List = $ws_master.ListObjects.Item("LWWSResultTable")
$rg = $List.HeaderRowRange
$addin.SetStartRange($rg)

$json.forecasts | foreach {

  $Otenki.dateLabel = $_.dateLabel
  $Otenki.date = $_.date
  $Otenki.telop = $_.telop
  $Otenki.imageurl = $_.image.url

  $min = $_.temperature.min.celsius
  $max = $_.temperature.max.celsius
  $Otenki.temperature = "最低:"+$min +"  最高:"+$max

  $Otenki

}

#--- せっかくだからお天気アイコンも付ける
$rg = $List.ListColumns.Item("imageurl").Range
$shape = $ws.Shapes.Item("LWWS_Img0")
$shape.Fill.UserPicture($rg.Cells.Item(2, 1).Value2)
$shape = $ws.Shapes.Item("LWWS_Img1")
$shape.Fill.UserPicture($rg.Cells.Item(3, 1).Value2)
$shape = $ws.Shapes.Item("LWWS_Img2")
$shape.Fill.UserPicture($rg.Cells.Item(4, 1).Value2)

PowerShell環境からExcelのオブジェクトを操作する際のコストは非常に大きなものがあります。
詳しい理由は知りませんが、COMオブジェクトとPSObjectの変換コストが原因だと思われます。
よく使う機能は DLL 化するなりの工夫が必要ですが、PS Tool の表出力はそこそこ速度があるので
直接Cellに書くような事をしないで、表形式で出力をしてやり、Excel上では式による参照をするのが効果的です。
今回は天気予報用の型を用意し、3日分のデータを表形式で出力しています。
文字だけでは芸がないので、Excelの図形に天気アイコンを埋め込みそれっぽくしてみました。 

東京の天気予報

 

那覇の天気予報。あぁ、沖縄に行きたいww

 

PS Tool を使えば、Excel上でWebサービスの恩恵をうけることが可能になります。
天気予報などは一般的な例ですが、企業の内部データを直接Excel上に展開するといった使い方は便利でしょう。
何か案件がありましたご連絡ください。

ダウンロード ↓↓↓
天気予報.xlsx (31.31 kb)

Tags:

PowerShell

Add comment


スポンサーリンク

Calendar

<<  September 2019  >>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

View posts in large calendar

Month List

Twitter