いままでAmazonでいくら買い物してきたのか?
Amazonには注文履歴というページがあって、そこでは過去の発注を一覧できる。
ところが、商品ごとの金額は分かるのだけど、合計でいくら使ったのかを知りたかったら、ちまちまと手作業で計算するしかなかった...。
手作業とか大嫌い。面倒だから、今までいくら使ってきたのかなんて計算したこともなかった。そんな時、いままでAmazonでいくら買い物してきたのか計算するブックマークレットに出会った!(素晴らしい!)
こうゆうの大好き!即、試したくなる。さっそく、やってみた。
合計してみた
- 注文履歴のページを開いて、
- 求められたら、サインイン。
- 注文履歴のURLにブックマークレットとなるJavaScriptをコピー&ペーストして、実行!(return)
javascript:(function(){var d=document;var s=d.createElement('script');s.src='https://gist.github.com/Molokheiya/5698262/raw/e172fe6f8e1d58021da35dc681cf4f4429b940e6/aitter.js'; d.body.appendChild(s)})();いままでいくらAmazonで買い物したか合計するブックマークレット書いた - モロ屋
- 西暦何年分の集計をするか訊かれた。
- デフォルトの2012年のまま実行してみると...集計が始まった!
- なるほど、けっこう使ってる。
すべての年の合計を知りたい
- おもしろい、おもしろい!
- じゃあ、2011年はどうだろう?、2010年は?...
- そんなふうに繰り返して、各西暦の合計を調べた。
- どうやら自分のAmazon歴は2006年からのようだ。
- しかし、Amazon歴すべての合計金額を求めようとすると、やっぱり手作業で足し算しなくてはならない...。
- たかだか8年分なので、電卓使えばすぐできるのだけど、やっぱり面倒だ。
- 各西暦の総合計も計算できないだろうかと、gistのソースコードを弄ってみたけど、どうもうまく動かない。
- JavaScriptに慣れていないので、時間がかかりそう。
- ならば、慣れ親しんだAppleScriptで手作業を再現して、強引にAmazon歴のすべての西暦を合計してみる!
AppleScript
--Safariを起動して、Amazon履歴の西暦リストを求める
tell application "Safari"
activate
make new document with properties {URL:"https://www.amazon.co.jp/gp/css/order-history/"} repeat until (document 1's URL as text) contains "https://www.amazon.co.jp/gp/css/order-history"
delay 1
end repeat
delay 1
do JavaScript "var e=document.getElementById('orderFilter'); filters=e.getElementsByTagName('option'); t=''; for(var i=0; i<filters.length; i++){t=t+filters[i].text};t" in document 1
end tell
set history_years to split(result, {"年分の注文", "年の注文"})'s items 2 thru -2
--各西暦ごとに集計する
set msgs to {} repeat with y in history_years
tell application "Safari"
activate
do JavaScript "javascript:(function(){var d=document;var s=d.createElement('script');s.src='https://gist.github.com/Molokheiya/5698262/raw/e172fe6f8e1d58021da35dc681cf4f4429b940e6/aitter.js'; d.body.appendChild(s)})();" in document 1
end tell
repeat 30 times
delay 1
if safari_dialog_exists() then exit repeat
end repeat
tell application "System Events"
tell process "Safari"
keystroke (y as text) delay 1
keystroke return
end tell
end tell
repeat 20 times
delay 1
if safari_dialog_exists() then exit repeat
end repeat
tell application "System Events"
tell process "Safari"
set msgs's end to window 1's static text 2's name & return
delay 1
keystroke return
end tell
end tell
end repeat
tell application "Safari" to close document 1
--集計結果をテキストエディットに出力する
tell application "TextEdit"
activate
my table_format(msgs) result & "========================" & return
result & tab & " 合計 " & tab & my total_price(msgs) make new document with properties {text:result} activate
end tell
on total_price(msg_list) set total to 0
set prices to split(join(msg_list, ""), {"、合計", "円分の買い物をAmazonでしました!"}) repeat with i in prices
try
set total to total + (i as number) end try
end repeat
number_with_delimiter(total) & "円"
end total_price
on table_format(msg_list) join(msg_list, return) split(result, {"あなたは", "、合計", "分の買い物をAmazonでしました!"}) join(result, tab) end table_format
on safari_dialog_exists() tell application "System Events"
tell process "Safari"
exists (windows whose subrole = "AXDialog") end tell
end tell
end safari_dialog_exists
on split(src_text, delimiter) set last_delimiter to AppleScript's text item delimiters
set AppleScript's text item delimiters to delimiter
set res to src_text's text items
set AppleScript's text item delimiters to last_delimiter
res
end split
on join(src_list, delimiter) set last_delimiter to AppleScript's text item delimiters
set AppleScript's text item delimiters to delimiter
set res to src_list as text
set AppleScript's text item delimiters to last_delimiter
res
end join
on do_ruby_script(code_list) set code_list to code_list as list
set code_list's last item to "puts(" & code_list's last item & ")"
set shell_code to "ruby -r'jcode' -Ku -e " & quoted form of join(code_list, ";") do shell script shell_code
end do_ruby_script
on number_with_delimiter(num) do_ruby_script("('" & num & "' =~ /[-+]?\\d{4,}/) ? ('" & num & "'.reverse.gsub(/\\G((?:\\d+\\.)?\\d{3})(?=\\d)/, '\\1,').reverse) : '" & num & "'") end number_with_delimiter
使い方
- 上記AppleScriptをスクリプトエディタで開いて、実行するだけでOK。
- Amazon履歴にある西暦を、GUIスクリプティングなどを使って繰り返し集計している。
- 手作業そのままを忠実にシミュレートしているので、結構時間がかかる。
- 西暦ごとの集計は、モロ屋さんのgistをそのまま使わせて頂いている。(感謝です!)
- 集計結果はテキストエディットに出力されるのだ!(はずかしいので数字は適当に弄ってる)
たまに集計してみて、ポチる前に自重してみるのも良いかもしれない。
追伸
- AppleScriptで手作業をシミュレートなんて壮大な遠回りである。
- 本来はJavaScriptのみで完結するのがベスト。
- JavaScriptオンリーなら、より多くのマシン環境、ブラウザ環境で幸せな集計ができるはず。
- いつの日か、JavaScript版がどこかで公開されることに期待です。