ライフハック。RubyとGoogleドライブでiTunesの支払いを見える化しよう【前編】

こんにちは。野口です。

ライフハック。RubyとGoogleドライブでiTunesの支払いを見える化しよう

iphone_mac
http://www.photo-ac.com/

iPhoneを使い始めてから早5年以上が経ちました。
最初の頃こそ抵抗があったものの、
今ではiTunesで電子コンテンツを購入することにもまったく躊躇いがなくなりました。
人は環境に適応する生き物です。

お前は今までに課金したiTunesコンテンツの数を覚えているのか?

最近になってふと気になり始めました。
「自分はiPhoneを使い始めてからいくらぐらい課金をしたのだろうか?」と。
そんなことは全てキレイさっぱりと忘れて幸せに生きるという道も確かにありますが、
どうにも気になって仕方がないのです。

気になったのなら記録を当たればいい。記録というのは冷静で顕わなものだぜ

私はiPhone利用初期からAppleアカウントにクレジットカードを登録しており、以後同じクレカを使い続けています。
つまり、カード会社のサイトにある自分のページにログインして利用明細を確認すれば、
いつ何をiTunesで購入したのかを簡単に知ることが出来るはずです。

だが、諸君。よく思い出してほしい。Appleアカウントにクレカを登録しているからといってiTunesへの支払いが全てクレカである、とは限らないということを

iTunesを利用して普段の利用額を大きく上回るような支払いを短期間内に行おうとすると、一時的にクレカでの決済が行えなくなることがあります。
全くの推測なので外れている可能性大ですが、恐らくは盗難時のリスク軽減というのが大きな目的なのでしょう。
因みにこれは、酔った勢いでガチャを回して、欲しいものが出ずムキになって更に金を突っ込むというダメな人にありがちな無軌道な行為への抑止力としても役立っていると思います。

そう、問題ない。通常、問題ない。有用。システムの優しさ。愚か者の愚かな行為への掣肘。フールプルーフ

残念ながら、良く訓練された廃人ソシャゲーマーはクレカの利用を一時停止されたぐらいではへこたれません。
なんといっても良く訓練されていますからね。
即コンビニダッシュでiTunesカードゲットです。
「クレカがなければiTunesカードで課金をすれば良いじゃない」ということです。
防壁など最初から存在していなかったのです。

だが、中途半端な優しさや思いやりは、時に仇となる。そんなこともあり得るって話さ

現状、私がコンビニでiTunesカードを買うとなると、これはまず現金決済です。
こればっかりは仕方のないことです。近未来はともかく、これが現実。今の現実。受け入れなければなりません。
そして過去は変えられません。
つまり、ないのです。存在しないのです。記録が。履歴が。

つまりは、行き止まり。八方塞。これでこの話はお仕舞い。打ち切り、連載終了、野口先生の次回作にご期待ください

あるいは、そのまま終わらせていた方が幸せだったのかもしれませんが、私はそこであることを思い出しました。
電子メールです。
Appアカウントに登録されているメールアドレスがありますが、iTunesで課金をするとクレカであろうとiTunesカードであろうとレシートがそのアドレス宛てに届きます。
そう。失われたと思っていた記録が、履歴が、そこに眠っていたのです。

さてさて、そのレシートを受け取るメールアドレスですが、知人、友人、仕事相手との連絡に利用し頻繁にチェックをするようなアドレスではありません。
当然、あふれ返っております。未読メールが。
埋もれ込んでおります。目的のレシートが。

とは言え、恐れ慄くことはありません。
何といってもgmailです。googleです。
ちょちょいといくつかのキーワードを検索バーに放り込んでやるだけでたちまちのうちに目的のレシートのみに絞り込まれます。

勝ったっ!! 第三部完

と、ここで終わらせたいのは山々なのですが、ちょっと想像してみてください。
絞り込んだとはいえ、メールを一件々々ひらいては、明細項目と金額をメモして足し算していくという姿を。
なんていうか、ちょっと、ダサい。もう少しマシなソリューションはないのか、と思ってしまいますよね?

絞り込んだ時点で思ったよりもメールの件数が多くて若干、引いているとはいえ所詮は個人が趣味で購入した範囲のレシート。
このまま考えることを放棄して、一件一件、足し算していったとしてもそれほどの時間は掛からないでしょう。
20分? まぁ、せいぜい30分といったところでしょうか?
一方、例えばこれをgmailに接続して目的のレシートを絞り込んで、本文を解析して項目と金額を集計したレポートを出力するというようなプログラムを書くとしたら?
とてもとても、そんな時間では収まりません。
そう、割に合わないのです。

「費用対効果」とは要するにアレだ。「面倒くさいからやりたくありません」という言葉のビジネス向けエイリアスであって、クリエイティブな活動とは一切無縁の存在だ

ということで、完成品がこちら↓です。

ソースコード(全文)

