ダイレクト認証+フォーム認証を自動化するには?

解決


haku  2006-03-03 02:41:11  No: 130522

よろしくお願いします。
ダイレクト認証のページがあり、そこを過ぎるとログインフォームがあります。
ダイレクト認証は下記のコードで、つながりました。
Sub test3()
Dim oXmlHttp As Object
Set oXmlHttp = CreateObject("MSXML2.XMLHTTP")
oXmlHttp.Open "post", "http://aaa/login.php?", False
oXmlHttp.send ("name:pass")
Debug.Print oXmlHttp.responseText
End Sub
ただコードが文字化けしてます。
認証を手で押す上で、フォームの自動ログインは下記で出来ました。
Sub test()
With CreateObject("internetexplorer.application")

   
   .navigate "http://aaa/login.php?"
   While .Busy
   Wend

Do While .document.readyState <> "complete"
    DoEvents
Loop
    .document.all.Name.Value = "name"
    .document.all.pass.Value = "pass"
    .document.forms(0).Submit
   While .Busy
   Wend
   MsgBox .LocationURL
End With
End Sub

行いたい事は、ダイレクト認証を自動ログインして、
その先のフォームに(名前・パス)をセットしてログイン。
ログイン先のURL(又はhtmlソース)を取得。
です。あれこれ調べて、XMLHTTPだとダイレクト認証は通ったのですが、
フォームログインとの組み合わせがわからないため、それとソースの文字化けでもつまり…
1週間悩んでいます。
よろしくお願いいたします。


魔界の仮面弁士  2006-03-03 03:41:20  No: 130523

> ダイレクト認証は下記のコードで、つながりました。
『ダイレクト認証』という物を知らないので、InternetExplorer ベースでの
操作についてはアドバイスできません。とりあえず XMLHTTP の方だけ回答します。

> ただコードが文字化けしてます。
Unicode ベースのページや、XML を返すサーバで無い限りは、
responseText に頼らない方が無難です。文字コードを調べた上で、
responseBody から返されるバイナリを、ADODB.Streamなどで、
明示的に変換するようにしてみてください。


haku  2006-03-03 04:06:57  No: 130524

レスありがとうございます。
ダイレクト認証はBASIC認証のもっと強化してあるもの?みたいです。
ソースはネット上のものを丸写しに近い状況です。

言語は
content="text/html; charset=SHIFT_JIS"

となっているので、SHIFT_JISだと思います。

>responseBody から返されるバイナリを、ADODB.Streamなどで、
>明示的に変換するようにしてみてください。
とはどのようにすればよいのでしょうか。


ななす  2006-03-03 04:43:29  No: 130525

>>とはどのようにすればよいのでしょうか。
調べてからの発言ですか?


haku  2006-03-03 04:48:26  No: 130526

ADODB.Streamが文字のエンコードを行うのはわかったのですが、

>明示的に変換
と言う意味がわからなくて。


魔界の仮面弁士  2006-03-03 06:49:50  No: 130527

> となっているので、SHIFT_JISだと思います。
であれば、StrConv を使うのがもっとも簡単でしょう。

>> 明示的に変換
> と言う意味がわからなくて。
ん? 明示変換の(日本語としての)意味ですか?

えぇと、XMLHTTP.responseText での出力だと、どの文字コードとして
扱われたのかが、わかりにくいですよね。

また、ADODB.Stream を使うにしても、自動認識モード(_autodetect)を
用いると、やはり結果が曖昧な物になります。

ですから、そうした物(自動判定)には頼らず、どの文字コードで変換するかを
はっきりと指定できる方法で変換した方が良いですよ……という意味です。


haku  2006-03-04 01:39:44  No: 130528

お返事が遅くなり申し訳ありません。

Debug.Print StrConv(oXmlHttp.responseBody, vbUnicode)
と言う形で、変換することが出来ました。
認証の事なのですが、XMLHTTPでソースを取得できるからといって、
アクション(データをPOSTしたりなど)は出来ないものなのですか?

よくわからないまま取りあえず、ソースを取得して解析を行おうと思いまして、XMLHTTPを使ってみました。認証についての躓きが無いため、
自動化を行ううえでは、非常に重要なのです。

