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

  • 改善されること
    • 引数を渡せるので、クリップボードを経由して、注文番号のやり取りをする必要がなくなったのである。
    • つまり、懸命なコピー作業中、突然のAmazonメールがクリップボードを書き換える心配がなくなった。
  • 残る問題
    • 「配送状況を確認する」時、ページ遷移なしのJavaScriptによる更新なので、
    • 「配送状況の詳細を確認する」ページから戻った時に、配送状況が非表示になってしまう。

AppleScriptJavaScriptバージョン

  • AppleScriptGUIスクリプティングは、ブラウザに表示されるページを、OSが認識するオブジェクト参照で特定して操作する。
    • ところが、GUIスクリプティングでは参照できない情報等もあったりする。
    • 今回の例:「配送状況を確認する」ボタンの持つURL。
  • 一方、ブラウザがネイティブに理解できるJavaScriptでも、ブラウザに表示されるページを操作することができる。
    • JavaScriptなら、HTML構造のすべてに自由にアクセスして、操作可能なはず。

早速やってみる。



--利用環境
-- 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の方が操作が早い。AppleScriptGUIスクリプティングよりも素早くページが遷移していく。


意外と快適!

使い方

利用環境
  • MacBook OSX 10.6.4
  • デフォルトブラウザがSafari
  • Safariの環境設定 >> 自動入力で「ユーザ名とパスワード」が有効で、
  • Amazonサインイン時、自動入力される環境であること。
インストール
  • このフォルダ内の.scptファイルをすべてユーザ・スクリプト・フォルダに入れる。
    • ~/Library/Scripts/_lib.scpt
    • ~/Library/Scripts/Amazon配送状況の詳細を確認する_javascript.scpt
    • ~/Library/Scripts/カトーレック配送状況確認.scpt
    • ~/Library/Scripts/Query Delivery.scpt
Mail.appのルール
  • すべてのメッセージに反応して、AppleScriptを実行するルールを作っておく。



ダウンロード

以上のAppleScriptは、以下のリンクからダウンロードできる。