GameSprit

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

AppleScript : weather hacks で天気予報

2012-10-13 16:54:34 | AppleScript
AppleScript から weather hacks を利用して天気予報情報を取得してみます。


weather hacks から天気予報情報を取得するエンジンとしては、AppleScript : ruby スクリプトを実行する - GameSprit で使った rubyスクリプトを利用します。

ただ、元は Weather Hacks の city タグ を決め打ちしていたので、汎用性がありません。
そこで、choose from list を使って、cityタグを選択できるようにしてみます。


さて、まず、city タグのコードを保持した List を作成します。
テキストで持っているデータを元にして、都市名の List を作ってゆきます。
"1,稚内
2,旭川
3,留萌
4,札幌
5,岩見沢
6,倶知安
7,網走
8,北見
9,紋別
10,根室
11,釧路
12,帯広
13,室蘭
14,浦河
15,函館
16,江差
17,青森
18,むつ
19,八戸
20,秋田
21,横手
22,盛岡
23,宮古
24,大船渡
25,仙台
26,白石
27,山形
28,米沢
29,酒田
30,新庄
31,福島
32,小名浜
33,若松
34,静岡
35,網代
36,三島
37,浜松
38,名古屋
39,豊橋
40,岐阜
41,高山
42,津
43,尾鷲
44,富山
45,伏木
46,金沢
47,輪島
48,福井
49,敦賀
50,新潟
51,長岡
52,高田
53,相川
54,水戸
55,土浦
56,宇都宮
57,大田原
58,前橋
59,みなかみ
60,さいたま
61,熊谷
62,秩父
63,東京
64,大島
65,八丈島
66,父島
67,千葉
68,銚子
69,館山
70,横浜
71,小田原
72,長野
73,松本
74,飯田
75,甲府
76,河口湖
77,大津
78,彦根
79,京都
80,舞鶴
81,大阪
82,神戸
83,豊岡
84,奈良
85,風屋
86,和歌山
87,潮岬
88,岡山
89,津山
90,広島
91,庄原
92,松江
93,浜田
94,西郷
95,鳥取
96,米子
97,下関
98,山口
99,柳井
100,萩
101,徳島
102,日和佐
103,高松
104,松山
105,新居浜
106,宇和島
107,高知
108,室戸
109,清水
110,福岡
111,八幡
112,飯塚
113,久留米
114,大分
115,中津
116,日田
117,佐伯
118,長崎
119,佐世保
120,厳原
121,福江
122,佐賀
123,伊万里
124,熊本
125,阿蘇乙姫
126,牛深
127,人吉
128,宮崎
129,延岡
130,都城
131,高千穂
132,鹿児島
133,鹿屋
134,種子島
135,名瀬
136,那覇
137,名護
138,久米島
139,南大東島
140,宮古島
141,石垣島
142,与那国島"

set wTxtList to quoted form of result
set maxlinenr to (count paragraph of wTxtList) --142
set cityList to {}
repeat with i from 1 to maxlinenr

set cityList to cityList & item 2 of my bunkai(paragraph i of wTxtList, ",")

end repeat


テキストデータを一旦、変数 wTxtList に納め、wTxtList から1行毎に取り出して、その行にある都市名を変数 cityList に入れてゆきます。幸い、AppleScript では、このようなテキストデータを1行毎に区切るために paragraph を利用できます。
そして、1行単位になったデータは「番号,都市名」となっていますが、この1行単位のデータを "," で区切って「番号」と「都市名」に分けたうえで、「都市名」のみを取り出します。


区切って「番号」と「都市名」とに分解するには、テキストを区切り文字を指定して分解する ハンドラを利用します。分解前のデータと、区切り文字列を与えると、区切り文字列で分解したものが List で返ります。
on bunkai(orgData, delim)
set orgDelimi to text item delimiters of AppleScript

try
set text item delimiters of AppleScript to delim

set op to {}
repeat with i from 1 to (count text item of orgData)
set the end of op to text item i of orgData
end repeat
return op
end try

set text item delimiters of AppleScript to orgDelimi
end bunkai



さあ、作成した都市名のリストを使って、choose from list を表示させましょう。
choose from list はデフォルト値を設定することができますので、よく利用する都市名をデフォルト設定しておくと便利です。なにせ、上記の通り表示されるリストは142にもなりますから。ここでは81番の大阪をデフォルトに設定します。
set theCity to (choose from list cityList default items (item 81 of cityList))




ユーザーが選択した結果、都市名が、変数 theCity に入ります。

ここで、この都市名の番号を確定しておく必要があります。幸い、先ほど作成した cityList を、1番目に ”稚内”、2番目に "旭川" ... と並べているため、List から item No. と都市名が紐付いています。そこで、 cityList にある都市名と ユーザーが選んだ都市名 theCity がマッチすれば、その item No. がすなわち都市の番号となります。cityList と theCity を1つずつ照合します。マッチしたら item No. を変数 cityNr に格納します。
set cityNr to 0
repeat with i from 1 to maxlinenr

if ((item 2 of my bunkai(paragraph i of wTxtList, ",")) as text) = (theCity as text) then
set cityNr to i
exit repeat
end if

