AppleScript から weather hacks を利用して天気予報情報を取得してみます。
weather hacks から天気予報情報を取得するエンジンとしては、AppleScript : ruby スクリプトを実行する - GameSprit で使った rubyスクリプトを利用します。
ただ、元は Weather Hacks の city タグ を決め打ちしていたので、汎用性がありません。
そこで、choose from list を使って、cityタグを選択できるようにしてみます。
さて、まず、city タグのコードを保持した List を作成します。
テキストで持っているデータを元にして、都市名の List を作ってゆきます。
テキストデータを一旦、変数 wTxtList に納め、wTxtList から1行毎に取り出して、その行にある都市名を変数 cityList に入れてゆきます。幸い、AppleScript では、このようなテキストデータを1行毎に区切るために paragraph を利用できます。
そして、1行単位になったデータは「番号,都市名」となっていますが、この1行単位のデータを "," で区切って「番号」と「都市名」に分けたうえで、「都市名」のみを取り出します。
区切って「番号」と「都市名」とに分解するには、テキストを区切り文字を指定して分解する ハンドラを利用します。分解前のデータと、区切り文字列を与えると、区切り文字列で分解したものが List で返ります。
さあ、作成した都市名のリストを使って、choose from list を表示させましょう。
choose from list はデフォルト値を設定することができますので、よく利用する都市名をデフォルト設定しておくと便利です。なにせ、上記の通り表示されるリストは142にもなりますから。ここでは81番の大阪をデフォルトに設定します。
![](https://blogimg.goo.ne.jp/user_image/35/d4/c971b62766b0610bf8083f9b042e78c7.png)
ユーザーが選択した結果、都市名が、変数 theCity に入ります。
ここで、この都市名の番号を確定しておく必要があります。幸い、先ほど作成した cityList を、1番目に ”稚内”、2番目に "旭川" ... と並べているため、List から item No. と都市名が紐付いています。そこで、 cityList にある都市名と ユーザーが選んだ都市名 theCity がマッチすれば、その item No. がすなわち都市の番号となります。cityList と theCity を1つずつ照合します。マッチしたら item No. を変数 cityNr に格納します。
さて、都市名を反映させる目的で、都市番号をシェルコマンドに渡すために ruby スクリプト を都市番号の前後で2つに分轄します。
分轄した前半と、都市番号と、分轄した後半を、シェルコマンドに渡し、do shell script の AppleScript 命令を使って実行します。
Weather Hacks からは次のような結果が返ってきます。
スクリプトコードをまとめると、次の通りです。
キーワード:AppleScript、 Weather Hacks、天気予報、デリミタ、シティタグ、都市名、ruby、rubyスクリプト、do shell script
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))
![](https://blogimg.goo.ne.jp/user_image/35/d4/c971b62766b0610bf8083f9b042e78c7.png)
ユーザーが選択した結果、都市名が、変数 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,稚内末尾に</font>タグが表示されていたら、無視してください...
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>
キーワード:AppleScript、 Weather Hacks、天気予報、デリミタ、シティタグ、都市名、ruby、rubyスクリプト、do shell script