[リストへもどる]
一括表示

投稿時間:2003/06/30(Mon) 12:28
投稿者名:nobu
Eメール:
URL :
タイトル:
cgi ページのダウンロード
何時もお世話になりありがとうございます。

ユーザー名、パスワードの必要な *.cgi のページにアクセスして
「認証」を受けてから検索キーを送り WebBrowser1 に結果が表示出来る
ところまで出来ました。( *.cgi )
魔界の仮面弁士 さんのサンプルを使わせて頂いています。
結果が(srchrslt.cgi)表示されてから、こちらのHPの
「HTMLファイルをダウンロードする」にての URLDownloadToFile() を
使用してファイルに保存しようとしていますが、単にURLを指定では
「エラー」のページが保存されます。
この時点でもパスワードを送付しないと行けないのだろうと思いますが
方法が分かりません。

WebBrowser1 に表示されている内容をそのまま保存する、
または
正しい結果が保存されるようにするにはどうすれば良いかご指導をお願いします。
cgiの抜粋が必要かと思いますが、その時は再度投稿させて頂きます。

IEを直接起動して表示させて保存なら上手く結果を取得出来るのですが
VBにて取得してその結果を反映させたいので悩んでいます。
EUC-JP 部を SJIS にエンコードは上手く出来るようになりましたが。

投稿時間:2003/06/30(Mon) 14:16
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: cgi ページのダウンロード
> 魔界の仮面弁士 さんのサンプルを使わせて頂いています。
どれの事でしょう?(^_^;)

> この時点でもパスワードを送付しないと行けないのだろうと思いますが
> 方法が分かりません。
パスワード認証にも、いろいろな方法があります。
フォーム認証、Kerberos認証、BASIC認証など…。

今回の場合、おそらく、フォーム認証だとは思いますが、その場合、
何というパラメータを渡しているのかが分からないと、回答できません。

とりあえず、「横取り丸(+InetSpy)」などのフリーソフトをインストールして、
どのような内容が、cgiとの間でやりとりされているのかを、眺めて見ては如何でしょう。


> WebBrowser1 に表示されている内容をそのまま保存する、
documentオブジェクトをIPersistFileインターフェイス型の変数に代入して、
Saveメソッドで保存すればOKかと。

投稿時間:2003/06/30(Mon) 14:58
投稿者名:nobu
Eメール:
URL :
タイトル:
Re^2: cgi ページのダウンロード
魔界の仮面弁士 さん、早速ありがとうございます。
長文で見難いかも知れませんが、必要かと思われる箇所を転記します。

> どれの事でしょう?(^_^;)

以前のものを修正して下記の様なものです。(一部のみ抜粋)

「認証」関係 === 認証は出来て検索画面が出る。
「検索画面」が出て「認証」と同じ「Submit」ボタンを押しても
検索結果は「WebBrowser1」画面に表示されます。
検索キーが最初のUNAMEでも該当しますので。
勿論UNAMEを変えて「認証」と同じ「Submit」ボタンを押せば
新キーの検索結果が表示されます。
この表示中に「HTMLのダウンロード」を実行すると
「エラー」のcgiが保存されます。
ダウンロードのコーディングの仕方で表示は正しい結果でも
保存内容はエラー、または表示もエラーになる事もあります。
(保存関係を色々と試行錯誤している状態です)

Private Sub Text1_Change(Index As Integer)
    
On Error Resume Next
    Dim T As HTMLInputElement

    Set T = Choose(Index + 1, UNAME, UPASSWD)
    If T Is Nothing Then
        Exit Sub
    End If

    With Text1(Index)
        If .Tag = "" Then
            .Tag = "@"
            T.Value = .Text
            .Tag = ""
        End If
    End With
End Sub


Private Sub IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
On Error Resume Next
    If MYURL = URL Then
        Set document = pDisp.document
        Set UNAME = document.getElementsByName("UNAME")(0)
        Set UPASSWD = document.getElementsByName("UPASSWD")(0)
        Set frm = document.Forms(0)
        Text1(0).Text = UNAME.Value
        Text1(1).Text = UPASSWD.Value
    End If
End Sub


> パスワード認証にも、いろいろな方法があります。
> フォーム認証、Kerberos認証、BASIC認証など…。
> 今回の場合、おそらく、フォーム認証だとは思いますが、その場合、
> 何というパラメータを渡しているのかが分からないと、回答できません。

これはどこを書けば良いのか分からないのですが、

