- PR -

VBAでWebにログインしたい

投稿者投稿内容
かーくん
会議室デビュー日: 2008/04/20
投稿数: 4
投稿日時: 2008-04-22 00:44
お忙しいところ申し訳ございませんが、アドバイス頂ければと思い投稿させて頂きました。
あるWebページに自動でログインするプログラムを作成したのですが、ログインできません。
何度見直しても何が悪いのか分からず困っています。

ID、パスワードの設定は上手くいくのですが、'Forms(0)をsubmitした後で必ずエラーになります。可能でしたら、私のプログラムの間違いをご指摘頂けないでしょうか?

---
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub test()

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True

'ログインページへ移動
objIE.navigate "https://trade.orix-sec.co.jp/webbroker3/46/pc/WEB3AccountLogin.jsp"

Do While objIE.busy = True
DoEvents
Loop

Sleep (2000)

'ユーザ名、パスワードは実際に利用するものを設定
objIE.Document.all.aa_accd.Value = "ユーザ名"
objIE.Document.all.lg_pw.Value = "パスワード"
'オンライン・ホームを選択
objIE.Document.loginForm.lg_isc(0).Checked = True

Sleep (1000)

'Forms(0)をsubmitした後でエラーになります。
objIE.Document.Forms(0).submit

End Sub
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-04-22 01:55
引用:

かーくんさんの書き込み (2008-04-22 00:44) より:
ID、パスワードの設定は上手くいくのですが、'Forms(0)をsubmitした後で必ずエラーになります。可能でしたら、私のプログラムの間違いをご指摘頂けないでしょうか?


引用:

かーくんさんの書き込み (2008-04-22 00:44) より:
'Forms(0)をsubmitした後でエラーになります。
objIE.Document.Forms(0).submit


Form を Submit するのではなく、「ログイン」と書かれたボタンを Click しなければなりません。
Web サイトによっては Form を Submit するだけでも良いこともありますが、手操作をシミュレートするのならば、ボタンをクリックする必要があります。ボタンがたまたま submit のボタンならば Form を Submit すれば良い場合もありますが、それは特殊例だと考えておくほうが汎用性があって良いでしょう。
かーくん
会議室デビュー日: 2008/04/20
投稿数: 4
投稿日時: 2008-04-23 02:55
ご回答ありがとうございます。
Form を Submit することとボタンをクリックすることは同じだと思っていました。
違ったんですね。

私の理解ではホームページでのログインボタンは下記のような記述となっています。
<INPUT TYPE="submit" NAME="btn01" VALUE="ログイン">
この場合、ログインの記述は次のように書けば動作します。
objIE.document.all.btn01.Click

しかし、今回ログインしたいページでは、ログインボタンは下記のように記述されています。
<input type=image alt="ログイン" src="/webbroker3/46/pc/images/bt_login.gif" width="70" height="18" hspace="15" vspace="5" border="0">

この場合、どのようにしてクリックすればいいのか分からないのです。
TYPE="submit"の記述がないこと、NAME=の記述がないことからお手上げの状態です。

そこで、もしかすれば Form を Submit すればいいのかなと思って試したのですが、それも上手く動作しないので、何が悪いのか分からず質問させて頂いた次第です。

ボタンをクリックする際の参考となるキーワードだけでも教えて頂ければ助かります。
よろしくお願いします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-04-23 09:42
引用:

かーくんさんの書き込み (2008-04-23 02:55) より:
しかし、今回ログインしたいページでは、ログインボタンは下記のように記述されています。
<input type=image alt="ログイン" src="/webbroker3/46/pc/images/bt_login.gif" width="70" height="18" hspace="15" vspace="5" border="0">

この場合、どのようにしてクリックすればいいのか分からないのです。
TYPE="submit"の記述がないこと、NAME=の記述がないことからお手上げの状態です。


サイトの構築者には name 属性を付けておいてほしいものですね。
ないと地道に探すしかないです。VBA のデバッガーのウォッチウィンドウでひたすらツリーを展開して探すことになります。

以下は、たとえば、alt 属性で検索するコード例です。
コード:
Dim x As Object
For Each x In objIE.Document.Forms(0).All
    If TypeName(x) = "HTMLInputElement" Then
        If x.alt = "ログイン" Then
            Call x.Click
            Exit For
        End If
    End If
Next

かーくん
会議室デビュー日: 2008/04/20
投稿数: 4
投稿日時: 2008-04-25 01:04
unibonさん

回答ありがとうございます。
いただいたコードを実行するとログインできました。

コードが十分に理解できていないので、週末に再度勉強しようと
思うのですが、参考となるWebページや書籍等を教えていただく
ことは可能でしょうか?

