GameSprit

自転車やMac・AppleScript、映画・小説やドラマのレビュー、備忘メモ・クイズなどを置いています。

AppleScript : Weather Hacks で天気予報(まとめ)

2012-10-27 19:01:18 | AppleScript
AppleScript : ruby スクリプトを実行する - GameSprit を思い出して、AppleScript : weather hacks で天気予報 - GameSpritAppleScript : Weather Hacks で今日・明日の天気予報 - GameSprit と試してきました。


ここで、一通り発展させたものを含めてまとめてみます。
試作過程の結果をまとめるのが、目的です。

仕上がりイメージは次の通り。
今日・明日・明後日の天気予報、予想気温と概況を表示します。


ブログに貼り付けると、次のようになります。
大阪府 大阪 - 今日の天気
晴のち曇

最高気温:23
最低気温:

大阪府 大阪 - 明日の天気
曇時々雨

最高気温:21
最低気温:16

大阪府 大阪 - あさっての天気
晴時々曇

最高気温:21
最低気温:14

livedoor天気予報

大阪府では、明日朝から夕方にかけて雷の発生するおそれがあります。


近畿地方は、高気圧に覆われて概ね晴れています。
今日の近畿地方は、北部や中部では高気...




機能分担・方針は次の通りです。

まず、お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報 の API を利用します。Q&A - Weather Hacks - livedoor 天気情報 に注意事項が記載されています。LWWS、RSSフィードの取得結果ページには、livedoor 天気情報へのリンク・著作権表記が推奨されています。


次に、この API は xml データを返します。xml のデータ操作に関しては、xml 操作に長けた ruby を利用します。

最後に、ruby でまとめた xml を AppleScript に渡して、全体としては AppleScript でコントロールします。



さて、プロセス設計については次の通りです。

まず、lwws の API にリクエストを送るには、次のような URL にアクセスします。
http://weather.livedoor.com/forecast/webservice/rest/v1?city=都市コード&day=取得日のパラメーター


例えば、大阪市(都市コード:81)の明日(取得日のパラメーター:tomorrow)の天気予報を取得するには、次の URL にアクセスすることになります。
http://weather.livedoor.com/forecast/webservice/rest/v1?city=81&day=tomorrow



すると、次のような XML データが返ってきます。

<lwws version="livedoor Weather Web Service 1.0">
<author>livedoor Weather Team.</author>
<location area="近畿" pref="大阪府" city="大阪" />


<title>大阪府 大阪 - 明日の天気</title>
<link>http://weather.livedoor.com/area/27/81.html?v=1</link>
<forecastday>tomorrow</forecastday>
<day>Sunday</day>
<forecastdate>Sun, 28 Oct 2012 00:00:00 +0900</forecastdate>
<publictime>Sat, 27 Oct 2012 11:00:00 +0900</publictime>
<telop>曇時々雨</telop>
<description>大阪府では、明日朝から夕方にかけて雷の発生するおそれがあります。


近畿地方は、高気圧に覆われて概ね晴れています。
今日の近畿地方は、北部や中部では高気...</description>
<image>
<title>曇時々雨</title>
<link>http://weather.livedoor.com/area/27/81.html?v=1</link>
<url>http://image.weather.livedoor.com/img/icon/10.gif</url>
<width>50</width>
<height>31</height>
</image>
<temperature>
<max>
<celsius>21</celsius>
<fahrenheit>69.8</fahrenheit>
</max>
<min>
<celsius>16</celsius>
<fahrenheit>60.8</fahrenheit>
</min>
</temperature>

~中略~

</lwws>



この xml データから下記のタグ要素を取得します。

 title の「大阪府 大阪 - 明日の天気」
 telop の「晴れ」
 image の url の「http://image.weather.livedoor.com/img/icon/1.gif」
 temperature の max の celsius 「21」
 temperature の min の celsius 「16」

 その他に、description の「大阪府では、明日朝から夕方にかけて雷の発生する
 おそれがあります。近畿地方は、高気圧に覆われて概ね晴れています。
 今日の近畿地方は、北部や中部では高気...…」



ruby で API の URL にアクセスし、そのデータを 変数xmlData に入れ、xmlDataから xml データとして変数wxData に入れます。そして、配列wxsを用意して、xmlタグを指定してそのタグ要素データを取り出して、配列wxsに1つずつ追加してゆきます。例えば、配列wxsにxmlタグtitleを追加するには、rubyスクリプトとしては次のようになります。
wxs << wxData.elements["/lwws/title"].text</font>
AppleScript とするには、「"」をエスケープします。

また、rubyスクリプトとして、気温データがnilの場合にエラーにならないよう、気温データについては「to_s」を使います。


このような操作を、「今日」、「明日」、「明後日」分に行なったうえで、「天気概況」を取得します。


全体のコントロールは AppleScript で行ないます。
ハンドラを書いて、cityタグと日にちのパラメーターを設定し繰返しハンドラを呼出して結果を取得します。
そして、整形して完了です。

なお、cityタグ(都市コード)については、Weather Hacks の city タグ - GameSprit を参照してください。

「今日」、「明日」、「明後日」のデータを取得するハンドラを on getForecast(cityNr, tgtday) ~ end、「天気概況」のデータを取得するハンドラを on getGeneral(cityNr) ~ endとして、定義しました。

全体のコードは次の通りです。
set cityNr to "81"

set msg to my getForecast(cityNr, "today")
set msg to msg & return & my getForecast(cityNr, "tomorrow")
set msg to msg & return & my getForecast(cityNr, "dayaftertomorrow")
set msg to msg & return & my getGeneral(cityNr)

set the clipboard to (msg as text)
display dialog msg


on getForecast(cityNr, tgtday)

"require 'open-uri'
require 'rexml/document'

# 変数宣言
xmlData = 0
wxData = 0

open(\"http://weather.livedoor.com/forecast/webservice/rest/v1?city="

set rsor1 to quoted form of result

"&day="

set rsor2 to quoted form of result

"\") {|f|xmlData = f.read}

# xml から天気データを取得
wxData = REXML::Document.new(xmlData)

wxs = Array.new
wxs << wxData.elements[\"/lwws/title\"].text
wxs << \"<img src=\" + wxData.elements[\"/lwws/image/url\"].text + \">\" + wxData.elements[\"/lwws/telop\"].text
wxs livedoor天気予報\"
wxs << \"\"
wxs << wxData.elements[\"/lwws/description\"].text

puts wxs"

set rsor3 to quoted form of result
return do shell script "/usr/bin/ruby -e " & rsor1 & cityNr & rsor3

end getGeneral</font>











キーワード:AppleScript Weather Hacks天気予報デリミタシティタグ都市名rubyrubyスクリプトdo shell script最高気温最低気温

最新の画像もっと見る

post a comment

ブログ作成者から承認されるまでコメントは反映されません。