selenium で節税 (はじめての selenium)

# 本投稿の結論
利子所得にかかる所得税が発生しない額の定期預金を大量に組むために、selenium を利用した

# 概要
初めまして。吝嗇家の Tammy と申します。

この投稿では、利子所得にかかる所得税を少なくするために selenium を利用してみたことについて説明します。

# 利子所得にかかる所得税の税額について
銀行の利子にかかる所得税は 15.315 % の国税と 5 % の地方税に分かれており、受け取る利子ごとに国税・地方税それぞれ 1 円未満を切り捨てた合計額が利子を受け取る際に源泉聴取されます。
例えば税引前の利子が 6 円の場合が 0 円 (⌊6×0.15315⌋+⌊6×0.05⌋ = ⌊0.9189⌋+⌊0.3⌋ = 0) 、 60 円の場合 12 円 (⌊60×0.15315⌋+⌊60×0.05⌋ = ⌊9.189⌋+⌊3⌋ = 12) が源泉徴収されます。源泉聴取は「受け取る利子ごと」ですので、利子が 60 円受け取れる額の定期預金を預ける場合に 6 円受け取れる額で 10 口預ける場合と、60 円分の額で 1 口預ける場合で手取りは 12 円の差ができ、額面だけ見れば小口の定期預金をたくさん作ったほうが良いはずです。

この「6円定期」は吝嗇家の間ではそれなりに知られた方法です。しかし手動で小口の定期預金を作る場合、 10 口の定期預金を預ける作業が 1 分で済んだとしても、時給換算 720 円にしかなりません。どんな労力を払っても手元に現金を残したいタイプの吝嗇家しか採用しない方法ですした。
そこで、預入操作の自動化を試みます。

# 対象サイト 
今回は楽天銀行の資金お引越し定期を対象とします。2019 年 8 月 19 日時点で年 0.15 % の利率の 1 カ月定期ですので、 47097 円 (⌈6/(0.0015*(31/365)⌉)を n 口預けることとします。

# 実施したこと
(1). [このあたり](https://qiita.com/hirohiro77/items/8dee178feebd4a9f9c4b)を参考にして、 selenium webdriver と Ruby 2.3.3 を導入しました。
(2). ログインから始めて 1 口分を手動で入力しつつ、クリック、入力箇所の xPath を参照して、操作内容をスクリプトにべた書きしました。

```
require 'selenium-webdriver'

d = Selenium::WebDriver.for :chrome

rakuten_bank_id = "" #使った後は必ず消す。
rakuten_bank_pw = "" #使った後は必ず消す。
amount = '47097'    #額・テキスト
number = 0          #口数

d.get("https://fes.rakuten-bank.co.jp/MS/main/RbS?CurrentPageID=START&&COMMAND=LOGIN")
d.find_element(:id, "LOGIN:USER_ID").send_keys(rakuten_bank_id)
d.find_element(:id, "LOGIN:LOGIN_PASSWORD").send_keys(rakuten_bank_pw)
d.find_element(:id, "LOGIN:_idJsp41").click #ログインボタン
number.times{
    d.find_element(:xpath, '//*[@id="header-common-personal"]/div[5]/table/tbody/tr/td[10]/div/a').click    #メニューバー「円預金」ボタン
    d.find_element(:xpath, '//*[@id="FORM:_idJsp190"]').click                                               #ページ中資金お引越し定期預金「預入」ボタン
    d.find_element(:xpath, '//*[@id="FORM_PERSON:BALANCE"]').send_keys(amount)                              #お預入金額の入力
    d.find_element(:xpath, '//*[@id="FORM_PERSON"]/div[4]/table/tbody/tr[2]/td[1]/label').click             #お預入期間の選択
    d.find_element(:xpath, '//*[@id="FORM_PERSON"]/div[6]/div[3]/div[1]/label/input').click                 #満期時取り扱いの選択「満期自動解約」
    d.find_element(:xpath, '//*[@id="FORM_PERSON:_idJsp268"]').click                                        #次へ
    d.find_element(:xpath, '//*[@id="FORM_PERSON:_idJsp105"]').click                                        #完了
}

d.find_element(:xpath, '//*[@id="header-common-personal"]/div[3]/div/table/tbody/tr[1]/td[3]/a').click #「ログアウト」ボタン
d.find_element(:xpath, '//*[@id="_idJsp14"]/img').click         #「はい」
d.find_element(:xpath, '//*[@id="str-main"]/p[8]/input').click  #「閉じる」
```

(3). 1周させて(ID/PWを設定したうえで口数を 1 に変更して)実行し問題なかったので、口数を増やし実行しました。

# 結果
スクリプトを書く時間をのぞいて、数分で n 口分を 1 カ月定期にすることができました。来月以降も使用できれば、スクリプトを時間も含め回収できることでしょう。

ということで、はじめて selenium を使ってみて、目標は達成できたので満足です。

# 今後の課題
預けられる額をすべて預けてしまったので再確認・変更が出来ないのですが、何点か気になること・改善したほうがいいことに気付いています。

- 1 周させたときには問題なかったのですが、口数を増やして実行した際コマンドラインには `handshake failed; returned -1, SSL error code 1, net_error -100` というエラーメッセージが複数回表示されていました。取引は正常に完了しており、再確認できません。エラーの表示回数が口数(ループ回数)と一致しないため、単なるタイミングの問題かもしれませんが、原因がわからないのでご存知の方はご教示ください。
- 事前に手動で預入額、口数を計算して与えました。預金額は利率と 1 カ月の日数で変わるため、利率をサイトから取得したうえで自動計算するようにすると手間と間違いは減るでしょう。また、口数も普通預金に残したい額を設定し、普通預金残高がそれを下回らない範囲で預け入れるよう自動設定するようにすると、2回起動してしまった場合などの事故防止にもなるでしょう。
- ID と PW をべた書きにしちゃうの、どうなのさ。(ダメです)。