ひたすらウォッチウィンドウでツリーを展開するのが、もしか
したら一番の勉強になるのかもしれませんが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-04-25 11:05
引用:

かーくんさんの書き込み (2008-04-25 01:04) より:

コードが十分に理解できていないので、週末に再度勉強しようと
思うのですが、参考となるWebページや書籍等を教えていただく
ことは可能でしょうか?

ひたすらウォッチウィンドウでツリーを展開するのが、もしか
したら一番の勉強になるのかもしれませんが。


そんなに腰を据えるほどのアルゴリズムではないです。 簡単に説明しますと、
  1. HTML ドキュメント内にある最初の Form にある要素をすべて For Each で列挙
  2. 列挙したものが HTMLInputElement 型であるかどうか確認
  3. HTMLInputElement 型であるなら、alt 属性の値が "ログイン" かどうか検証
  4. "ログイン" であるなら、Click メソッドを呼ぶ
簡単でしょう? (ボブ風に)

個人的には、Microsoft HTML Object Library を参照に追加して事前バインディングで行います。 まあ最初のかーくんさんのコードが遅延バインディングなので、unibon さんはそれに合わせただけですが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-04-25 17:06
引用:

かーくんさんの書き込み (2008-04-25 01:04) より:
コードが十分に理解できていないので、週末に再度勉強しようと
思うのですが、参考となるWebページや書籍等を教えていただく
ことは可能でしょうか?


とくにまとまったものは私も知りません。私も教えてほしいくらいです。
現状は特有のキーワードでネットを検索するぐらいしかないと思います。そうすればこのような掲示板などがヒットします。キーワードは、今回の場合でしたら、HTMLInputElement や Document や Forms などになるでしょう。

引用:

かーくんさんの書き込み (2008-04-25 01:04) より:
ひたすらウォッチウィンドウでツリーを展開するのが、もしか
したら一番の勉強になるのかもしれませんが。


これしかないでしょう。さすがに毎回ウォッチウィンドウでツリーを展開するのは辛いので、標準モジュールに検索用のサブルーチンを作っておいて、それをイミディエイトウィンドウやウォッチウィンドウで呼び出して使うと多少便利かもしれません。

なお、もしも Excel VBA に未練がなければ Visual C# などに移行したほうが使い勝手の面では良いかもしれません。
Visual Studio .NET ぐらいまでだったら、VB や Excel VBA のほうがまだ使いやすかった面も結構あったかもしれませんが、Visual Studio 2005 あたりからと比較すると、Excel VBA には Excel と連携しやすい以外のメリットはないかもしれません。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-04-26 11:08
引用:

unibonさんの書き込み (2008-04-25 17:06) より:
引用:

かーくんさんの書き込み (2008-04-25 01:04) より:
ひたすらウォッチウィンドウでツリーを展開するのが、もしか
したら一番の勉強になるのかもしれませんが。


これしかないでしょう。さすがに毎回ウォッチウィンドウでツリーを展開するのは辛いので、標準モジュールに検索用のサブルーチンを作っておいて、それをイミディエイトウィンドウやウォッチウィンドウで呼び出して使うと多少便利かもしれません。


これしかない、と書きましたが、それはプログラムでアクセスするためのクラスの集約構造を調べるためという意味です。
仕様が不明な、(すなわちプログラムでアクセスするために必要な仕様が公開されていない)、サイトの HTML の構造を調べるためなら、たとえばですが、Firefox に標準で付属する DOM Inspector などのツールを使うと便利です。これで目的とするテキストボックスやボタンにアタリをつけておいてから、プログラムからアクセスするようなコードを書くと仕事が早くできます。
あくまでも私はこうやってます、という紹介ですが。

引用:

じゃんぬねっとさんの書き込み (2008-04-25 11:05) より:
個人的には、Microsoft HTML Object Library を参照に追加して事前バインディングで行います。 まあ最初のかーくんさんのコードが遅延バインディングなので、unibon さんはそれに合わせただけですが。


ちなみに、いったん型付きの変数に入れると、VB でインテリセンスなども使えるし便利です。
ただ、使っていて感じたことですが、MSHTML(Microsoft HTML Object Library)特有のことですが、型がたくさんあるわりにはあまり型同士の違いがないので、イチイチ型を意識してコーディングするのが面倒、という感じもしました。
C#/VB.NET だと MSHTML ではなく、System.Windows.Forms.HtmlElement などを使うことが増えると思いますが、こっちは型の種類が極端に少なくて、それはそれで不安ですが、でも使いやすいと感じています。ツールも前述のように使いやすいです。たとえばデバッガーでツリーを展開するときにクリックしなくてもよい(マウスを近づけるだけで展開してくれる)など、です。

スキルアップ/キャリアアップ(JOB@IT)