tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルWebBrpwser内で自動ログインを
記事No10897
投稿日: 2012/08/18(Sat) 18:13
投稿者Arms
今回は、WebBrowser内だけで自動ログインが出来るようにしたいと考えています。

VB歴は、1ヶ月以内
環境は、WindowsXP VB2010Express IE8 を使っています。

今自分なりに作ったコードは下記となります。
ivate Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
       '読み込み待ちのコード↓
        WebBrowser1.Url = New Uri("ttp://○○○")
        Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
            System.Windows.Forms.Application.DoEvents()
        Loop

    ’ログインを行うコード↓
        With WebBrowser1
            .Document.GetElementById("textfield").SetAttribute("Value", "自Id")
            .Document.GetElementById("textfield2").SetAttribute("Value", "自Passwd")
            .Document.GetElementsByTagName("Submit")(0).InvokeMember("click")
    End with
    End Sub
End Class

このコードでデバッグは通るのですが、うまくログインされません。
エラーなども何も出ませんでした。

URLの読み込み待ちをし、読み込み完了後ログインをするコードとして
何か変なところありますでしょうか?

基礎の部分でも間違ってる部分があるかもしれませんが、ご教授をお願いします。

[ツリー表示へ]
タイトルRe: WebBrpwser内で自動ログインを
記事No10898
投稿日: 2012/08/19(Sun) 09:10
投稿者VBレスキュー(花ちゃん)
> ivate Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
>        '読み込み待ちのコード↓
>         WebBrowser1.Url = New Uri("ttp://○○○")
>         Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
>             System.Windows.Forms.Application.DoEvents()
>         Loop

DocumentCompleted イベントがどのようなイベントなのか理解していれば上記はおかしいでしょう。
ここのサンプル投稿用掲示板のサンプルも参考にして下さい。

Yahoo!メールへログイン するサンプルです。
エラー処理は別途必要により実施して下さい。

Public Class Form1

Private myUrl As Uri
Private SNo As Integer

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
   SNo = 1
   myUrl = New System.Uri("https://login.yahoo.co.jp/config/login_verify2?.src=ym ")
   WebBrowser1.Url = myUrl
End Sub

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, _
      ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
   '下記の部分は省略しても OK(但し、何をしているかは理解して下さい)
   If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
      Exit Sub
   End If

   With WebBrowser1
      '必要により下記のように作業の種類を分岐
      If SNo = 1 Then
         'ID の入力
         .Document.GetElementById("login").SetAttribute("Value", "myId")
         'パスワードの入力
         .Document.GetElementById("passwd").SetAttribute("Value", "myPasswd")
         'ログインボタンをクリック
         .Document.Forms(0).InvokeMember("Submit")
      End If
   End With
End Sub

End Class

※ 無暗にハンドルネームを変更しないようにして下さい。前後の質問内容等も参考にしながら
  回答しておりますので。

[ツリー表示へ]
タイトルRe^2: WebBrpwser内で自動ログインを
記事No10899
投稿日: 2012/08/20(Mon) 12:44
投稿者Arms
> ※ 無暗にハンドルネームを変更しないようにして下さい。前後の質問内容等も参考にしながら
>   回答しておりますので。

すみません。以後変更はしませんので、大丈夫です。


> Public Class Form1
>
> Private myUrl As Uri
> Private SNo As Integer
>
> Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
>    SNo = 1
>    myUrl = New System.Uri("https://login.yahoo.co.jp/config/login_verify2?.src=ym ")
>    WebBrowser1.Url = myUrl
> End Sub
>
> Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, _
>       ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
>    '下記の部分は省略しても OK(但し、何をしているかは理解して下さい)
>    If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
>       Exit Sub
>    End If
>
>    With WebBrowser1
>       '必要により下記のように作業の種類を分岐
>       If SNo = 1 Then
>          'ID の入力
>          .Document.GetElementById("login").SetAttribute("Value", "myId")
>          'パスワードの入力
>          .Document.GetElementById("passwd").SetAttribute("Value", "myPasswd")
>          'ログインボタンをクリック
>          .Document.Forms(0).InvokeMember("Submit")
>       End If
>    End With
> End Sub
>
> End Class

