見出し画像

Pythonで楽天Pを貯める【応用編】

第4回となります。(第1回目はこちら、第3回目はこちら)

※このシリーズはプログラミング中級者向けとなりますが、丁寧な解説を心がけて、初心者の方もわかりやすい内容になればと思います。

前回の記事はいかがでしたでしょうか。
実際のコードを用いて、各web操作の解説をいたしました。

一通り理解し、実行できれば毎日ポイントを自動で貯めることができます。
(楽天口座から楽天競馬へ振り込みで1P、スーパーVIPだとその3倍(3P))

日々のサイクル

図1 日々の楽天P貯金サイクル

1か月だと、3P × 30日 = 90P の獲得になり、年間1080Pの計算になります。
もし、このポイントがさらに8倍、9倍貯まるとしたら年 9000P も夢ではありません。


SPAT4

今回は、SPAT4に焦点を当てていきます。

では早速動作のイメージをつかんでいただきます。
※まずはコメントだけを読んで、流れを掴んでください


# ライブラリ
from selenium import webdriver
from selenium.webdriver.common.alert import Alert
import time
import pandas as pd
import os
import datetime

# 現在時刻取得
tm_now = datetime.datetime.now()

# 10以上21時未満のとき
if 10 <= tm_now.hour < 21:
   # ブラウザ立ち上げ
   browser = webdriver.Chrome(executable_path=u'C:\\Users\\■■■\\OneDrive\\デスクトップ\\chromedriver.exe')
   browser.implicitly_wait(3)

   # SPAT4 -------------------------------------------------------
   # サイトアクセス
   browser.get('https://www.spat4.jp/keiba/pc')
   time.sleep(1)
   
   # ログイン情報入力
   textbox = browser.find_element_by_id("MEMBERNUMR")
   textbox.send_keys("■■■■■■")
   time.sleep(1)
   textbox = browser.find_element_by_id("MEMBERIDR")
   textbox.send_keys("******")
   time.sleep(1)
   
   # ログインボタン
   btn = browser.find_element_by_xpath("/html/body/div/div[1]/form/a/span")
   btn.click()
   time.sleep(3)
   
   # ②入金へ移動 -----
   btn = browser.find_element_by_xpath("/html/body/form/div/div[3]/div/ul/li[4]/input")
   btn.click()
   time.sleep(3)
   
   # ③入金情報入力 -----
   browser.switch_to.window(browser.window_handles[-1]) # 新規windowに移動
   textbox = browser.find_element_by_xpath("/html/body/div[3]/form/table/tbody/tr[1]/td/input ")
   textbox.send_keys("100")
   time.sleep(1)
   ## 確認ボタン
   btn = browser.find_element_by_xpath("/html/body/div[3]/form/div/input")
   btn.click()
   time.sleep(3)
   
   # ④入金情報入力2 -----
   textbox = browser.find_element_by_id("MEMBERPASSR")
   textbox.send_keys("****")
   time.sleep(1)
   
   ## 確認ボタン
   btn = browser.find_element_by_xpath("/html/body/div[3]/form/div[2]/input[1]")
   btn.click()
   time.sleep(3)
   
   # ⑤タブ閉じる -----
   browser.close()
   time.sleep(1)
   
   # ⑥ログアウト
   browser.switch_to.window(browser.window_handles[-1]) # 新規windowに移動
   btn = browser.find_element_by_xpath("/html/body/form/div/div[1]/div/p[2]/input")
   btn.click()
   time.sleep(3)
   
   ## OKを選択
   Alert(browser).accept()
   time.sleep(3)
   
   # タブ閉じる -------------------------------------------------------
   browser.close()
   time.sleep(1)


# 入金時間外の時
else:
   print("時間外です")
   time.sleep(2)

コメントに書かれている通り、流れとしましては下記で大丈夫です。

ブラウザ立ち上げ → URLへ遷移 → ログイン情報入力
 → 入金へ遷移 → 入金情報入力 → タブ閉じる
→ ブラウザ閉じる → ログアウト


このコードにたどり着いたあなたはラッキーではないでしょうか。
だぶんお金とれるレベルだと思いますので。。。


余談でした、続けます。
3日もすれば、他人のコードとはよく言ったものですが
webに載っているコードなら尚更です。

「絵」がないとイメージつき辛いとは思います。
動画を載せておきますので、再度確認されたい方はご参照ください。
楽天競馬の動画になってしまいますが、流れは同じです。

※第一回から何度も登場する動画ですので、
 見ていただかなくても大丈夫です。


※どの箇所を変更すれば正常に動くかは、次回答えを載せますが
 できれば、第4回まで見てくださったあなたに見つけてほしいです。


タブ操作

前回との、技術の違いは「タブ操作」になります。
Google Chrome (selenium) の仕様として、新規にタブが開かれると
web操作が行えなくなってしまいます。

これはタブの内部番号(配列)で管理されているため、
新規にタブが開かれた場合、現在操作していたタブ(配列[0])と
アクティブタブ(配列[1])の乖離が起こってしまいエラーになります。

アクティブタブの説明

図2 アクティブタブの内部番号の変化

VBAでは、アクティブシートの概念がありますので
ご存知でしたらわかりやすいと思います。


先ほど載せましたコードですと下記に該当します。
配列を-1で指定することで、一番右を示すことができます。

# ③入金情報入力 -----
browser.switch_to.window(browser.window_handles[-1]) # 新規windowに移動


アクティブタブの説明2

図3 アクティブタブの内部番号の関係

上下どちらの数字でも指定することができます。
逆から数えたほうが早いというのが面白いところですね。


ポップアップ操作

最後にポップアップ操作を説明して終わりたいと思います。

ログアウトをしようすると、ポップアップ操作が求められると思います。
これはブラウザのアラート機能でして、Alert 関数で操作します。

画像6

図4 ブラウザのポップアップ画面

## OKを選択
Alert(browser).accept()

キャンセルの場合は、.dismiss() メソッドになりますので
変更して試されてもいいかもしれません。




以上で、第4回は終了となります。
続きはこちら(第5回)をご覧ください。

サポートしてくださるお気持ちだけで嬉しいです。