※ 2020/10/19追加:さすがに隙間が0秒だとクリップボードスタックに履歴がたまらないことがあるためスリープ処理を追加
表題の通り、ヨドバシドットコムの購入明細メールから、商品名と価格の組み合わせを取得するプログラムを、Pythonで書いてみました。クリップボード履歴ツールの活用方法と、Pythonのモジュール、PyPerclipとzip関数の利用例にと思ってくれたら幸いです。
説明が要らない という方はこちらをどうぞ
動機など
わたしはZaimを使って家計簿を作成しています。レシートを撮影して明細を登録できるほか、Amazonなど一部のサイトでの購入情報を自動的に登録できるため便利です。
しかしこのZaim、残念ながらヨドバシドットコムとの連携には対応していません。このため、ヨドバシドットコムを多用するわたしは買い物履歴を登録するのに毎回苦戦していました。
そこで、ヨドバシドットコムでの商品購入時に届く「ヨドバシ・ドット・コム:ご注文ありがとうございます」のメールに書かれている商品明細を読み込んで、Pythonで商品名と価格を抽出することにしました。
【ご注文商品】
---------------------------------------------------------------
・「[商品名(改行あり)]」
配達希望日:[日時]
合計 [個数] 点 [価格] 円
・「[商品名(改行あり)]」
配達希望日:[日時]
合計 [個数] 点 [価格] 円
・・・
・配達料金: 0 円
とりあえず実装方針
クリップボード履歴ツールのスタッククリップボード機能を使うと便利です。
スタッククリップボード機能とは、Clipboard-Historyなど多くのクリップボード履歴ツールについている機能で、コピー操作によりスタックに格納したテキストを順番に貼り付ける機能です。
これは単体で使ってももちろん便利ですが、スクリプトと併用すると結構便利です。このため、これを使って、クリップボードスタックに商品と値段を格納します。
#実装例
とりあえずこんな感じで。正規表現で商品名と価格名のリストを作成し、zip
関数でまとめて、クリップボードに転送します。
スクリプトを実行する前に、以下の準備が必要です。
- クリップボード履歴ツールのスタッククリップボード機能を有効にしておく
- ヨドバシドットコムから届く注文明細の、「ご注文商品」~「配達料金」のひとつ上の行までをクリップボードにコピーしておく
import re
import pyperclip
import sys
from time import sleep
n = []
p = []
text = pyperclip.paste()
for m in re.finditer(r"「([^」]*)」", text, re.MULTILINE):
n.append(re.sub("\\n\\s*", "", m[1]))
for m in re.finditer("([\\d,]+)\\s*円", text, re.MULTILINE):
p.append(re.sub("\\n\\s*", "", m[1]))
ret = ""
for a, r in zip(n, p):
pyperclip.copy(a)
sleep(0.1)
pyperclip.copy(r)
sleep(0.1)
Pythonスクリプトからクリップボードへのアクセスには、pyperclip
モジュールを用います。pip install pyperclip
で事前にインストールしておきます。
実行すると、クリップボードスタックに買った商品の名前と値段が交互にコピーされるので、Zaimの支出フォームに順次貼り付けていきます。
プログラミングって、本職じゃない人が使っても便利
プログラミングは、このように仕事と関係ない分野でも結構使えます。日頃の定例作業を簡素化したり、自動化したり。IFTTTなどの自動処理サービスを使う場合も、プログラミングの知識感覚があった方ができることの幅は広がります。
なので、本職でない人・そのようなことを仕事でする予定がない人も、できて損をしないものではないでしょうか と、もっともらしいことを言ってみる。
まあ、願わくばこういうそれっぽいスクリプト群を気軽に作成できて、気軽に実行できるランチャーみたいな環境があるといいっちゃいいのですが・・・。