見出し画像

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

前回はipatのWebサイトから単勝オッズを取得するコードを紹介しましたが、今回は自動で単勝馬券を購入する流れとVBAのコードを解説します。


投票の流れ

今回もログインした状態から説明していきます。
投票の流れは以下のとおりです。

ログイン後の画面では「通常投票」をクリックします。

「通常投票」をクリックすると、競馬場名を選択する画面が表示されますが、ここでは「東京(土)」をクリックします。

「東京(土)」クリックすると、レースを選択する画面が表示されますが、ここでは一番上に表示されているレースをクリックします。

一番上に表示されているレースをクリックする理由ですが、ご承知のとおり、ipatでは投票の締切時間を経過したレースは画面に表示されない仕様となっています。
そのため、直前オッズを取得して、投票可否を判定するタイプの自動投票プログラムでは、投票対象となるレースは必ず最上位に表示されるため、常に一番上に表示されるレースをクリックするプログラムで問題ありません。

次に、レースを選択した後は券種を選択する画面に移行しますが、ここでは「単勝」をクリックします。

券種を選択すると、馬を選択する画面が表示され、この画面では馬番または馬名をクリックすることになりますが、私のプログラムでは馬名をクリックするようにしています。

馬番にて選択した方がより汎用的なプログラムになるのですが、レースを選択する画面で一番上に表示されているレースを選んでいるため、仮に誤って別のレースを選択してしまった場合も馬名を選択するプログラムであれば、想定外の馬に投票することを避けられることがメリットです。

デメリットとしては、事前に馬名のデータを作成しておくことが挙げられますが、「TARGET frontier JV」や「netkeiba.com」から取得しておけば問題ないと考えます。

馬名をクリックすると、金額を入力する画面が表示されますが、数字(100円であれば「1」)を入力し、「セット」をクリックします。

金額をセットすると投票一覧画面が表示されますので、ここでは「入力終了」をクリックします。

例えば、ひとつのレースで複数の馬に投票する場合は「+馬(枠)番から続けて入力」をクリックする必要がありますが、各自の予想スタイルにも寄りますので、解説は省略します。解説の希望があればコメントをください。

「入力終了」をクリックすると、合計金額入力画面が表示されますので、ここでは合計金額を入力して、「投票」をクリックします。

すると、以下の画像のとおり、ポップアップでアラートメッセージが表示されますので、「OK」をクリックします。

これで投票が完了します。
自動投票を行うには、ここまでの流れをプログラムに落とし込む必要があるのです。

サンプルコード

投票を行うサンプルコードは以下のとおりです。
概ね上記で説明した流れの順に沿った内容となっています。

Sub Tohyo_Shori()
  
    '第3回で紹介したipatのサイトにログインするプロシージャを呼び出します。
    Call JRA_ipat_Login
    
    With DRIVER

        'CSSセレクター(クラス名の冒頭とスペース部分に「.」を入れること)を取得して通常投票をclick
        .FindElementByCss(".ico_regular.ui-link").Click
        .Wait WAITTIME
          
        '開催場(曜日)をクリックします。
        .FindElementByPartialLinkText("東京(土)").Click
        .Wait WAITTIME        

        'レースをクリック(常に1番上のレースをクリックする仕様としています)します。
        .FindElementByXPath("/html/body/div[1]/div/ul/li[1]/a/span[1]").Click
        .Wait WAITTIME
        
        '式別(単勝)をクリックします。
        .FindElementByPartialLinkText("単勝").Click
        .Wait WAITTIME
        
        '単勝用(投票する馬を1頭選択する)のプロシージャを呼び出します。
        Call VoteType_Tansho            
         
        '入力終了をクリックします。 
        .FindElementByPartialLinkText("入力終了").Click
        
        '合計投票金額を入力をします。
        .FindElementByCss(".ui-input-text.ui-body-c.ui-corner-all.ui-shadow-inset").SendKeys 100
        .WAITTIME
        
        '投票をクリックします。
        .FindElementByPartialLinkText("投票").Click
        .WAITTIME

        'ポップアップで表示されたアラートメッセージのOKをクリックします。
        '「FindElementby….Ckick」では処理できませんので注意してください。
        .SwitchToAlert.Accept
        .Wait WAITTIME
                
        'ブラウザを終了します。
        .Quit
          
    End With

    Set DRIVER = Nothing    

End Sub

上記のサンプルコードの中で呼び出している「VoteType_Tansho」のサンプルコードは以下のとおりです。

Sub VoteType_Tansho()   '単勝を投票する際の処理
    With DRIVER
        
        '馬名をクリックします。
        .FindElementByPartialLinkText("馬の名前").Click
        .Wait WAITTIME
    
        '投票口数(「1」)を入力します。
        .FindElementByCss(".ui-input-text.ui-body-c.ui-corner-all.ui-shadow-inset").SendKeys 1
        
        'セットをクリックします。        
        .FindElementByLinkText("セット").Click
        .Wait WAITTIME

    End With
End Sub

このように単勝用のプロシージャを設けている理由ですが、券種によって選ぶ馬の頭数が異なりますので、
 ・単勝、複勝用のプロシージャ
 ・馬連、馬単用のプロシージャ
 ・三連複、三連単用のプロシージャ
 ・ボックス投票用のプロシージャ
 ・流し投票のプロシージャ
など個別にプロシージャ化することで、様々な券種に対応することができます。
ちなみに私の場合は、単勝、複勝、馬単(流し)でしか自動投票していませんし、必要のない券種用のプロシージャは作成していません。


次に、上記の「Tohyo_Shori」と「VoteType_Tansho」をどのように実行するのかという点ですが、以下のコードが第4回で紹介した「Main」に盛り込んだ例となります。

Sub Main()
    Dim I As Integer

    For I = 1 To 投票レース数

Retry:
        If 投票予定時刻 Then
            '---------------第4回で紹介した部分------------------- 
            '第3回で紹介したipatのサイトにログインするプロシージャを呼び出します。
            Call JRA_ipat_Login

            'プロシージャ「Get_Odds」を呼び出します。
            Call Get_Odds
            ---------------第4回で紹介した部分ここまで------------- 

            IF 投票条件 Then
                Call Tohyo_Shori
            End If
        Else
            Sleep 60000
            Goto Retry
        End IF
    Next I

    Msgbox "全レース投票完了!"

End Sub

プログラムの流れとしては、
(1)投票予定時刻になるとオッズを取得し、さらに投票条件がTrueであれば投票し、Falseであれば次のレースに移行する。
(2)投票予定時刻でなければ1分間待機し、再度、投票予定時刻の判定を行う。
イメージであり、これを投票するレースの数だけ繰り返すことになります。
繰り返しが終わると、終了をお知らせするメッセージが出力されます。

補足

サンプルコードに盛り込んではいませんが、投票対象となるレースの情報(レース場、出走時刻など)や投票する馬名は、適宜のタイミングで配列や変数に代入しておく必要があります。
Excelの性質上、出馬表やオッズから投票に必要な情報を抽出して表形式で表示することは容易ですので、2次元配列への代入については各自で調べてください。RangeやCellsで簡単に代入できますよ。

最後に

今回で、競馬の自動投票化に関する基本的な部分の解説は終了です。
今後は要望に応じる形で、私の知っていることを発信したいと思いますので、コメントを頂けますと幸いです。


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