セキュリティに問題があることはわかるのですが、
http//uesr:pass@aaa.htmlというアクセスの方法しか、自動化が
思いつかず、VBAではIEのオブジェクトしか細かいアクションが起こせないので、(IEでは上記認証は使えません。)
困っています。


魔界の仮面弁士  2006-03-04 01:50:47  No: 130529

> アクション(データをPOSTしたりなど)は出来ないものなのですか?
できますよ。
Openメソッドの第一引数で、メソッドの指定(ややこしい表現…)ができますし、
HTTP Request Body の送信は、send メソッドの引数に、
  ・IStreamインターフェイスを実装したオブジェクト
  ・String型
  ・内部処理形式 String のVariant型
  ・内部処理形式 Byte配列 のVariant型
のいずれかを渡すことで行えます。
サーバによっては、追加の HTTP Request Header が必要になる事が
ありますが、これも setRequestHeader にて対応可能です。

http を使った平文での通信であれば、
  http://hide.maruo.co.jp/software/inetspy.html
などを使えば、通信内容を簡単にチェックできますので、
どのような内容が送信されているのか、確認しておくと良いでしょう。


haku  2006-03-04 21:03:47  No: 130530

れすありがとうございます。
最初の説明のしかたが悪かったのだと思うのですが、
過去ログの
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200412/04120009.txtSub test3()

に近いのだと思います。で対象のサイトは、
最初にBASIC認証があり、そこを通ると、
ログインフォームのあるページが表示されます。
そこで名前とパスを入れると目的のページにたどり着けます。
つまり2重に認証があるのです。
ヘッダーにBASIC認証のログイン情報を含められると聞き、
下記のようにしたのですが、

Dim oXmlHttp As Object
Set oXmlHttp = CreateObject("MSXML2.XMLHTTP")
oXmlHttp.Open "get", "http://aaa/login.php", False, _
"myname", "mypass"
'oXmlHttp.send ("a=au&name=仮名&pass=xxxx")
Debug.Print StrConv(oXmlHttp.responseBody, vbUnicode)

End Sub

どうしてもログインフォームページのソースしか取得できません。
submitされていないようなのです。
フォームには
<input type="hidden" name="a" value="au">
<input class="itext" type="text" name="name" value=""
<input class="ipassword" type="password" name="pass"
<input class="isubmit" type="submit" name="" value="ログイン"
の4個の要素があります。
いろいろ調べて出来そうなのですが…
混乱しています。
ちなみにJavaScriptのサイトです。
よろしくお願いします。


いな  2006-03-05 00:38:51  No: 130531

> いろいろ調べて出来そうなのですが…
> 混乱しています。

混乱した状態で、話をすると、こじれるだけなので、
整理して話を進めましょう。慌てたところで進めても
百害あって一理ナシです。


haku  2006-03-07 03:31:16  No: 130532

返信が遅くなり申し訳ありません。
> oXmlHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
とすることにより、アクセスの上ログインも出来ました。
ところが、
その先のソースを見ると、

<FRAMESET cols="225,*" rows="*">
<FRAME SRC="./menu.php?ac=menu&ss=1234abcd"  NAME="menu">
<FRAME SRC="./info.php?ac=work&ss=1234abcd" NAME='rc'>
</FRAMESET>

このようになっていました。
どうやらフレームのようなのですが、
リンクが  ./menuと相対参照になっています。
この先のリンクのソースを得るためには、
どのようにセッションをつなげて行けばよいのでしょうか?
ためしに、ss=からさきを取得してhttpからXMLHTTP.openで、
指定しなおしてみましたが、
ログインエラーになってしまいます。

ss=から先はログインできないと取得できないので、
一連のセッションの間にアクセスをしてしまわないといけないようなのです。
ss=から先を切り出す事そのものはMID関数などで、出来ているのですが、
その切り出すコマンドを途中に組み込んでいいのかもわからず、
(XMLHTTPでは無いので、一旦外れなければいけないのかと)
どうリンク先(フレーム先?)にアクセスすればよいかを教えていただけないでしょうか。


haku  2006-03-08 20:46:27  No: 130533

まだ解決はしていないのですが、一旦閉じさせていただきます。
どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加