JRA IPAT 入金処理 RSSフィード
 


挨拶・自己紹介:失敗続きのAB型の変わり者 三流プログラマー Ken3です。
(※[三流君 三流プログラマーとは?自己紹介や経歴ほか])

Ken3のひとりグループです
・[ken3独りグループのトップページ]へ戻る
・独り言の[掲示板を覗く]
・勝手に作成した[キーワード一覧]を見る
・いつまでも[ken3memo下書き日記]を見る
(一人寂しくグループウェアを使っていたり....(笑))


リスト表示 | ツリー表示

1ken3memoken3memo   JRA IPAT 入金処理

JRA IAPT の 入金処理にチャレンジした記録です。

蛇足や回り道、脱線・・などありますが、よろしくお願いします。

プログラム、処理を作成する前に実際の流れ、まず現物の動きを確認します。

実際の操作動画 http://www.youtube.com/watch?v=q7e0v5HawiA

1.IPAT 投票メニューから

f:id:ken3memo:20110813113438j:image

入出金メニューのボタンを押す

コード・操作の解説:1.1 VBS から 表示されているIEを探してみる

コード・操作の解説:1.2 リンク先を調べる Aタグをチェックする


2.新しいウインドウが起動して

f:id:ken3memo:20110813113437j:image

入金指示 を [選択]

コード・操作の解説:2. 入出金メニュー 入金指示 name=MENU1 の ボタンを押す



3.新しい画面に切り替わったら

f:id:ken3memo:20110813113436j:image


入金指示で 金額を入れ、[確認]ボタンを押す

コード・操作の解説:3.入金指示 金額を入れて、確認ボタンを押す


4.切り替わった次の画面 確認画面で

f:id:ken3memo:20110813113435j:image

暗証番号を入力して[実行を押す]

コード・操作の解説:4. 暗証番号入力 5.confirm確認メッセージを無効にする

5.ダイアログでOKを押す

すると、

※入金します よろしいですか?

とメッセージボックス

f:id:ken3memo:20110813113718j:image

OK キャンセル

(OKを押す)

コード・操作の解説:4. 暗証番号入力 5.confirm確認メッセージを無効にする

※上の4と同じリンク先です

6.入金指示結果が表示される。

f:id:ken3memo:20110813113809j:image


確認して、メインメニューへ戻る


7.終了する

f:id:ken3memo:20110813113833j:image

終了ボタンを押す


8.閉じる

f:id:ken3memo:20110813113851j:image


閉じるボタンを押す

現在作成しかけのソース

前回のログイン後に処理を走らせて、テストしてみてください。

※xxxx.vbs と 拡張子VBSで保存。


strPassword = ""
'パスワード保存したくない人向け、頭で入力させる
If strPassword = "" Then
    strPassword = InputBox("暗証番号を入れてください")
End If


'複数立ち上がったIEから IPAT 投票メニューを見つける

    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objIE 

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If objWindow.document.URL = "https://www.ipat.jra.go.jp/pw_020_i.cgi" Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー 投票メニューが見つかりません"
        wscript.quit
    End If   

'↑上で見つけたIPAT 投票メニューから 入出金メニュー を 押す

    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = objIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        '入出金メニューのリンクを探す、ソースの文字を探す
        If InStr(objA(n).OuterHTML, "入出金メニュー") > 0 Then
            objA(n).Click  'クリックする
            Exit For  'ループを抜ける
        End If
    Next

    Set objA = Nothing  'オブジェクト変数解放

'表示を待つ
    Wscript.sleep 5000  '5秒待つ


'今度は、入出金メニュー(新しく開いたIE)を探す

    Dim objIE_I  '入出金メニュー用

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE_I = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If InStr(objWindow.document.Title, "入出金メニュー") > 0 Then
               Set objIE_I = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE_I Is Nothing Then
        msgbox "エラー 入出金メニューが見つかりません"
        wscript.quit
    End If   

'入金指示 選択 の ボタン を 押す

    objIE_I.document.all("MENU1").Click

'画面の切り替わり 表示を待つ
    Wscript.sleep 5000  '5秒待つ


'金額を入れて 確認ボタンを押す
    'input type="text" name="NYUKIN" maxlength="9" size="25" value=""> 円
    objIE_I.document.all("NYUKIN").Value = 500  '値をセットする

    'input style="width:80px;" type="BUTTON" name="INPUT" value="確 認" onClick
    objIE_I.document.all("INPUT").Click    'クリックする

'画面の切り替わり 表示を待つ
Wscript.sleep 5000  '5秒待つ