上のサンプルはyahooログインページ読み込み完了後、ボタンを押すことによってログインを行うコードでよろしいでしょうか?自分の中ではボタンなど使用せずに自動ログインを行いたいんですが、ここから色々と改良すれば可能ですか?

[ツリー表示へ]
タイトルRe^3: WebBrpwser内で自動ログインを
記事No10900
投稿日: 2012/08/21(Tue) 11:02
投稿者Arms
花ちゃんさんのサンプルを参考に作成したところこのようなコードになりました。
    Private myUrl As Uri

    Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myUrl = New System.Uri("ttp://○○○…")
        WebBrowser1.Url = myUrl

    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        With WebBrowser1
            .Document.GetElementById("textfield").SetAttribute("Value", "自Id")
            .Document.GetElementById("textfield2").SetAttribute("Value", "自Passwd")
            .Document.All.GetElementsByName("Submit")(0).InvokeMember("click")

        End With
    End Sub
End Class

これでデバッグは通るのですが、実際実行して時間が立つと
            .Document.GetElementById("textfield").SetAttribute("Value", "自Id")
の部分で「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とのエラーが
表示されます。
なぜそういう原因になったのかを教えていだだけませんか?よろしくお願いします。

[ツリー表示へ]
タイトルRe^4: WebBrpwser内で自動ログインを
記事No10901
投稿日: 2012/08/21(Tue) 12:19
投稿者VBレスキュー(花ちゃん)
> なぜそういう原因になったのかを教えていだだけませんか?よろしくお願いします。

>         myUrl = New System.Uri("ttp://○○○…")
仮定のサイトではなく実際のサイトのソースコードを見ないと解りませんが、エラーが
発生した部分のコードが間違っているか、その Document 内に "textfield" が無い等が
考えられます。
 

   '下記の部分は省略しても OK(但し、何をしているかは理解して下さい)
   If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
      Exit Sub
   End If


   上記の部分は、必要なかったのでしょうか?
   myUrl 以外が読み込まれていませんか?

 エラーが発生したこの部分(特に "textfield" は)は、何を見て書かれたのでしょうか?
 >.Document.GetElementById("textfield").SetAttribute("Value", "自Id")

 ここのサンプル投稿用掲示板のサンプルを参考にして勉強して下さい。

[ツリー表示へ]
タイトルRe^5: WebBrpwser内で自動ログインを
記事No10902
投稿日: 2012/08/21(Tue) 17:58
投稿者Arms
> 仮定のサイトではなく実際のサイトのソースコードを見ないと解りませんが、エラーが
> 発生した部分のコードが間違っているか、その Document 内に "textfield" が無い等が
> 考えられます。

>    '下記の部分は省略しても OK(但し、何をしているかは理解して下さい)
>    If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
>       Exit Sub
>    End If
>
>    上記の部分は、必要なかったのでしょうか?
>    myUrl 以外が読み込まれていませんか?

Public Class Form4

    Private myUrl As Uri

    Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myUrl = New System.Uri("http://www.sonomanma.co.jp/login.php")
        WebBrowser1.Url = myUrl

    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
            Exit Sub
        End If

        With WebBrowser1

            .Document.GetElementById("textfield").SetAttribute("Value", "id")
            .Document.GetElementById("textfield2").SetAttribute("Value", "pass")
            .Document.All.GetElementsByName("submit")(0).InvokeMember("Click")

        End With
    End Sub
End Class

省略可能のコードを付けた場合、「利用可能なソースがありません」と「オブジェクト参照がオブジェクト インスタンスに設定されていません。」のエラー2つ

省略可能のコードを付けない場合は「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と表示されます。

