tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルIE8環境でのMSXML2.XMLHTTP30挙動
記事No15038
投稿日: 2010/11/19(Fri) 09:43
投稿者IMA
WinXP SP3で 以前はIE6でしたが、IE8に変更しました。

IE6の時に、ID/Password で認証が必要なサイトに IE6上で事前に認証
(→サイトを開いておく)した状態で、そのサイト配下のコンテンツに
動的にMSXML2.XMLHTTP30にてアクセスしておりました。

Dim objHTTP As New MSXML2.XMLHTTP30, sReturn As String
    objHTTP.Open "post", URL, False
    objHTTP.send
    sReturn = objHTTP.responseText

※IE6のセッションクッキーなどが有効であったようです。

しかし、IE8に変更した後は、認証エラーとなりデータが上手く取得できません。

ちなみに、新規のIEオブジェクトを作成し、oIE.Navigate2 URL などとし
ソースを取得することはできます。

    Set oIE = CreateObject("InternetExplorer.application")
    sReturn = oIE_DL.document.documentElement.outerHTML

    ※ 以前はoIE_DL.document.body.outerHTML でも拾えたようですが
       単に画面表示されている内容のhtmlしか取得できないようです。
       ⇒ この辺の情報も解れば教えて下さい。

XMLHTTPなどで、IEの認証を活かした状態で接続させる方法は有りますでしょうか?

追記:このHPは最初は、当該サイト配下のコンテンツには認証無しで
アクセスできました。その後、認証が必要になり、それでもIE6の時は
XMLHTTPで接続できたと思っていますが、間違いかも知れません。

目的は、IEで開くとhtmlを解釈するので、表示完了まで遅くなるためです。
※ソースのhtmlのみをできるだけ早く取得したい。

よろしくお願いします。

[ツリー表示へ]
タイトルRe: IE8環境でのMSXML2.XMLHTTP30挙動
記事No15042
投稿日: 2010/11/20(Sat) 12:17
投稿者花ちゃん
今まで使った事がないので詳しくは知りませんが、何方からもレスがないようなので。

> IE6の時に、ID/Password で認証が必要なサイトに IE6上で事前に認証
> (→サイトを開いておく)した状態で、そのサイト配下のコンテンツに
> 動的にMSXML2.XMLHTTP30にてアクセスしておりました。
>
> Dim objHTTP As New MSXML2.XMLHTTP30, sReturn As String
>     objHTTP.Open "post", URL, False
>     objHTTP.send
>     sReturn = objHTTP.responseText
>
> ※IE6のセッションクッキーなどが有効であったようです。
>
> しかし、IE8に変更した後は、認証エラーとなりデータが上手く取得できません。

Yahoo のメールサイトで確認した限りでは、問題なく取得する事ができました。
但し、取得するサイトによっては文字化けしたり、部分的に取得できないところも
あるようです。

具体的なサイトのアドレスやエラーが発生している箇所のコードや正確なエラーメッセージ
等を投稿された方が...。
(IE6.0 の時に使っていてうまく取得できたコードを他の人が動作確認できるコードを投稿
して見て下さい。)


>     ※ 以前はoIE_DL.document.body.outerHTML でも拾えたようですが
>        単に画面表示されている内容のhtmlしか取得できないようです。
>        ⇒ この辺の情報も解れば教えて下さい。

逆に、outerHTML で取得できない部分のどの部分が必要なのでしょうか?
oIE_DL.document.documentElement.outerHTML なら、HEAD 情報も含んで取得できますが。

> XMLHTTPなどで、IEの認証を活かした状態で接続させる方法は有りますでしょうか?

このIEの認証 とは? 何を指しているのでしょうか?
サーバーに対するアクセス制限でしょうか? サイト内の特定のページ等への入室制限
でしょうか?
後記ならこんな感じ

Private Sub Command1_Click()
   Dim oHttp  As Object
   Set oHttp = CreateObject("MSXML2.XMLHTTP")
  '下記アドレスの末尾の半角スペースは、実使用時は削除して下さい。
   oHttp.open "post", "http://www.kent-web.com/bbs/gwbbs/gwbbs.cgi ", False
   oHttp.send "id=guest&pw=guest"
   Debug.Print Replace(StrConv(oHttp.responseBody, vbUnicode), vbLf, vbCrLf)
   Set oHttp = Nothing
