AppleScript : ruby スクリプトを実行する - GameSprit を思い出して、AppleScript : weather hacks で天気予報 - GameSprit、AppleScript : Weather Hacks で今日・明日の天気予報 - GameSprit と試してきました。
ここで、一通り発展させたものを含めてまとめてみます。
試作過程の結果をまとめるのが、目的です。
仕上がりイメージは次の通り。
今日・明日・明後日の天気予報、予想気温と概況を表示します。
ブログに貼り付けると、次のようになります。
機能分担・方針は次の通りです。
まず、お天気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 にアクセスします。
例えば、大阪市(都市コード:81)の明日(取得日のパラメーター:tomorrow)の天気予報を取得するには、次の URL にアクセスすることになります。
すると、次のような XML データが返ってきます。
この 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スクリプトとしては次のようになります。
また、rubyスクリプトとして、気温データがnilの場合にエラーにならないよう、気温データについては「to_s」を使います。
このような操作を、「今日」、「明日」、「明後日」分に行なったうえで、「天気概況」を取得します。
全体のコントロールは AppleScript で行ないます。
ハンドラを書いて、cityタグと日にちのパラメーターを設定し繰返しハンドラを呼出して結果を取得します。
そして、整形して完了です。
なお、cityタグ(都市コード)については、Weather Hacks の city タグ - GameSprit を参照してください。
「今日」、「明日」、「明後日」のデータを取得するハンドラを on getForecast(cityNr, tgtday) ~ end、「天気概況」のデータを取得するハンドラを on getGeneral(cityNr) ~ endとして、定義しました。
全体のコードは次の通りです。
キーワード:AppleScript、 Weather Hacks、天気予報、デリミタ、シティタグ、都市名、ruby、rubyスクリプト、do shell script、最高気温、最低気温
ここで、一通り発展させたものを含めてまとめてみます。
試作過程の結果をまとめるのが、目的です。
仕上がりイメージは次の通り。
今日・明日・明後日の天気予報、予想気温と概況を表示します。
ブログに貼り付けると、次のようになります。
大阪府 大阪 - 今日の天気
晴のち曇
最高気温: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、天気予報、デリミタ、シティタグ、都市名、ruby、rubyスクリプト、do shell script、最高気温、最低気温