それ以上に大変なのは、コードを変更等すると

        With WebBrowser1

            .Document.GetElementById("textfield").SetAttribute("Value", "id")
            .Document.GetElementById("textfield2").SetAttribute("Value", "pass")
            .Document.All.GetElementsByName("submit")(0).InvokeMember("Click")

        End With

の部分がWebBrowser上で入力されなくなっています。

出来たり、出来なかったりなので原因がさっぱりわかりません…。
PCのOSがVistaに変更されたのも原因になるのでしょうか。

>  エラーが発生したこの部分(特に "textfield" は)は、何を見て書かれたのでしょうか?
>  >.Document.GetElementById("textfield").SetAttribute("Value", "自Id")

ログインしたいログイン画面のソースページから入力する部分のidを入力してます。


>  ここのサンプル投稿用掲示板のサンプルを参考にして勉強して下さい。

サンプルを参考に勉強をさせて頂きます。あとは基礎をしっかり身につけていきたいと思います。

[ツリー表示へ]
タイトルRe^6: WebBrpwser内で自動ログインを
記事No10903
投稿日: 2012/08/22(Wed) 00:23
投稿者VBレスキュー(花ちゃん)
かんじんの URL が間違っています。 http://www.  → https://www.
それと .Document.Forms(0).InvokeMember("Submit") の部分も

メールアドレス と パスワードを変更して下記コードを変更せずそのまま試して見て下さい。

先に投稿されたコードにメールアドレスとパスワードが明記されていますが大丈夫ですか?
(取り敢えず、伏せておきますが、変更等の処置を取られますように)

Public Class Form1

Private myUrl As Uri

Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   WebBrowser1.ScriptErrorsSuppressed = True
   myUrl = New System.Uri("https://www.sonomanma.co.jp/login.php")
   WebBrowser1.Url = myUrl
End Sub

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, _
         ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) _
                                                Handles WebBrowser1.DocumentCompleted
   If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
      Exit Sub
   End If

   With WebBrowser1
      .Document.GetElementById("textfield").SetAttribute("Value", "******@******")
      .Document.GetElementById("textfield2").SetAttribute("Value", "*******")
      .Document.Forms(0).InvokeMember("Submit")
   End With
End Sub
End Class

[ツリー表示へ]
タイトルRe^7: WebBrpwser内で自動ログインを
記事No10906
投稿日: 2012/08/22(Wed) 10:38
投稿者Arms
> それと .Document.Forms(0).InvokeMember("Submit") の部分も

この部分なんですが、URL先のページのソースを見るとformが2つあり、
先に置かれているSubmitが押されてしまう事と
ログインのFormのNameを指定すれば出来ると思うのですが、Nameが無いために指定ができないためあのようなコードにしました。

実際に自動ログインをすることは可能になったのですが、次はもう一度開こうとするとエラーが表示されるようになりました。(サイト側のログインエラー)

ifを利用すればエラー表示を出さずにすることが可能だと思うのですが
試しにいろいろ式を作ってみたところ上手くいきません。
アドバイスをよろしくお願いします。