-------- loginsrch.cgi 認証----------
<SCRIPT language=JavaScript>
  function chkUname() {
    data1 = document.LGIN.UNAME.value.match(/([^0-9|^a-z])/gi);
    if (data1 || !document.LGIN.UNAME.value) {
          alert('コールサインの入力が正しくありません\nコールサインは半角の英数字で入力してください');
          document.LGIN.UNAME.focus();
          return false;
    }
    return true;
  }
  function chkUpasswd() {
    data1 = document.LGIN.UPASSWD.value.match(/([^0-9|^a-z])/gi);
    if (data1 || !document.LGIN.UPASSWD.value) {
          alert('パスワードの入力が正しくありません\nパスワードは半角の英数字で入力してください');
          document.LGIN.UPASSWD.focus();
          return false;
    }
    return true;
  }
  function sendData() {
    if (document.LGIN.UNAME.value == "") {
      alert ("コールサインを入力して下さい");
      document.LGIN.UNAME.focus();
      return false;
    }
    if (document.LGIN.UPASSWD.value == "") {
      alert ("パスワードを入力して下さい");
      document.LGIN.UPASSWD.focus();
      return false;
    }
    return true;
  }
  </SCRIPT>

<META content="MSHTML 6.00.2800.1170" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=0 onload=focus() marginheight="0" marginwidth="0">

...省略
                  <FORM name=LGIN onsubmit="return sendData()" action=""
                  method=post>
...省略
                        <DIV align=right><FONT size=-2>コールサイン:</FONT></DIV></TD>
                      <TD><FONT size=-1><INPUT maxLength=10
                        onchange="return chkUname()" size=30 name=UNAME> <FONT
                        size=-2>(会員、准員のコールサイン:半角)</FONT></FONT> </TD></TR>
                    <TR>
                      <TD>
                        <DIV align=right><FONT size=-2>パスワード:</FONT></DIV></TD>
                      <TD><FONT size=-1><INPUT type=password maxLength=8
                        onchange="return chkUpasswd()" name=UPASSWD> <FONT
                        size=-2>(登録されたパスワード)</FONT></FONT> </TD></TR>

                      <TD><INPUT type=submit value=" 送 信 " name=SEND>    <INPUT type=reset value=画面クリア name=RESET>    <INPUT onclick=JavaScript:history.back() type=reset value=" 戻 る " name=BACK>
                        <INPUT readOnly type=hidden value=1 name=UKEYWORD>
...省略

IEにて手動で保存した内容の抜粋
-------- srchrslt.cgi 検索結果 成功時 ----------

      <form  name="USRVIEW">
        <table width="640" border="0" cellspacing="0" cellpadding="0" align="center">
          <tr>
            <td colspan="2">
             <div align="center"><br>
                <font color="#339933"><b><font size="+1">検索結果</font></b></font></div>
...省略
              <div align="center"><B>「 ***** 」</B>は、登録されています。<br>
...省略
                <input type="button" value=" 戻 る " name="BACK22" onClick="JavaScript:history.back()">  
                <input type="button" value=" 閉じる " name="CLOSE2" onClick="JavaScript:window.close()">
       <input type="hidden" name="UKEYWORD" value="%%%%%%%/" readonly>
...省略

******* , %%%%%%%% は固有名詞なので伏せ字とさせていただいてあります。


              <div align="center"><B>「 ***** 」</B>は、登録されています。<br>
の「登録されています」にてOK、NGの判別をしたいのです。


> とりあえず、「横取り丸(+InetSpy)」などのフリーソフトをインストールして、
> どのような内容が、cgiとの間でやりとりされているのかを、眺めて見ては如何でしょう。

これは入手して試して見ます。

> > WebBrowser1 に表示されている内容をそのまま保存する、
> documentオブジェクトをIPersistFileインターフェイス型の変数に代入して、
> Saveメソッドで保存すればOKかと。

知識不足で対処出来ない状況です。
お手数をお掛けします。

投稿時間:2003/07/02(Wed) 20:28
投稿者名:nobu
Eメール:
URL :
タイトル:
cgi ページのダウンロード 出来ました
魔界の仮面弁士 さん、ありがとうございました。
以前教えていただいていたコードだと思いますが
色々と整理して試したところ下記で保存出来るようになりました。
(***部分は伏せ字としてあります)

    Dim objXMLHTTP As Object
    
    Set objXMLHTTP = CreateObject("Microsoft.XMLHTTP")
    
    objXMLHTTP.Open "POST", "http://www.****/***.cgi", False
    objXMLHTTP.Send "UNAME=" & MyCalls & "&UPASSWD=" & PassWords & "&Submit%21=SEND"

If objXMLHTTP.Status >= 400 Then
        'エラー
        MsgBox objXMLHTTP.StatusText, vbExclamation, "応答コード: " & CStr(objXMLHTTP.Status)
        Set objXMLHTTP = Nothing
        Exit Sub
End If
    
    With CreateObject("ADODB.Stream")
        .Open
        .Type = 1   '1=adTypeBinary
        .Write objXMLHTTP.responseBody
        .SaveToFile strPath & "LoginSrch.txt", 2  '2=adSaveCreateOverWrite
        .Close
    End With
    
    Set objXMLHTTP = Nothing