End Sub

但し、サイトの仕様により設定も違ってきますし、認証? されない場合もあります。

※ Windows 7 上の IDE 上で動作確認するとバージョンによってエラーが発生しますので
  EXE 版で確認するとかして下さい。 特に、CreateObject("Msxml2.XMLHTTP.4.0") の
  場合、VB が落ちてしまいます。
  CreateObject("Microsoft.XMLHTTP") や CreateObject("Msxml2.XMLHTTP") や 
  CreateObject("Msxml2.XMLHTTP.3.0") 等では、IDE上でも動作 OK

>IE6の時に、ID/Password で認証が必要なサイトに IE6上で事前に認証
事前に別に IE なり、WebBrowser で読み込んで表示しているなら、最初から IE なり
、WebBrowser なりを使った方が早いような(トータルで)気がしますが?

そもそも取得して何をしたいのか等具体的に書いて頂くと違った方法もあるかと思うの
ですが。

[ツリー表示へ]
タイトルRe^2: IE8環境でのMSXML2.XMLHTTP30挙動
記事No15043
投稿日: 2010/11/22(Mon) 07:46
投稿者IMA
花ちゃん さん、Res有り難うございます。

>今まで使った事がないので詳しくは知りませんが、何方からもレスがないようなので。
>
>> IE6の時に、ID/Password で認証が必要なサイトに IE6上で事前に認証
>> (→サイトを開いておく)した状態で、そのサイト配下のコンテンツに
>> 動的にMSXML2.XMLHTTP30にてアクセスしておりました。
>>
>> Dim objHTTP As New MSXML2.XMLHTTP30, sReturn As String
>>     objHTTP.Open "post", URL, False
>>     objHTTP.send
>>     sReturn = objHTTP.responseText
>>
>> ※IE6のセッションクッキーなどが有効であったようです。
>>
>> しかし、IE8に変更した後は、認証エラーとなりデータが上手く取得できません。
>
>Yahoo のメールサイトで確認した限りでは、問題なく取得する事ができました。
>但し、取得するサイトによっては文字化けしたり、部分的に取得できないところも
>あるようです。
>
>具体的なサイトのアドレスやエラーが発生している箇所のコードや正確なエラーメッセージ
>等を投稿された方が...。
>(IE6.0 の時に使っていてうまく取得できたコードを他の人が動作確認できるコードを投稿
>して見て下さい。)

具体的なサイトのアドレスや・・・
→ 出したいのは山々ですが、内容が特定されてしまいますので、変に誤解されると
 困るため具体的な記載はご勘弁下さい。


>>     ※ 以前はoIE_DL.document.body.outerHTML でも拾えたようですが
>>        単に画面表示されている内容のhtmlしか取得できないようです。
>>        ⇒ この辺の情報も解れば教えて下さい。
>
>逆に、outerHTML で取得できない部分のどの部分が必要なのでしょうか?
>oIE_DL.document.documentElement.outerHTML なら、HEAD 情報も含んで取得できますが。
>
>> XMLHTTPなどで、IEの認証を活かした状態で接続させる方法は有りますでしょうか?
>
>このIEの認証 とは? 何を指しているのでしょうか?

Yahoo のメールサイトでも、IDやパスワードの入力が要求され、それの基づき
セッションクッキーが生成されると思います。また、受付側のサーバーでは
クライアント側の情報(例えばマックアドレス)なども取得して正式な接続状況
であるかをチェックしていると思います。「IEの認証」とはIEで接続した際の
それらを指して言ったつもりです。


>サーバーに対するアクセス制限でしょうか? サイト内の特定のページ等への入室制限
>でしょうか?
>後記ならこんな感じ
>
>Private Sub Command1_Click()
>   Dim oHttp  As Object
>   Set oHttp = CreateObject("MSXML2.XMLHTTP")
>  '下記アドレスの末尾の半角スペースは、実使用時は削除して下さい。
>   oHttp.open "post", "http://www.kent-web.com/bbs/gwbbs/gwbbs.cgi ", False
>   oHttp.send "id=guest&pw=guest"
>   Debug.Print Replace(StrConv(oHttp.responseBody, vbUnicode), vbLf, vbCrLf)
>   Set oHttp = Nothing
>End Sub

