三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

暗証番号入力 confirm確認メッセージを無効にする JRA入出金メニュー

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

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

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
www.youtube.com

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

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
www.youtube.com

も合せてみてください。

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

データの入力エリア 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    '実行ボタンをクリック


終わりの挨拶

自動でログイン後に、自動入金。
次は、オッズや情報を取得ですね。
そして、自動投票???と続くのかぁ、、、
まだまだ、依頼されたコードの完成までは先が長いですね。



余談.
押すことにこだわらないで、押させない、押す確認関数をつぶす。
'※読み込み完了後、自作のニセalertを追加する
'.navigate "JavaScript:でスクリプトの実行を利用して追加する
objIE.navigate "JavaScript:function alert() { return true; }"
みたいなことが最近(2018年)は、流行っているみたいですね。

www.youtube.com
【VBA IE操作】Javascriptのalert「Webページからのメッセージ」を消すテスト【三流君】 - YouTube

ken3memo.hatenablog.com


Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)