[ツリー表示へ]
タイトルRe^6: WebBrpwser内で自動ログインを
記事No10904
投稿日: 2012/08/22(Wed) 09:14
投稿者Arms
> > 仮定のサイトではなく実際のサイトのソースコードを見ないと解りませんが、エラーが
> > 発生した部分のコードが間違っているか、その Document 内に "textfield" が無い等が
> > 考えられます。
>
> >    '下記の部分は省略しても OK(但し、何をしているかは理解して下さい)
> >    If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
> >       Exit Sub
> >    End If
> >
> >    上記の部分は、必要なかったのでしょうか?
> >    myUrl 以外が読み込まれていませんか?
>
> Public Class Form4
>
>     Private myUrl As Uri
>
>     Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
>
>         myUrl = New System.Uri("http://www.sonomanma.co.jp/login.php")
>         WebBrowser1.Url = myUrl
>
>     End Sub
>
>     Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
>
>         If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
>             Exit Sub
>         End If
>
>         With WebBrowser1
>
>             .Document.GetElementById("textfield").SetAttribute("Value", "id")
>             .Document.GetElementById("textfield2").SetAttribute("Value", "pass")
>             .Document.All.GetElementsByName("submit")(0).InvokeMember("Click")
>
>         End With
>     End Sub
> End Class
>
> 省略可能のコードを付けた場合、「利用可能なソースがありません」と「オブジェクト参照がオブジェクト インスタンスに設定されていません。」のエラー2つ
>
> 省略可能のコードを付けない場合は「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と表示されます。
>
> それ以上に大変なのは、コードを変更等すると
>
>         With WebBrowser1
>
>             .Document.GetElementById("textfield").SetAttribute("Value", "id")
>             .Document.GetElementById("textfield2").SetAttribute("Value", "pass")
>             .Document.All.GetElementsByName("submit")(0).InvokeMember("Click")
>
>         End With
>
> の部分がWebBrowser上で入力されなくなっています。
>
> 出来たり、出来なかったりなので原因がさっぱりわかりません…。
> PCのOSがVistaに変更されたのも原因になるのでしょうか。
>
> >  エラーが発生したこの部分(特に "textfield" は)は、何を見て書かれたのでしょうか?
> >  >.Document.GetElementById("textfield").SetAttribute("Value", "自Id")
>
> ログインしたいログイン画面のソースページから入力する部分のidを入力してます。
>
>
> >  ここのサンプル投稿用掲示板のサンプルを参考にして勉強して下さい。
>
> サンプルを参考に勉強をさせて頂きます。あとは基礎をしっかり身につけていきたいと思います。

[ツリー表示へ]
タイトルRe^7: WebBrpwser内で自動ログインを
記事No10905
投稿日: 2012/08/22(Wed) 09:16
投稿者Arms
すみません。修正と投稿間違えました。

花ちゃんさん変更ありがとうございます。以後気をつけます。

[ツリー表示へ]
タイトルRe^8: WebBrpwser内で自動ログインを
記事No10908
投稿日: 2012/08/22(Wed) 12:06
投稿者VBレスキュー(花ちゃん)
下記に変更して試して見て下さい。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
   WebBrowser1.ScriptErrorsSuppressed = True
   myUrl = New System.Uri("https://www.sonomanma.co.jp/login.php")
   WebBrowser1.Url = myUrl

End Sub

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, _
         ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) _
                                                Handles WebBrowser1.DocumentCompleted
   If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
      Exit Sub
   End If

   With WebBrowser1
      If .Document.Body.InnerText.IndexOf("ログインに失敗しました。") >= 0 Then
         Exit Sub
      End If
      .Document.GetElementById("textfield").SetAttribute("Value", "******@******")
      .Document.GetElementById("textfield2").SetAttribute("Value", "*******")
     ' .Document.Forms(1).InvokeMember("Submit")
      .Document.GetElementsByTagName("input").Item(7).InvokeMember("Click")
 '又は、 .Document.All.GetElementsByName("Submit").Item(0).InvokeMember("click")
 ' "Submit" は、大文字・小文字が区別されますので注意
   End With
End Sub

[ツリー表示へ]
タイトルRe^9: WebBrpwser内で自動ログインを
記事No10909
投稿日: 2012/08/23(Thu) 16:43
投稿者Arms
> Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
>    WebBrowser1.ScriptErrorsSuppressed = True
>    myUrl = New System.Uri("https://www.sonomanma.co.jp/login.php")
>    WebBrowser1.Url = myUrl
>
> End Sub
>
> Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, _
>          ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) _
>                                                 Handles WebBrowser1.DocumentCompleted
>    If Not TypeName(sender) = "WebBrowser" Or e.Url <> myUrl Then
>       Exit Sub
>    End If
>
>    With WebBrowser1
>       If .Document.Body.InnerText.IndexOf("ログインに失敗しました。") >= 0 Then
>          Exit Sub
>       End If
>       .Document.GetElementById("textfield").SetAttribute("Value", "自ID")
>       .Document.GetElementById("textfield2").SetAttribute("Value", "自Pass")
>      ' .Document.Forms(1).InvokeMember("Submit")
>       .Document.GetElementsByTagName("input").Item(7).InvokeMember("Click")
>  '又は、 .Document.All.GetElementsByName("Submit").Item(0).InvokeMember("click")
>  ' "Submit" は、大文字・小文字が区別されますので注意
>    End With
> End Sub

