楽天競馬に自動入金/精算することでハッピープログラム取引件数を稼ぐ

# はじめに

突然ですが、皆さんは楽天の「ハッピープログラム」を知っていますでしょうか？

楽天銀行には、「ハッピープログラム」というランクシステムがあり、月間の楽天銀行の取引件数や残高に応じてランクが決定されます。

このランクが上がれば、つまり取引件数を増やすことによって楽天ポイントの倍率が上がるというわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167392/cfe198b2-f4cc-3bfd-59c2-0176dcb0b637.png)
https://www.rakuten-bank.co.jp/happyprogram/


今回は楽天競馬に100円だけ入金/即100円出金を毎日繰り返し、無料で楽天銀行の取引件数を増やしてこのランクを上げる方法を紹介します。

# 前提
* 楽天銀行、楽天競馬のアカウントをあらかじめ作成しておいてください。
* ハッピープログラムに登録しておいてください。

参考サイト：
https://nameaji.com/rakuten_bank_vip_how/

# 環境

* Amazon Linux 2
* python 2.7.16
* Selenium 3.141.0
* Chrome 77.0.3865.120
* Chrome Driver 77.0.3865.40

AWS EC2にpythonスクリプトをcron登録し、その前後でEC2を起動/停止させます。

# 構築手順

###ブラウザのインストール
* Chrome用リポジトリ作成

```sh:/etc/yum.repos.d/google.chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

* Chromeのインストールと日本語フォントのインストール

```
# yum update

# yum -y install google-chrome-stable

# google-chrome --version
Google Chrome 77.0.3865.120

# yum -y install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
```

* Chromeのバージョンが77.0なので、driverもそれに合わせたバージョンをダウンロードする。
https://sites.google.com/a/chromium.org/chromedriver/downloads

```
# cd /usr/local/bin
# wget https://chromedriver.storage.googleapis.com/77.0.3865.40/chromedriver_linux64.zip
# unzip chromedriver_linux64.zip
# chmod 755 chromedriver
# rm chromedriver_linux64.zip
```

###Seleniumのインストール
* インストール実行

```
# pip install selenium
```

###自動入出金スクリプト作成

* お好みのディレクトリに以下スクリプトを配置。ログイン用IDやパスワードは自身の情報を入力してください。

※ パスワード情報をスクリプトに直打ちしているので、取扱には注意してください。

```python:rakuten.py
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

# ブラウザーを起動
options = webdriver.ChromeOptions()

# headlessで起動
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver", options=options)

# Google検索画面にアクセス
driver.get('https://keiba.rakuten.co.jp/')

# 入金をクリック
driver.find_element_by_id('noBalanceStatus').click()

# ウィンドウハンドルを取得する
handle_array = driver.window_handles

# seleniumで操作可能なdriverを切り替える
driver.switch_to.window(handle_array[1])

# ログイン
driver.find_element_by_id('loginInner_u').send_keys("楽天ログイン用ID")
driver.find_element_by_id('loginInner_p').send_keys("楽天ログイン用パスワード")

driver.find_element_by_class_name('loginButton').click()


### 入金処理 ###
# 入金
driver.find_element_by_class_name('definedNumber').send_keys("100")

# [確認する]クリック
driver.find_element_by_class_name('confirm').click()

# 暗証番号入力
driver.find_element_by_class_name('tealeaf_masking').send_keys("楽天競馬用パスワード")

# [入金する]クリック
driver.find_element_by_class_name('credit').click()
################

### Sleep 60 ###
time.sleep(60)

### 精算処理 ###
# [精算]クリック
driver.find_element_by_xpath('//*[@id="menuBar"]/div/div[2]/ul/li[2]').click()

# [確認する]クリック
driver.find_element_by_class_name('confirm').click()

# 暗証番号入力
driver.find_element_by_class_name('tealeaf_masking').send_keys("楽天競馬用パスワード")

# [精算する]クリック
driver.find_element_by_class_name('inquire').click()
################

# ブラウザーを終了
driver.quit()
```

※2019/10/13 追記
入金してから精算するまで60秒のSleepを入れるようにしました。
これは入金処理が反映される前に精算するのを防ぐためです。

###Cronスケジュール登録

* まずはサーバ上でcron登録します。12:00 JSTに起動するようにしています。(サーバ上はUTC)

※楽天競馬は入出金可能な時間帯が決められています。適宜最新の情報を確認するようにしてください。

```
# crontab -e
0 3 * * * python /root/rakuten.py
```

###AWS EC2インスタンス起動スケジュール

* 次にAWSのCloudWatchにてEC2を自動起動させるようスケジュールします。

1) IAMロールを新規作成する。

ここでは AWS 管理ポリシーの AmazonSSMAutomationRole をアタッチします。
EC2 起動停止するために必要な権限以外も含まれますので、必要に応じてカスタムポリシーを作成してください。
作成後、信頼関係から信頼されたエンティティに events.amazonaws.com を追加します。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "events.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```


2) CloudWatch の ルールを新規作成する。
3) スケジュールのCron式で起動時間を設定する。11:30 JSTに起動させます。
`30 2 * * ? *`
4) ターゲットを追加し「SSM Automation」を選択する。
5) Documentで「AWS-StartEC2Instance」を選択する。
6) 定数のInstanceIdに起動したいEC2インスタンスのIDを設定する。
7) 既存のロールの使用: 作成したIAM ロールを指定する。


###AWS EC2インスタンス停止スケジュール

* 今度は停止スケジュールです。起動と違いIAMロールの必要はありません。

1) CloudWatch の ルールを新規作成する。
2) スケジュールのCron式で停止時間を設定する。14:00 JSTに停止させます。
`0 4 * * ? *`
3) ターゲットを追加し「EC2 StopInstances API 呼び出し」を選択する。
4) 停止したいEC2インスタンスのIDを設定する。

これで自動で毎日楽天競馬にログインし、入出金してくれることでしょう！

#まとめ
本スクリプトを単発実行でテストしたところ問題なく稼働したのですが、現時点でスケジュール実行実績がないためどうなることやら…少し様子見してNGだったら追記して修正します。

また、今回AWSのEC2を利用しているので、なるべく無料枠で実施すべく面倒なスケジューリングを登録していますが、本来は自宅のRaspberry Piで稼働させる予定でした。
しかし購入したRaspberry Pi Zero WHだとCPUスペックが足りないようで、どうも失敗してしまったため回避策として上記手順を載せています。

# 参考にさせていただいたサイト
[EC2インスタンスのスケジュール起動がお手軽に実現できるようになっていた！
](https://qiita.com/t-toyota/items/5d7455568f1856fd2f4e)

[CloudWatch Events と Systems Manager で EC2の起動/停止をスケジュール化する](https://qiita.com/hayao_k/items/9a347d61b5b09a4e7755)

[ブラウザ上の操作をRaspberry Piを使って自動化する方法](https://qiita.com/shizuma/items/11cae51e942b296d9acf)