'暗証番号を入れ、実行する

    '確認メッセージで はい を 答えたい ≠≒ 確認を必ず はい(true)にする
    Dim ele 'エレメント(script)を1つ作りたいので。
    Set ele = objIE_I.document.createElement("SCRIPT")
    
    ele.Type = "text/javascript"
    ele.Text = "function confirm() { return true; }"  'コードをセットする
    
    Call objIE_I.document.body.appendChild(ele)  '上↑で作った要素・エレメントをドキュメントに挿入する
    '※行儀が悪い方法だが、
    'javascriptの同名関数は標準関数よりも後から追加したユーザー関数がエラーにならないで走ることを利用

    'input type="PASSWORD" size="9" maxlength="4" name="PASS_WORD" value="" 
    objIE_I.document.all("PASS_WORD").Value = strPassword   '暗証番号をセット

    '実行 input style="width:80px;" type="BUTTON" name="EXEC" value="実 行"
    objIE_I.document.all("EXEC").Click    '実行ボタンをクリック

'ここから、閉じる処理など、入金処理を閉じないとなぁ・・・

返信2012/03/31 09:17:44

2ken3memoken3memo   1  1.1 VBS から 表示されているIEを探してみる

VBSから表示されているIEを探してみたいと思います。

'URLとタイトルを表示させるテスト

    'オブジェクトを格納する変数
    Dim objShell, objWindow

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")
    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        MsgBox "タイプは:" & TypeName(objWindow.document)
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
            'URLとタイトルをMSGBOX で 確認
            MsgBox objWindow.document.Title & vbCrLf & objWindow.document.URL
        End If
    Next
    Set objShell = Nothing

CreateObject Shell.Application で シェルのオブジェクトを作成して、

For Each objWindow In objShell.Windows で 1つ1つ取り出して、

TypeName(objWindow.document) で ドキュメントのタイプを表示させてみました。

TypeName(objWindow.document) が HTMLDocument だったら、

MsgBox objWindow.document.Title & vbCrLf & objWindow.document.URL

で、タイトルとURLを確認してみました。

URLを条件に IEを探す

次に、URL https://www.ipat.jra.go.jp/pw_020_i.cgi を 条件にIEを探してみます。


    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objIE 

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If objWindow.document.URL = "https://www.ipat.jra.go.jp/pw_020_i.cgi" Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー 投票メニューが見つかりません"
        wscript.quit
    End If   

    '見つかったら、処理を行う
    MsgBox objIE.document.Title & vbCrLf & objIE.document.URL

    MsgBox objIE.document.Body.InnerHTML

あまり、芸が無いのですが、

If TypeName(objWindow.document) = "HTMLDocument" Then で HTMLドキュメントを確認後、

  If objWindow.document.URL = "https://www.ipat.jra.go.jp/pw_020_i.cgi" Then

と、.URLの値を比べ Set objIE = objWindow で見つけたオブジェクトをセットしただけでした。

あとは、ループの外で、

'見つけたかチェック

If objIE Is Nothing Then

して、

見つかったら、いつものように、objIE.document.Body.InnerHTMLなどテストで使ってみました。

試行錯誤、テスト結果を動画で確認

試行錯誤、テスト結果 → http://www.youtube.com/watch?v=Uvq4s4ylftA です。

↑途中、無言で固まっていたり、解説がループしてますが、よろしくお願いします。

終わりのあいつさつ

目的の起動済みのIEを取得したので、

次は、取得したIEを使用してみます・・・

返信2012/03/31 08:59:40

3ken3memoken3memo   1  1.2 リンク先を調べる Aタグをチェックする

次に、リンクのボタンを押したいので、

Aタグ、リンクのHTMLを探ります。

押したいのは 入出金メニュー なので、そこら辺りを探ります。

    'Aタグを集め、中身を確認する
    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = objIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        Msgbox "n=" & n & vbCrLf & objA(n).OuterHTML
    Next

    Set objA = Nothing  'オブジェクト変数解放

.getElementsByTagName("A") で Aのタグを集めます

.Lengthで集めた数がわかるので、

For n = 0 To objA.Length - 1のループを作ります。

objA(n).OuterHTML で n番目のHTMLソースを取得できます。

あとは、見つけたらクリックじゃないけど、

見つけるのに、

InStr(objA(n).OuterHTML, "入出金メニュー") > 0

を使ったりして、見つけます。

そして、objA(n).Click でクリックします。

テスト結果→ http://www.youtube.com/watch?v=Yk347rMLvVc

作成したソースファイル

'複数立ち上がったIEから IPAT 投票メニューを見つける

    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objIE 

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If objWindow.document.URL = "https://www.ipat.jra.go.jp/pw_020_i.cgi" Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー 投票メニューが見つかりません"
        wscript.quit
    End If   