end repeat




さて、都市名を反映させる目的で、都市番号をシェルコマンドに渡すために ruby スクリプト を都市番号の前後で2つに分轄します。

分轄した前半と、都市番号と、分轄した後半を、シェルコマンドに渡し、do shell script の AppleScript 命令を使って実行します。
"require 'open-uri'
require 'rexml/document'

# 変数宣言
xmlData = 0
weatherData = 0

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

set rsor1 to quoted form of result


"&day=today\") {|f|
xmlData = f.read
}

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

weathers = Array.new
weathers << weatherData.elements[\"/lwws/title\"].text
weathers << weatherData.elements[\"/lwws/telop\"].text
weathers << weatherData.elements[\"/lwws/description\"].text
weathers << weatherData.elements[\"/lwws/image/url\"].text

puts weathers"

set rsor2 to quoted form of result

do shell script "/usr/bin/ruby -e " & rsor1 & cityNr & rsor2</font>



Weather Hacks からは次のような結果が返ってきます。
"大阪府 大阪 - 今日の天気
晴のち曇
近畿地方は、高気圧に覆われて晴れています。
今日の近畿地方は、高気圧に覆われて概ね晴れますが、午後は上空の気圧の谷の影響で、雲が広がりやすいでしょう。
...
http://image.weather.livedoor.com/img/icon/5.gif"



スクリプトコードをまとめると、次の通りです。
"1,稚内
2,旭川
3,留萌
4,札幌
5,岩見沢
6,倶知安
7,網走
8,北見
9,紋別
10,根室
11,釧路
12,帯広
13,室蘭
14,浦河
15,函館
16,江差
17,青森
18,むつ
19,八戸
20,秋田
21,横手
22,盛岡
23,宮古
24,大船渡
25,仙台
26,白石
27,山形
28,米沢
29,酒田
30,新庄
31,福島
32,小名浜
33,若松
34,静岡
35,網代
36,三島
37,浜松
38,名古屋
39,豊橋
40,岐阜
41,高山
42,津
43,尾鷲
44,富山
45,伏木
46,金沢
47,輪島
48,福井
49,敦賀
50,新潟
51,長岡
52,高田
53,相川
54,水戸
55,土浦
56,宇都宮
57,大田原
58,前橋
59,みなかみ
60,さいたま
61,熊谷
62,秩父
63,東京
64,大島
65,八丈島
66,父島
67,千葉
68,銚子
69,館山
70,横浜
71,小田原
72,長野
73,松本
74,飯田
75,甲府
76,河口湖
77,大津
78,彦根
79,京都
80,舞鶴
81,大阪
82,神戸
83,豊岡
84,奈良
85,風屋
86,和歌山
87,潮岬
88,岡山
89,津山
90,広島
91,庄原
92,松江
93,浜田
94,西郷
95,鳥取
96,米子
97,下関
98,山口
99,柳井
100,萩
101,徳島
102,日和佐
103,高松
104,松山
105,新居浜
106,宇和島
107,高知
108,室戸
109,清水
110,福岡
111,八幡
112,飯塚
113,久留米
114,大分
115,中津
116,日田
117,佐伯
118,長崎
119,佐世保
120,厳原
121,福江
122,佐賀
123,伊万里
124,熊本
125,阿蘇乙姫
126,牛深
127,人吉
128,宮崎
129,延岡
130,都城
131,高千穂
132,鹿児島
133,鹿屋
134,種子島
135,名瀬
136,那覇
137,名護
138,久米島
139,南大東島
140,宮古島
141,石垣島
142,与那国島"

set wTxtList to quoted form of result
set maxlinenr to (count paragraph of wTxtList) --142
set cityList to {}
repeat with i from 1 to maxlinenr

set cityList to cityList & item 2 of my bunkai(paragraph i of wTxtList, ",")

end repeat

set theCity to (choose from list cityList default items (item 81 of cityList))

set cityNr to 0
repeat with i from 1 to maxlinenr

if ((item 2 of my bunkai(paragraph i of wTxtList, ",")) as text) = (theCity as text) then
set cityNr to i
exit repeat
end if

end repeat

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

# 変数宣言
xmlData = 0
weatherData = 0

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

set rsor1 to quoted form of result


"&day=today\") {|f|
xmlData = f.read
}

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

weathers = Array.new
weathers << weatherData.elements[\"/lwws/title\"].text
weathers << weatherData.elements[\"/lwws/telop\"].text
weathers << weatherData.elements[\"/lwws/description\"].text
weathers << weatherData.elements[\"/lwws/image/url\"].text

puts weathers"

set rsor2 to quoted form of result

do shell script "/usr/bin/ruby -e " & rsor1 & cityNr & rsor2


on bunkai(orgData, delim)
set orgDelimi to text item delimiters of AppleScript

try
set text item delimiters of AppleScript to delim

set op to {}
repeat with i from 1 to (count text item of orgData)
set the end of op to text item i of orgData
end repeat
return op
end try

set text item delimiters of AppleScript to orgDelimi
end bunkai
</font>
末尾に</font>タグが表示されていたら、無視してください...



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

最新の画像もっと見る

post a comment

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