エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法


login

photo credit: Got Credit Login via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。

前回の記事はこちら。

エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。今回は、エクセルVBAでIEを操作するクラスに検索窓の入力&ボタンクリックのメソッドを追加する方法をお伝えします。

検索入力&ボタンクリックのメソッドを追加しました。

さて、今回はその応用になりますが、ログイン処理をするクラスをつくります。

ログインが必要なサイトのスクレイピングをするならば、メソッド化しておくと便利ですものね。

ということで、エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法です。

では、行ってみましょう!

スポンサーリンク

前回のおさらい

まずは、前回のおさらいからです。

IEを操作するクラスIEObjectは以下の通りです。

Public IE As InternetExplorer
Public Document As HTMLDocument

Private Sub Class_Initialize()
    Set IE = New InternetExplorer
    IE.Visible = True
End Sub

Private Sub Class_Terminate()
    IE.Quit
End Sub

Public Sub Navigate(ByVal url As String)
    IE.Navigate url
    Wait
    Set Document = IE.Document
End Sub

Public Sub Wait()
    Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop   
End Sub

Sub InputTextById(ByVal id As String, ByVal keyword As String)
    
    Document.getElementById(id).Value = keyword
    
End Sub

Sub ClickButtonById(ByVal id As String)
    
    Document.getElementById(id).Click
    Wait
    Set Document = IE.Document
    
End Sub

前回作成したのは、以下2つのメソッドでした。

  • InputTextByIdメソッド:input要素をidで取得してその値を入力する
  • ClickButtonByIdメソッド:input要素をidで取得してクリックする

ちなみに、上記IEObjectクラスのコードは、今回の内容で必要なメンバーだけ掲載しています。

それで、検証用の標準モジュールのプロシージャがこちらですね。

Sub MySub()
    
    Dim ieObj As IEObject: Set ieObj = New IEObject
    
    With ieObj
        .Navigate "https://www.yahoo.co.jp/"
        .InputTextById "srchtxt", InputBox("キーワードを入力してください")
        .ClickButtonById "srchbtn"
    End With
    
    Stop
    
End Sub

さて、今回はログイン処理をしたいわけですが、入力欄に入力して、ボタンをクリックする…という動作でいうと、前回の内容が大いに参考になりますね。

WordPressの管理画面にログインする

今回は、例としてWordPressの管理画面にログインしてみたいと思います。

ログインしていない状態で、管理画面のURL「https://example.com/wp-admin/」にアクセスすると以下の画面になります。

WordPressのログイン画面

ここで、ユーザー名とパスワードを入力し、ログインボタンをクリックすればログインできます。

それぞれの要素は、以下に示すとおりid属性で取得可能です。

  • ユーザー名の入力フォーム:id="user_login"のinput要素
  • パスワードの入力フォーム:id="user_pass"のinput要素
  • ログインボタン:id="wp-submit"のinput要素

ただ、一度ログインをすると、一定のセッションの間はログイン済みと判定されますので、ログイン処理は不要です。

ログイン処理を行うメソッド

では、以上を踏まえて、クラスIEObjectにログイン処理を行うLogInメソッドを追加しました。

コードはコチラです。

Sub LogIn()
    
    Const LOGIN_URL As String = "https://example.com/wp-admin/" 'ログインURL
    
    With Me
        .Navigate LOGIN_URL
            
        With .Document
            .getElementById("user_login").Value = "XXXXXX" 'ユーザー名を指定
            .getElementById("user_pass").Value = "XXXXXXXX" 'パスワードを指定
            .getElementById("wp-submit").Click
        End With
    End With
    
End Sub

ログインページへのリンクは、既に作成したNavigateメソッドの力を借ります。

検証用のプロシージャはこちらです。

Sub MySub()
    
    Dim ieObj As IEObject: Set ieObj = New IEObject
    ieObj.LogIn
    
    Stop
    
End Sub

いや~スッキリしますね~。

実行すると、未ログインの状態のときは、うまくログインできます。

しかし、一度ログインした後に、再度実行すると、以下のように実行時エラーとなってしまいます。

実行時エラー

前述の通り、WordPressの管理画面は一度ログインすると、しばらくのセッションの間はログイン済みになりますので、ログイン画面に飛ばされずに済みます。

ですから、id="user_login"のinput要素が見つからずにエラーとなってしまうのです。

つまり、ログイン済みかそうでないかの判定が必要になるのです。

WordPressに限らず多くのサイトでは同様の仕組みが敷かれていますよね。

ログイン状態かどうかを判定する

ログイン状態かどうかを判定するには、どうしたらよいでしょうか。

ログイン状態であれば、Navigateメソッドでページ遷移したURLをそのまま開けます。

ただし、未ログイン状態であれば、いったんログイン画面のURLにリダイレクトされる、つまり、その際にIEで開いていれうドキュメントは、別のURLのものになっているわけですよね。

ですから、読み込みが完了したときの、IEのドキュメントのURLが、Constステートメントで定義したURLと等しいかどうかを判定すれば良いわけです。

ログイン状態の判定を踏まえたログインメソッド

ログイン状態の判定を踏まえて、前述のLogInメソッドを修正しました。

こちらです。

Sub LogIn()
    
    Const LOGIN_URL As String = "https://example.com/wp-admin/" 'ログインURL
    
    With Me
        .Navigate LOGIN_URL
            
        If .Document.url <> LOGIN_URL Then
            With .Document
                .getElementById("user_login").Value = "XXXXXX" 'ユーザー名を指定
                .getElementById("user_pass").Value = "XXXXXXXX" 'パスワードを指定
                .getElementById("wp-submit").Click
            End With
        End If
    End With
    
End Sub

実行すると、ログイン時も未ログイン時もうまく動作してくれることを確認できるはずです。

まとめ

以上、エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法をお伝えしました。

今回のLogInメソッドは、対象となるサイトが異なれば、都度それに合わせてカスタマイズが必要ですね。

ただ、一度作っておくと標準モジュールが非常にスッキリすると思います。

次回は、読み込み待ち処理で、引数で渡した任意の秒数を待つように変更してみたいと思います。

エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。今回は、エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する方法を紹介します。

どうぞお楽しみに!

連載目次:エクセルVBAでIEを操作するクラスを作る

エクセルVBAでInternetExplorerを操作してWebスクレイピング、まだまだ現役で必要となる現場もあるでしょう。このシリーズでは、IEを使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。
  1. エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
  2. エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
  3. エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
  4. エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
  5. エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
  6. エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
  7. エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
  8. エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
  9. エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
  10. エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する

タイトルとURLをコピーしました