'↑上で見つけたIPAT 投票メニューから 入出金メニュー を 押す

    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = objIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        '入出金メニューのリンクを探す、ソースの文字を探す
        If InStr(objA(n).OuterHTML, "入出金メニュー") > 0 Then
            objA(n).Click  'クリックする
            Exit For  'ループを抜ける
        End If
    Next

    Set objA = Nothing  'オブジェクト変数解放

終わりの挨拶

.OuterHTMLから文字列を探す・・・芸が無い方法ですが使ってみてください。

何かの参考となれば・・・・

(まだ、先は長い感じ??)

返信2012/03/31 08:58:19

4ken3memoken3memo   1  2. 入出金メニュー 入金指示 name=MENU1 の ボタンを押す

新しく 開いた 入出金メニューを見ると、

入金指示 が 選択 の ボタンになっています。

ソースを確認すると、

input style="width:100px; height:30px;" type="BUTTON" name="MENU1" value="選 択"

onClick="submitForm(this.form, '

となっています。

name="MENU1" と 名前が付いているので、名前をクリックしてみたいと思います。

作成過程・テスト結果→ http://www.youtube.com/watch?v=_sRquYEBHcM

作成したソース

'今度は、入出金メニュー(新しく開いたIE)を探す

    Dim objIE_I  '入出金メニュー用

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE_I = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If InStr(objWindow.document.Title, "入出金メニュー") > 0 Then
               Set objIE_I = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE_I Is Nothing Then
        msgbox "エラー 入出金メニューが見つかりません"
        wscript.quit
    End If   

'入金指示 選択 の ボタン を 押す

    objIE_I.document.all("MENU1").Click

終わりの挨拶

無事に、新しく立ち上がったIEを捕まえて、ボタンが押せたので、

次は、金額を入れて、確認ボタンを押す ・・・ ですね。

返信2012/03/31 09:03:36

5ken3memoken3memo   1  3.入金指示 金額を入れて、確認ボタンを押す

input type="text" は、 名前を指定して .Value に 値をセット

type="BUTTON"のボタンは、名前を指定して .Click で ボタンを押しました。

HTMLの入力項目やボタンにName=と名前が付いていると楽だなぁ・・と思いつつ。

作成過程・テスト結果→ http://www.youtube.com/watch?v=Fqzd_nTly6k

作成したソース


'金額を入れて 確認ボタンを押す
    'input type="text" name="NYUKIN" maxlength="9" size="25" value=""> 円
    objIE_I.document.all("NYUKIN").Value = 500  '値をセットする

    'input style="width:80px;" type="BUTTON" name="INPUT" value="確 認" onClick
    objIE_I.document.all("INPUT").Click    'クリックする

↑document.all("名前").プロパティメソッド って感じで、1アクション1命令でした。

終わりの挨拶

金額のセットは意外と楽でした。

次は問題の・・・確認メッセージ付きの 暗証番号の入力です。

今回みたいにすんなり行くといいけど・・・

返信2012/03/31 09:06:17

6ken3memoken3memo   1  4. 暗証番号入力 5.confirm確認メッセージを無効にする

暗証番号入力後、実行ボタンを押すと

入金します。よろしいですか?