上のコードで試したところやはり再度開こうとするとエラーが表示されます。

コード変更になるのか分りませんが、ランチャからボタンを押して別フォーム(今作成中の内容)を表示というような動作をしています。一度目ボタンを押すとちゃんと自動ログインをされるのですが、二度目ボタンを押すとログインエラーと共にDocument.GetElementById("textfield").SetAttribute("Value", "自ID")の部分で「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と表示されます。

ログインしてるかしてないかの判断(if文)できればいいのですが、アドバイスをよろしくお願いします。

[ツリー表示へ]
タイトルWebBrpwser内で自動ログインを【修正】
記事No10910
投稿日: 2012/08/23(Thu) 17:25
投稿者VBレスキュー(花ちゃん)
2012/08/24 9:55 修正
> 上のコードで試したところやはり再度開こうとするとエラーが表示されます。

詳しい状況及び状況を確認できるコードを掲載して頂かないと解りません。

念の為に、会員登録して調べてみたら、特別な処理をしているようです。
(ログイン状態からログイン画面(URL)を呼び出すと違う画面が表示される等)

下記の部分を追加して見て下さい。

   With WebBrowser1
      If .Document.Body.InnerText.IndexOf("ログインに失敗しました。") >= 0 Then
         Exit Sub
      End If
 '追加部分(違う画面が表示されたら Top 画面に移動)
      If .Document.Body.InnerText.IndexOf("不正なアクセスです。") >= 0 Then
                   'https: と s を付けて下さい。
         .Navigate("https://www.sonomanma.co.jp"))
         Exit Sub
      End If

>ログインしてるかしてないかの判断(if文)できればいいのですが

ログインしていれば、画面上部に ユーザー名(登録時の氏名)が表示されるようになっているので
.Document.Body.InnerText 内にそのユーザー名があるかを調べれば解ります。
If .Document.Body.InnerText.IndexOf("ユーザー名") >= 0 Then のように

[ツリー表示へ]
タイトルRe: WebBrpwser内で自動ログインを【修正】
記事No10911
投稿日: 2012/08/24(Fri) 14:02
投稿者Arms
>    With WebBrowser1
>       If .Document.Body.InnerText.IndexOf("ログインに失敗しました。") >= 0 Then
>          Exit Sub
>       End If
>  '追加部分(違う画面が表示されたら Top 画面に移動)
>       If .Document.Body.InnerText.IndexOf("不正なアクセスです。") >= 0 Then
>                    'https: と s を付けて下さい。
>          .Navigate("https://www.sonomanma.co.jp"))
>          Exit Sub
>       End If

上記の追加コードを入力したところエラーがなくなりました。
アドバイスありがとうございます。

> >ログインしてるかしてないかの判断(if文)できればいいのですが
>  .Document.Body.InnerText 内にそのユーザー名があるかを調べれば解ります。
>  If .Document.Body.InnerText.IndexOf("ユーザー名") >= 0 Then のように

こちらに関してもなんとか調べ試行錯誤しましたら、出来ました。

花ちゃんさん、ここまでアドバイスを頂きありがとうございました。

まだまだVBに関しての知識やノウハウは少ないですが、ここのサイトを最大利用し身につけていきたいと思います。本当にありがとうございました。

[ツリー表示へ]