Amazonの配送状況の詳細を確認するAppleScript
前回の続き。
オールAppleScriptバージョン
- ワークフローの不可解な動作の対策をしていたら、ほとんどがAppleScriptになってしまった...。
- もはやワークフローにしておく意味がなくなった。
- 予定どおり、オールAppleScriptで書き直してみた。
--利用環境
-- MacBook OSX 10.6.4
-- Safariの自動入力で「ユーザ名とパスワード」が有効で、
-- Amazonサインイン時、自動入力される環境であること。
--使用例
-- my query("503-1234567-7654321")
on query(a_orderID) if a_orderID is not "nil" then
open location "http://www.amazon.co.jp/your-account"
my amazon_order_history() my amazon_sign_in() my amazon_delivery_status(a_orderID) my amazon_delivery_detail() my amazon_page_back(result) end if
end query
(* * 注文履歴を見る ボタンを押す
*)
on amazon_order_history() delay 1
repeat 4 times
delay 1
if my amazon_order_history_main() then exit repeat
end repeat
end amazon_order_history
on amazon_order_history_main() do shell script "/usr/local/bin/growlnotify -m '注文履歴を見る...' "
try
tell application "Safari" to set sign_in_url to document 1's URL
if sign_in_url begins with "https://www.amazon.co.jp/gp/css/homepage.html" then
tell application "System Events"
tell UI element 1 of scroll area 1 of group 3 of window 1 of application process "Safari"
repeat with a_element in UI elements
tell a_element
try
if image 1's description is "注文履歴" then
click image 1
return true
end if
end try
end tell
end repeat
end tell
end tell
end if
end try
false
end amazon_order_history_main
(* * サインイン ボタンを押す
*)
on amazon_sign_in() delay 1
repeat 4 times
delay 1
if my amazon_sign_in_main() then exit repeat
end repeat
end amazon_sign_in
on amazon_sign_in_main() do shell script "/usr/local/bin/growlnotify -m 'サインイン...' "
try
tell application "Safari" to set window_name to window 1's name
if window_name is "注文履歴" then return true
if window_name is "サインイン" then
tell application "System Events"
tell UI element 1 of scroll area 1 of group 3 of window 1 of application process "Safari"
repeat with a_element in UI elements
tell a_element
try
if button 1's description is "" then
click button 1
return true
end if
end try
end tell
end repeat
end tell
end tell
end if
end try
false
end amazon_sign_in_main
(* * orderIDの配送状況を確認する ボタンを押す
*)
on amazon_delivery_status(orderID) delay 1
repeat 4 times
delay 1
if my amazon_delivery_status_main(orderID) then exit repeat
end repeat
end amazon_delivery_status
on amazon_delivery_status_main(orderID) do shell script "/usr/local/bin/growlnotify -m '配送状況を確認する...' "
tell application "System Events"
tell UI element 1 of scroll area 1 of group 3 of window 1 of application process "Safari"
repeat with a_table in tables
tell a_table
try
static text 1 of UI element (orderID) of group 1 of list 1 of UI element 1 of row 1
click image 1 of UI element 1 of group 1 of UI element 2 of row 2
return true
end try
end tell
end repeat
end tell
end tell
false
end amazon_delivery_status_main
(* * 配送状況の詳細を確認する リンクをクリック
*)
on amazon_delivery_detail() delay 2
repeat 4 times
delay 1
if my amazon_delivery_detail_main() then return true
end repeat
false
end amazon_delivery_detail
on amazon_delivery_detail_main() do shell script "/usr/local/bin/growlnotify -m '配送状況の詳細を確認する...' "
try
tell application "System Events"
tell UI element 1 of scroll area 1 of group 3 of window 1 of application process "Safari"
repeat with a_table in tables
tell a_table
try
click static text 1 of UI element 1 of group 12 of list 1 of UI element 1 of row 3
return true
end try
end tell
end repeat
end tell
end tell
end try
false
end amazon_delivery_detail_main
(* * ブラウザの戻る操作
*)
on amazon_page_back(input) if input then --配送状況の詳細を表示できた時だけ、戻る
delay 5
do shell script "/usr/local/bin/growlnotify -m '戻る...' "
tell application "System Events"
tell process "Safari"
keystroke "[" using command down
end tell
end tell
end if
end amazon_page_back
- 改善されること
- 残る問題
- 「配送状況を確認する」時、ページ遷移なしのJavaScriptによる更新なので、
- 「配送状況の詳細を確認する」ページから戻った時に、配送状況が非表示になってしまう。
AppleScript&JavaScriptバージョン
- AppleScriptのGUIスクリプティングは、ブラウザに表示されるページを、OSが認識するオブジェクト参照で特定して操作する。
- 一方、ブラウザがネイティブに理解できるJavaScriptでも、ブラウザに表示されるページを操作することができる。
- JavaScriptなら、HTML構造のすべてに自由にアクセスして、操作可能なはず。
- AppleScriptにはdo JavaScript命令があって、任意のJavaScriptを実行できる。
- ならば、AppleScriptからJavaScriptを呼び出して、Webページを操作すれば、大抵のことはできるはず。
早速やってみる。
--利用環境
-- MacBook OSX 10.6.4
-- Safariの自動入力で「ユーザ名とパスワード」が有効で、
-- Amazonサインイン時、自動入力される環境であること。
--使用例
-- my query("503-1234567-7654321")
on query(a_orderID) if a_orderID is not "nil" then
open location "http://www.amazon.co.jp/your-account"
my amazon_order_history() my amazon_sign_in() my amazon_delivery_status(a_orderID) my amazon_delivery_detail(a_orderID) my amazon_page_back(result) end if
end query
(* * 注文履歴を見る ボタンを押す
*)
on amazon_order_history() delay 1
repeat 4 times
delay 1
if my amazon_order_history_main() then exit repeat
end repeat
end amazon_order_history
on amazon_order_history_main() do shell script "/usr/local/bin/growlnotify -m '注文履歴を見る...' "
try
tell application "Safari" to set sign_in_url to document 1's URL
if sign_in_url begins with "https://www.amazon.co.jp/gp/css/homepage.html" then
tell application "Safari"
do JavaScript "
var a_tags= document.getElementsByTagName('a');
for (i=0; i<a_tags.length; i++){
if ( a_tags[i].parentNode.className == 'button-area' ){
location.href = a_tags[i].href;
return;
}
}
" in document 1
end tell
return (result is not missing value) end if
end try
true
end amazon_order_history_main
(* * サインイン ボタンを押す
*)
on amazon_sign_in() delay 1
repeat 4 times
delay 1
if my amazon_sign_in_main() then exit repeat
end repeat
end amazon_sign_in
on amazon_sign_in_main() do shell script "/usr/local/bin/growlnotify -m 'サインイン...' "
try
tell application "Safari" to set window_name to window 1's name
if window_name is "注文履歴" then return true
if window_name is "サインイン" then
tell application "Safari"
do JavaScript "
var button=document.getElementById('submit');
button.click();
" in document 1
end tell
return (result is missing value) end if
end try
false
end amazon_sign_in_main
(* * orderIDの配送状況を確認する ボタンを押す
*)
on amazon_delivery_status(orderID) delay 1
repeat 4 times
delay 1
if my amazon_delivery_status_main(orderID) then exit repeat
end repeat
end amazon_delivery_status
on amazon_delivery_status_main(orderID) do shell script "/usr/local/bin/growlnotify -m '配送状況を確認する...' "
try
tell application "Safari"
do JavaScript "
var a_tags= document.getElementsByTagName('a');
for (i=0; i<a_tags.length; i++){
if (a_tags[i].className == 'track' && a_tags[i].href.indexOf('" & orderID & "') != -1){
location.href=a_tags[i].href;
return;
}
}
" in document 1
end tell
return (result is not missing value) end try
true
end amazon_delivery_status_main
(* * 配送状況の詳細を確認する リンクをクリック
*)
on amazon_delivery_detail(orderID) delay 2
repeat 4 times
delay 1
if my amazon_delivery_detail_main(orderID) then return true
end repeat
false
end amazon_delivery_detail
on amazon_delivery_detail_main(orderID) do shell script "/usr/local/bin/growlnotify -m '配送状況の詳細を確認する...' "
try
tell application "Safari"
do JavaScript "
var a_tags= document.getElementsByTagName('a');
for (i=0; i<a_tags.length; i++){
if (a_tags[i].className == 'complete-tracking' && a_tags[i].href.indexOf('" & orderID & "') != -1){
location.href=a_tags[i].href;
return;
}
}
" in document 1
end tell
return (result is not missing value) end try
true
end amazon_delivery_detail_main
(* * ブラウザの戻る操作
*)
on amazon_page_back(input) if input then --配送状況の詳細を表示できた時だけ、戻る
delay 5
do shell script "/usr/local/bin/growlnotify -m '戻る...' "
tell application "System Events"
tell process "Safari"
keystroke "[" using command down
end tell
end tell
end if
end amazon_page_back
- do JavaScriptの戻り値の判定で悩まされた。
- missing valueなのか、戻り値なしなのか、エラーなのか、do JavaScriptに慣れていないのでよくわからない。
- ひとつ一つ何が返ってくるか、条件を変えながら試して、確認するしかなかった...。(返り値はどうやって決まるのだろう?)
- 改善されること
- ページ遷移して「配送状況を確認する」ことができるようになった。
- よって「配送状況の詳細を確認する」ページと行き来しても、以前の配送状況がちゃんと保持されている。
- JavaScriptの方が操作が早い。AppleScriptのGUIスクリプティングよりも素早くページが遷移していく。
意外と快適!
使い方
利用環境
インストール
- このフォルダ内の.scptファイルをすべてユーザ・スクリプト・フォルダに入れる。
- ~/Library/Scripts/_lib.scpt
- ~/Library/Scripts/Amazon配送状況の詳細を確認する_javascript.scpt
- ~/Library/Scripts/カトーレック配送状況確認.scpt
- ~/Library/Scripts/Query Delivery.scpt