いままでAmazonでいくら買い物してきたのか?

Amazonには注文履歴というページがあって、そこでは過去の発注を一覧できる。

ところが、商品ごとの金額は分かるのだけど、合計でいくら使ったのかを知りたかったら、ちまちまと手作業で計算するしかなかった...。
手作業とか大嫌い。面倒だから、今までいくら使ってきたのかなんて計算したこともなかった。そんな時、いままでAmazonでいくら買い物してきたのか計算するブックマークレットに出会った!(素晴らしい!)

こうゆうの大好き!即、試したくなる。さっそく、やってみた。

合計してみた

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で買い物したか合計するブックマークレット書いた - モロ屋

f:id:zariganitosh:20130605134606p:image:w450

  • 西暦何年分の集計をするか訊かれた。

f:id:zariganitosh:20130605134601p:image:w450

  • デフォルトの2012年のまま実行してみると...集計が始まった!

f:id:zariganitosh:20130605134605p:image:w450

  • なるほど、けっこう使ってる。

f:id:zariganitosh:20130605134604p:image:w450

すべての年の合計を知りたい

  • おもしろい、おもしろい!
  • じゃあ、2011年はどうだろう?、2010年は?...
  • そんなふうに繰り返して、各西暦の合計を調べた。
  • どうやら自分のAmazon歴は2006年からのようだ。

f:id:zariganitosh:20130605134607p:image:w234

  • しかし、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

使い方

  • Amazon履歴にある西暦を、GUIスクリプティングなどを使って繰り返し集計している。
  • 手作業そのままを忠実にシミュレートしているので、結構時間がかかる。
  • 西暦ごとの集計は、モロ屋さんのgistをそのまま使わせて頂いている。(感謝です!)
  • 集計結果はテキストエディットに出力されるのだ!(はずかしいので数字は適当に弄ってる)

f:id:zariganitosh:20130605143044p:image:w450


たまに集計してみて、ポチる前に自重してみるのも良いかもしれない。

追伸

  • AppleScriptで手作業をシミュレートなんて壮大な遠回りである。
  • 本来はJavaScriptのみで完結するのがベスト。
  • JavaScriptオンリーなら、より多くのマシン環境、ブラウザ環境で幸せな集計ができるはず。
  • いつの日か、JavaScript版がどこかで公開されることに期待です。