Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2013-06-05

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

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

使い方

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

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


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

追伸

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

molov2molov2 2013/06/06 08:07 AppleScriptってブラウザ操作まで出来るんですね、すご…! 超カッコいいです。
総計っていうのは思いつかなかったので、ブックマークレットに取り込ませて頂きました、ありがとうございます!
http://moroya.hatenablog.jp/entry/2013/06/03/225935 (追記しました)

zariganitoshzariganitosh 2013/06/06 18:10 コメント、どうもです!
バージョンアップしたブックマークレットのall指定、素晴らしいです!
まさに目指していたブックマークレットです。(途中で挫折しましたが...)
素早い対応に感謝します。
これからも、素晴らしいブックマークレットをたくさん作ってください。
期待しちゃいます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/zariganitosh/20130605/amazon_total_price