最初に開く認証HPの時点でSessionクッキーが生成され、それもチェックされるのか
postしても認証画面に戻ってしまうようです。

>
>但し、サイトの仕様により設定も違ってきますし、認証? されない場合もあります。
>
>※ Windows 7 上の IDE 上で動作確認するとバージョンによってエラーが発生しますので
>  EXE 版で確認するとかして下さい。 特に、CreateObject("Msxml2.XMLHTTP.4.0") の
>  場合、VB が落ちてしまいます。
>  CreateObject("Microsoft.XMLHTTP") や CreateObject("Msxml2.XMLHTTP") や 
>  CreateObject("Msxml2.XMLHTTP.3.0") 等では、IDE上でも動作 OK
>
>>IE6の時に、ID/Password で認証が必要なサイトに IE6上で事前に認証
>事前に別に IE なり、WebBrowser で読み込んで表示しているなら、最初から IE なり
>、WebBrowser なりを使った方が早いような(トータルで)気がしますが?
>
>そもそも取得して何をしたいのか等具体的に書いて頂くと違った方法もあるかと思うの
>ですが。

最初から IE なり、WebBrowser なりを使った場合では画像が多く貼り付けられ
DocumentCompleteまで時間が掛かっています。つまり、htmlソース文字列自体を
早く取得したいのです。

そこで、花ちゃんさんのヒントや最近のトピックスを参考に、DocumentCompleteではなく
objIEの readyState=READYSTATE_INTERACTIVE時点で抜けるようにしましたら
少し早くなったような気がします。

もう少し、色々な手法を検証しますので、もっと良い方法が見つかればUpさせていただきます。

どうも有り難うございました。

[ツリー表示へ]
タイトルRe^3: IE8環境でのMSXML2.XMLHTTP30挙動
記事No15044
投稿日: 2010/11/22(Mon) 23:22
投稿者魔界の仮面弁士
> 最初に開く認証HPの時点でSessionクッキーが生成され、それもチェックされるのか
> postしても認証画面に戻ってしまうようです。

初回接続時のレスポンスに Set-Cookie ヘッダーがあるのなら、
認証時のリクエストにその Cookie を付与しておけば解決しませんか?

[ツリー表示へ]
タイトルRe^4: IE8環境でのMSXML2.XMLHTTP30挙動
記事No15045
投稿日: 2010/11/23(Tue) 08:29
投稿者IMA
魔界の仮面弁士さん、またお世話になりました。

> 初回接続時のレスポンスに Set-Cookie ヘッダーがあるのなら、
> 認証時のリクエストにその Cookie を付与しておけば解決しませんか?

花ちゃんさんに言われ、魔界の仮面弁士さんにも利用可能性をコメント戴くと
再度試してみなくては!という気になります。(汗

結果ですが、上手く行きました。
接続完了後も、認証が生きており希望のURLのソースhtmlを上手く早く
取得可能になりました。

具体的には、当該HPがSHIFT-JISの為か、PostDataは文字列ではダメで
バイト配列にする必要があったようです。

http://d.hatena.ne.jp/juku-cho/20090429/1240971645
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200501/200501_05010059.html

以下、参考情報として概要を記載しておきます。
・・・文字は適当に置き換えて下さい

Dim sPostData As String, sURL As String
Dim oHttp  As New MSXML2.XMLHTTP
Dim bPostData() As Byte
    
    sURL = "https://www.hoge・・・・"  
    sPostData = "id=guest&pw=guest・・・"
    bPostData = StrConv(sPostData, vbFromUnicode)

    oHttp.Open "post", sURL, False
    oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    oHttp.setRequestHeader "Cookie", "・・・・"
    oHttp.send bPostData

    'Debug.Print oHttp.getAllResponseHeaders
    'Debug.Print oHttp.responseText

今回もまた、勉強させていただきました。
(getAllResponseHeaders、setRequestHeader・・・)

どうも有り難うございました。

[ツリー表示へ]