require 'gmail'
require 'yaml'
require 'time'

if __FILE__ == $0
  config ||= YAML.load_file('./config/configuration.yml')['development']
  file = open('./report.txt', 'w')
  Gmail.new(config[:username], config[:password]) do |gmail|
    gmail.inbox.emails(from: 'do_not_reply@itunes.com').each do |mail|
      if mail.text_part
        mail.text_part.decoded.scan(/.+App.+|.+アドオン.+/).each do |payment_record|
          payment_datetime = Time.parse(mail.date.to_s).strftime("%Y/%m/%d %H:%M:%S")
          file.puts %Q|#{payment_datetime}\t#{payment_record}|
        end
      end
    end
  end
  file.close
end

前置きに3分間使う3分間クッキングという狂気のスタイル

いざ書いてみると意外とアッサリ出来ました。
それでは、解説に入りたいと思います。
因みに環境はMac OS X Yosemite, ruby 2.2.0devでのみ動作確認しています。
他の環境での動作は保証しません。特にWindows上での動作は全く保証できませんのであしからず。

gmailの操作には、ruby-gmailというgemを利用しました。

https://github.com/dcparker/ruby-gmail

gmailへの接続方法は至って簡単で、コンストラクタの引数にアカウント名とパスワードを渡してやるだけです(8行目)。
ただし、gmailの2段階認証を有効にしている場合は注意が必要です。
その場合は通常のパスワードではなく、アプリケーション固有のパスワードを生成して、そのパスワードを指定します。
生成方法は以下のアドレスを参考にしました。

https://support.google.com/mail/answer/1173270?hl=ja

gmailへ無事に接続が完了したら、続いては受信ボックスからメールを取り出します(9行目)。
今回のケースでは送信元のメールアドレスで対象のメールを絞り込んでいます。
これにより、iTunesからのレシートメールのみを取り出して処理することが出来ます。
対象のメールを絞り込んだら、次はメール本文を解析して必要な情報を取り出します(11行目)。
メール本文の抜き出しは、ruby-gmailのtext_partを利用するのが便利だと思います。
明細行を見ると、アドオンもしくはAppという項目で請求されているようなので、これらの文字を含む行を正規表現で取り出しています。
後は、書式を整えて出力すればOKです(13行目)。

プログラムを実行すると以下のようなファイルが出来上がります(抜粋、一部内容改竄アリ)。

2014/04/17 16:20:33 パズル&ドラゴンズ, 魔法石 ※※個  App 内課金   ¥※※※※※※
2014/04/17 16:20:56 パズル&ドラゴンズ, 魔法石 ※※個  App 内課金   ¥※※※※※※
2014/04/17 16:21:11 パズル&ドラゴンズ, 魔法石 ※※個  App 内課金   ¥※※※※※※
2014/04/17 16:21:11 パズル&ドラゴンズ, 魔法石 ※※個  App 内課金   ¥※※※※※※
2014/04/17 16:21:11 パズル&ドラゴンズ, 魔法石 ※※個  App 内課金   ¥※※※※※※
2014/04/17 16:21:17 パズル&ドラゴンズ, 魔法石 ※※個  App 内課金   ¥※※※※※※

これは酷い廃課金野郎ですね。
尚、日付はメールの受信日なので実際の支払日とは異なります。

完成品と言ったな、アレは嘘だ。

確かに、「gmailに接続して目的のレシートを絞り込んで、本文を解析して項目と金額を集計したレポートを出力する」という機能の実装は完了しています。
私の疑問も無事に解決しました。お陰で今何もする気力が湧きません。
しかし、タイトルで謳っているようなGoogleドライブへ連携する機能がありませんし、明細行を抜き出しただけで合計金額などの計算は手作業するしかありません。
これではタイトル詐欺呼ばわりされても仕方がないでしょう。

良かろう。その汚名、甘んじてこの身に受けようではないかっ!!

嘘です。
まったく良くないので、ちゃんと書きます。
ちゃんと書きますが、無駄に長くなったのでお互いの幸せのために後編へ続きます。

・前編あとがき

Rubyかわいいよ、Ruby。なんでこんなに可愛いのに君のところにはなかなか仕事が来ないの?

乱発している見出しのセリフは、大体、カイジやJoJoから引用したものに私が若干の手を加えたものです。
カイジやJoJo面白いです。オススメです。

後編もこんなノリでいきたいと思います。
思いますというか諸々の都合上、間を空けての公開となりますが、ぶっちゃけ後編も脱稿しているので苦情とか来ても手遅れです。

それでは皆さま、後編もお楽しみいただければ幸甚です。

コメントを残す

メールアドレスが公開されることはありません。

ABOUTこの記事をかいた人

僕と契約してアーティストになってよ。 普段はJavaやPHPで業務Webアプリばっかり作っています。 安西先生、Rubyで仕事がしたいです・・・。