Python
Selenium

関西電力のはぴeみる電のスロットゲームを自動化した話

この記事は、クローラー/Webスクレイピング Advent Calendar 2017 17日目の記事です。

昨日(16日目)はmassa142さんtseを使って未投稿がある2017年度Qiita Advent Calendarをさらすでした。
恐ろしいタイトルですね。

はじめに

京都在住の僕は関西電力にお世話になっています。
この関西電力のサービスの1つに「はぴeみる電」というものがあり、その1つにスロットゲームというものがあります。
スロットで当たりが出るとスタンプがもらえ、そのスタンプが規定数まで貯まるとポイントをプレゼントするという仕様です。 
ただ、このスロットゲームには、現実の遊技機と違いなんの技術も必要ありません。
ただクリック(タップ)のみです。
最初の3日ほどはちまちまやっていましたが、正直飽き&面倒になってきたので、
Seleniumによる自動化を行いました。

設計

今回はPython3.6で、Selenium + ChromeDriverで動作をさせることにしました。
設計はざっくりと以下の様にしました。

  • CLIから操作
  • コマンド叩いたらChrome終了まで操作不要
  • スロットプレイ上限回数である3回までループさせる
  • 結果の取得は特に行わない
  • エラー処理も特に行わない

です。
スロットプレイ上限回数はLINEの友達追加などで増えます。
上限は3回なので、while文でループさせます。

実装

実装に際して、いくつか問題が生じました。

  • 演出が存在した
  • 実はiframeでスロットゲームは別に動いていた

演出

実際の遊技機などでも過剰な演出が一時期問題視されていたようですが、本スロットゲームでも演出が存在します。
1日に最大3回までしかプレイできない為、全演出を網羅することは事実上不可能であると考え、演出も含めて1回のゲームが終了するであろう時間までtime.sleep()で待機するようにしました。

iframe

これはスロットゲームの表示されているWebページとは別に組まれているframeだった為
browser.switch_to_frame()で切り替えることで解決しました。

ソースコード

以下、実際のソースコードを記載します。

# encoding:utf-8
import time
# seleniumライブラリの読み込み
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# driverの読み込み
browser= webdriver.Chrome()

# urlの設定
url = 'https://kepco.jp/miruden/ServiceTop'

# アクセス
browser.get(url)

# ログイン処理
browser.find_element_by_xpath('//*[@id="container_0_subcontainer_0_sidebar_0_UserID"]').send_keys('YOURID')
browser.find_element_by_xpath('//*[@id="container_0_subcontainer_0_sidebar_0_Password"]').send_keys('YOURPASSWORD')
browser.find_element_by_xpath('//*[@id="container_0_subcontainer_0_sidebar_0_Login"]').click()

# ポップアップ回避
#browser.get('https://kepco.jp/miruden/MyPage')
browser.get('https://kepco.jp/miruden/MyPage/HapiePoint/SlotChance#SlotTop')
#browser.find_element_by_xpath('//*[@id="stp-hapiepoint-contents"]/div[2]/div/a[1]').click()

cnt = 0
while cnt < 4:
    # スロットスタート
    time.sleep(2)
    iframe = browser.find_element_by_id('SlotMovie')
    browser.switch_to_frame(iframe)
    browser.find_element_by_xpath('//*[@id="btn_start"]').click()
    time.sleep(20)
    cnt += 1
    browser.refresh()

# Chromeの終了
browser.quit()                                                

ログイン時にポップアップが表示されるので、スロットゲームのページへ直接遷移するという荒業で回避しています。
また、1回目のゲームが終わり、2回目のゲームを開始しようとするとうまくスタートボタンが取得できなかった為、
結果が出た(であろう20秒後)にページリロードを行っています。

すべての処理が完了した後はChromeを終了しています。

それぞれの要素取得にはXpathを使って取得しました。
当然ですが、要素取得に失敗した際にはエラーで終了します。
本来であればきちんとエラー処理をいれて、落ちないプログラムを目指すべきですが、個人利用でありエラー結果に関してはターミナルに表示されるので今回は割愛しました。

関西在住で関西電力を利用されている方は参考にしてみてはいかがでしょうか。