VBAプログラム開発、スクレイピング・ログイン機能【2-1】VBAによるWebページログイン機能をどうやって作成するか検討する
本記事からは、機能拡張を検討していた時に上げていたログイン機能を取り上げます。
まずは作成に至る経緯からVBAコードによるログインを行う為の手順を検討します。
今回の目的
VBA操作によるWebログインをできるようにコード作成方法を検討する
なぜやるか
ログイン画面が表示されるタイミングを理解しておき、ログイン画面表示時のみログイン処理を実施できるようにするため
やりたいこと
- ログインするまでのWeb画面の流れを確認する
- ログインが必要な画面であることを確認する手段を検討する
- 上記内容によりどういう順番でVBAコードを書くかを考える
やったこと
- ログイン機能作成の必要性を確認する
- ログイン完了するまでの流れを確認する
- ログイン画面であることを判断する
- ログイン処理として作成するVBAコードの内容を決定する
実施内容
ログイン機能が必要なわけ
作成経緯
今まで作成してきたVBAコードは、前提条件としてログイン済みの書籍情報Webサイトに対して処理を行っていました。
書籍情報サイトは私がPHPで作成した書籍管理ページですが、トップページ・ログインページ以外はログイン必須となっています。
今までの対応
Webサイトはログアウト後or一定時間経過後はログインが必要になります。
# ログイン後の表示(書籍一覧ページ)
手動でログインして一覧表示画面へ遷移しているのを確認してから書籍情報取得などのVBAを動作させていました。
必要な情報源にアクセスできていないと情報が取得できないので、今までのVBAコードの内容では分かりませんでしたが、毎回ログインするのはおおきな手間となっていました。
ログイン処理方法を検討する
ログイン機能作成時に何を考慮するか
- VBA実施時に毎回ログインページにアクセスしてログインさせるか
- Webアクセス時にログイン画面表示であることを確認orログイン中であることを確認
- ログイン失敗を考慮して、ログイン画面とログイン後の画面表示であることを確認できるか
- そもそも、どうやってどの画面表示であるか判定をするか
タイムアウト時にWeb操作を再開した時にログイン画面に移動することが考えられるので、処理としては常にログイン画面になった場合はログインを先に行う必要がありそうです。1・2が関係するところですが、ログイン画面であることを確認するのか、もしくは必ず毎回ログインする様に作成してしまうか…このあたりを決定する必要がありそうです。
3に関しては、ログイン用のメールアドレスとパスワードを入力できるようにしたとして、認証NGであった場合の処理を考えておく必要があります。このため、認証後の処理を分岐させる必要がでてきます。
そして4です。そもそもログイン画面であることをどうやって確認するか?
タイムアウト等の場合、ログインした先のページからログインページに戻される場合を考慮しなければなりません。
ログインするまでの画面を確認する
考慮すべき項目がいろいろありますが、まずはトップページからログインするまでのWebの動作を確認します。
1.通常ログインの流れ
まずは通常通りログインするまでの流れを確認しておきます。
ログインをクリックしてログイン画面に移動。
メールアドレスとパスワードを入力してログインボタンをクリックすると、書籍一覧が表示されます。
Web側のログイン完了後処理は書籍一覧ページへリダイレクトされるように作成されているので、ログイン後のページへ移動できていればログインはできています。
2.ログイン後、トップページから再びログインしようとする
ログイン済み状態でログアウトせずにブックマーク等でトップページへ戻り、ログインをクリックします。
ログインはできている状態なので、メールアドレスなど入力する画面は表示されずに書籍一覧ページに移動しました。
これにより、毎回ログインページに移動してログイン処理する…は有効な作りではなくなりました。ログインできている場合はログイン画面が表示されないので、毎回ログインはできません。
3.タイムアウト時の動作を確認する
時間経過によって自動的にログアウトされる仕様となっているので、こちらも確認します。
とはいえ、時間経過待ちするのも大変なので、複数画面を立ち上げておき片方でログアウトして、もう片方で擬似的に動作確認することにしました。
まずログイン後の書籍一覧画面を2つ用意しておきます。
この状態で片方の画面でログアウトします。
左側のブラウザではログアウトしてトップページに戻りました。この状態ではWeb側ではログアウト状態となっています。
この状態で右側ブラウザでログアウト以外の処理を行いページ遷移しようとすると…
ログインしていない状態なので、ログイン要求されました。
Web側のログイン状態管理状況によってアクセス先のページがログイン必須の場合にログイン要求が発生するので、これに対応したログイン処理を作成する必要があります。
ログイン画面表示をどうやって判断するか
判断の材料となりそうなのは、URLとページ内の要素から検出です。
書籍情報削除の時にも、アクセスできているか判断するということをやりました。これが参考になるかもと思いました。この時はURLで表示ページを判断しています。
そこで、表示URLに着目して再度ログインまでの流れを確認をしてみました。
先程ログアウト後に右側ブラウザで別ページに遷移しようとすると、ログイン画面に強制移動しました。
このときのURLを確認すると…上記画面は小さいかもしれませんが
となっており、ディレクトリ指定なしがトップページ、loginディレクトリがログイン画面ということが分かります。
ログイン画面表示の時にURLが変化していることを確認できたので、これをログイン画面かどうかの判定材料としてやればログイン機能がつけられそうです。
単純に毎回ログインにするだけなら、毎回ログイン画面に移動できるような構造でも良かったのですが、初めに確認したようにログイン中にログイン画面に移動するとログイン画面は表示されず、ログイン後の書籍一覧ページが表示されます。
このため、必ずログインページに移動してログインするという処理にする場合は、その前にログアウトされていることを確認する…といった処理が必要になりそうです。
しかし、ログイン要求されるページのURLが確認できたので、画面遷移後のURLを判断して、ログイン処理できれば、初回ログインに限らずタイムアウトにも対応できそうです。
作成内容をまとめる
いままでの内容をもとにざっくり整理してみると
- Webページアクセス
- ログイン画面かどうか確認(URL判断)
- ログイン画面であればログインを行う
- ログイン完了orログイン済み
アクセス後に未ログインならログインしてから処理を実施とすればよさそうです。
そして、今までのVBAコードにこの処理を追加してやれば、事前に手動でログイン状態確認することなくVBAさえ動かせばいい状態にできそうです。
以上で、何をどう判断してログイン処理をしてやるかを検討しました。
次から実際にこの結果を元にコードを書いて動作チェックを行っていきます。