見出し画像

ExcelとSeleniumで競馬の自動投票は難しくない(第3回)

今回はSeleniumとChromeDriverについて紹介し、VBAにてWebブラウザを起動して、ipatのサイトにログインする方法について説明します。

Ipatを利用して自動投票する方法は、もしかしたらいくつかあるのかも知れませんが、私が行っている自動投票を端的に言葉にすると、人が投票する際に行うipatでの画面操作をプログラムで行うものになります。

もう少し具体的に説明すると、Webブラウザを開いて画面をクリックしたり、パスワードや金額を入力するようなことをプログラムで行うことになるのですが、これらを簡単に行えるようにSeleniumWebDriverが必要になります。


Seleniumとは?

Seleniumは、Webブラウザの操作を自動化するためのオープンソースフレームワークです。
主にスクレイピングや自動テストなどに利用され、ブラウザ上で繰り返し行う操作を自動化するのに適しています。

私はWebブラウザにGoogle Chromeを利用しており、SeleniumでGoogle Chromeを操作するため、WebDriverとしてChromeDriverを必要とします。

ChromeDriverとは?

ChromeDriverは、Chromeをプログラムで操作するためのドライバです。Seleniumと組み合わせて使用することで、Chromeを自動操作してボタンをクリックしたり、文字を送信するなどできます。

SeleniumにしてもChromeDriverにしてもあまり難しく考えず、この2つがあるとWeb操作の自動化(自動投票)をスムーズに行えると理解しておけば問題ないと思います。

SeleniumとChromeDriverの入手とインストール

「Excel  Selenium インストール」や「Excel ChromeDriver インストール」でWeb検索してみてください。
私よりもお詳しい方が丁寧に説明している記事がありますので、そちらをご覧になってインストールしてください。

VBAでipatにログインする方法

Webブラウザでipatのサイトにアクセスすると以下のような画面が表示されますが、

プログラムでは
 ① Chromeを開いてipatのサイトにアクセスする
 ② 加入者番号暗証番号P-ARS番号を入力する
 ③ ログインボタンを押す
を行う必要があります。

サンプルコードは以下のとおりです。

Sub JRA_ipat_Login()    
    Dim JRA_ID As String   `加入者番号用の変数
    Dim JRA_PASS As String  `暗証番号用の変数
    Dim JRA_P_ARS As String `P-ARS番号用の変数
    Dim DRIVER As New Selenium.WebDriver 'webDriver用の変数
    Dim WAITTIME as Integer  '待機時間用の変数(ミリ秒で指定)

  'ワークシート「parameter」のセル「C3」に入力されている値を加入者番号として変数に代入
    JRA_ID = Worksheets("parameter").Range("C3").Value

  'ワークシート「parameter」のセル「C4」に入力されている値を暗証番号として変数に代入
    JRA_PASS = Worksheets("parameter").Range("C4").Value

  'ワークシート「parameter」のセル「C5」に入力されている値をP-ARS番号として変数に代入
    JRA_P_ARS = Worksheets("parameter").Range("C5").Value

  '待機時間を2秒とします。
    WAITTIME = 2000    

    With DRIVER
     'Chromeを起動する
         .Start "chrome"

     'ipatのサイトにアクセスする
         .Get "https://www.ipat.jra.go.jp/sp/"
         
     '2秒待機する
         .Wait WAITTIME
         
     '加入者番号を入力する
         .FindElementById("userid").SendKeys JRA_ID

     '暗証番号を入力
         .FindElementById("password").SendKeys JRA_PASS

     'P-ARS番号を入力する
         .FindElementById("pars").SendKeys JRA_P_ARS
         
     'ログインボタンをクリックする
         .FindElementByXPath("/html/body/div[2]/div/div[1]/div[2]/ul/li/a").Click
         
     '2秒待機する
         .Wait WAITTIME       

     End With
     
End Sub

上記のコードですが、前提としてシート「parameter」のセルC3〜セルC5に加入者番号、暗証番号、P-ARS番号をあらかじめ入力しておく必要があります。
イメージとしては以下の画像のとおりです。

もちろん、加入者番号、暗証番号、P-ARS番号をコードに直接記述する方法もありますが、暗証番号を変更した場合などにコードを修正する必要がないため、定期的に変更する可能性のある暗証番号などは、ワークシートのセル内に保持しておくと後々のメンテナンスが楽になります

ちなみに私が自動投票する際には、友人が決めたオッズの範囲内の馬に投票しています。
人気馬であっても期待値の低い馬や明らかに馬券の対象になりそうもない馬に自動的に投票しない措置ですが、このオッズの範囲についてもコードに記述せず、ワークシートに入力しています。
これによって、投票条件(オッズの範囲)を柔軟に変更することが可能となります。

次に補足する点として、「ログインボタンをクリックする」部分のコードですが、加入者番号や暗証番号はIDで要素を取得しているのですが、ログインボタンについてはIDの設定がなされていなかったため、xpathで要素を取得しています。

Chromeでは、ショートカットキー(ctrl+shift+i)で以下のようにデベロッパーツールを開きますので、Web画面における各要素のIDやxpathなどを調べることができます。

Webサイトにおける要素の取得方法については、ネット上に記事がたくさん掲載されていますので、そちらをご参照ください。「findelementby Excel」で検索してみてください。

RPAじゃダメなの?

ここまでご覧になって、RPA(Robotic Process Automation)でも自動投票ツールを作成できるのではないかと思った方もいらっしゃるのではないでしょうか。
しかしながら、自動投票といっても馬の選定条件やオッズによって購入する券種を変更するなど必ずしも定型的な動作を行うものではありません。
そのため、RPAの動作シナリオも複雑なものとなりますので、私の場合は券種や投票可否の判定をエクセルのワークシート内で行い、プログラムで自動投票するようにしています。

気になること

次回以降の記事は今回の記事の応用となります。
そのため、勘の良い方であれば、これまでにご紹介した内容でChromeのデベロッパーツールを駆使して、自動投票プログラムを自力で完成させることができることにお気づきだと思います。
もしかしてもう需要はないかもと心配になってきました。

この記事が気に入ったらサポートをしてみませんか?