confirm で 確認メッセージが表示されます。

    if (errFlg == 0) {
      if (cmd == "EXEC") {
        if (confirm("入金します。よろしいですか?")) {
          frm.EXEC.disabled = true;
        } else {
          return false;
        }
      }
      frm.submit();

※これが、意外とやっかいで・・・

試行錯誤・テスト結果→ http://www.youtube.com/watch?v=SHyTGwhkNyI

小細工 同名関数を挿入して、常に はい を返す

javascriptの同名関数は標準関数よりも

後から追加したユーザー関数がエラーにならないで走ることを利用して、

ニセのconfirm関数(何もしないで常にtrueを返す)を挿入する

    '確認メッセージで はい を 答えたい ≠≒ 確認を必ず はい(true)にする
    Dim ele 'エレメント(script)を1つ作りたいので。
    Set ele = objIE_I.document.createElement("SCRIPT")
    
    ele.Type = "text/javascript"
    ele.Text = "function confirm() { return true; }"  'コードをセットする
    
    Call objIE_I.document.body.appendChild(ele)  '上↑で作った要素・エレメントをドキュメントに挿入する
    '※行儀が悪い方法だが、
    'javascriptの同名関数は標準関数よりも後から追加したユーザー関数がエラーにならないで走ることを利用

昔の実験元

VBA IE操作 ニセのpromptとalert() を 挿入する そんな実験

http://d.hatena.ne.jp/ken3memo/20100428/1272467509

http://www.youtube.com/watch?v=k6XIeMITqDg

も合せてみてください。

暗証番号を入力して、実行ボタンを押す

データの入力エリア input type="PASSWORD"

実行ボタンは type="BUTTON" name="EXEC"

だったので、

document.all("名前").Value で値、.Clickでボタンクリックしてみました。

    'input type="PASSWORD" size="9" maxlength="4" name="PASS_WORD" value="" 
    objIE_I.document.all("PASS_WORD").Value = strPassword   '暗証番号をセット

    '実行 input style="width:80px;" type="BUTTON" name="EXEC" value="実 行"
    objIE_I.document.all("EXEC").Click    '実行ボタンをクリック

完成した 入金処理のソース

金額や暗証番号の受け取りがまだだけど

(固定の金額、固定の番号)

下記のような感じで、コードを書きました。


strPassword = ""
'パスワード保存したくない人向け、頭で入力させる
If strPassword = "" Then
    strPassword = InputBox("暗証番号を入れてください")
End If


'複数立ち上がったIEから IPAT 投票メニューを見つける

    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objIE 

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If objWindow.document.URL = "https://www.ipat.jra.go.jp/pw_020_i.cgi" Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー 投票メニューが見つかりません"
        wscript.quit
    End If   

'↑上で見つけたIPAT 投票メニューから 入出金メニュー を 押す

    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = objIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        '入出金メニューのリンクを探す、ソースの文字を探す
        If InStr(objA(n).OuterHTML, "入出金メニュー") > 0 Then
            objA(n).Click  'クリックする
            Exit For  'ループを抜ける
        End If
    Next

    Set objA = Nothing  'オブジェクト変数解放

'表示を待つ
    Wscript.sleep 5000  '5秒待つ


'今度は、入出金メニュー(新しく開いたIE)を探す

    Dim objIE_I  '入出金メニュー用

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE_I = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If InStr(objWindow.document.Title, "入出金メニュー") > 0 Then
               Set objIE_I = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE_I Is Nothing Then
        msgbox "エラー 入出金メニューが見つかりません"
        wscript.quit
    End If   

'入金指示 選択 の ボタン を 押す

    objIE_I.document.all("MENU1").Click

'画面の切り替わり 表示を待つ
    Wscript.sleep 5000  '5秒待つ


'金額を入れて 確認ボタンを押す
    'input type="text" name="NYUKIN" maxlength="9" size="25" value=""> 円
    objIE_I.document.all("NYUKIN").Value = 500  '値をセットする

    'input style="width:80px;" type="BUTTON" name="INPUT" value="確 認" onClick
    objIE_I.document.all("INPUT").Click    'クリックする

'画面の切り替わり 表示を待つ
Wscript.sleep 5000  '5秒待つ

'暗証番号を入れ、実行する

    '確認メッセージで はい を 答えたい ≠≒ 確認を必ず はい(true)にする
    Dim ele 'エレメント(script)を1つ作りたいので。
    Set ele = objIE_I.document.createElement("SCRIPT")
    
    ele.Type = "text/javascript"
    ele.Text = "function confirm() { return true; }"  'コードをセットする
    
    Call objIE_I.document.body.appendChild(ele)  '上↑で作った要素・エレメントをドキュメントに挿入する
    '※行儀が悪い方法だが、
    'javascriptの同名関数は標準関数よりも後から追加したユーザー関数がエラーにならないで走ることを利用

    'input type="PASSWORD" size="9" maxlength="4" name="PASS_WORD" value="" 
    objIE_I.document.all("PASS_WORD").Value = strPassword   '暗証番号をセット

    '実行 input style="width:80px;" type="BUTTON" name="EXEC" value="実 行"
    objIE_I.document.all("EXEC").Click    '実行ボタンをクリック

終わりの挨拶

自動でログイン後に、自動入金。

次は、オッズや情報を取得ですね。

そして、自動投票???と続くのかぁ、、、

まだまだ、依頼されたコードの完成までは先が長いですね。

返信2012/03/31 09:09:13









    三流君 www.ken3.org(手打ちのHTMLで情報発信、最近は更新してなかったり...) 分類:HPを大きく分けると4つの柱(分類)です。
    ・人気は[VBA,マクロ]の解説、VBAからIE操作が人気です
    ・一昔前の[ASP(Active Server Pages)]の解説。
    ・読み物として[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    ・おまけで[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の異業種へ転職、コンビニ店長で失敗。

    動画・YouTube(動画で解説に手を出してみたが、評判はイマイチ...内容に問題アリ?)
    ・YouTube [ken3video] え~と、こんな感じ...の独り言が多い解説やテストの動画です。

    流行のBlogで情報発信(手打ちのHTMLよりブログで更新が楽なので)
    ・はてなを使用して[id:ken3memo]メモ的に放り込んでいるブログです
    ・[その他商品紹介Blog] ・・・ 内容の薄い、商品のメモ?です



    トップ ユーザー登録 ログイン ヘルプ