MSXML2.XMLHTTP post option

解決


natu  2007-05-23 23:24:00  No: 136480

VB6  SP6を使用しています。
掲示板の[CGIのPOSTによるデータ取得]を参考にして
Webページから情報を取得しているのですが
http://www.dx-pedition.de/lakshadweep2007/logs/logsearch.php
のページには下記の様に  [ option value ] があります。
これを選択・指定してpost、sendをするには
どうしたら良いでしょうか?  ご指導をお願いします。

Log Search for &nbsp;&nbsp;<select name='mycall'>
<option value='VU7RG'>VU7RG</option>
<option value='VU7MY'>VU7MY</option>

[AcitveX Data Objects]のVer 2.5以上を参照設定

Private S As String
Private B() As Byte
Private Stm As ADODB.Stream
Private X As Object

Private Sub Command2_Click()

Set X = CreateObject("MSXML2.XMLHTTP")
  X.open "POST", "http://www.dx-pedition.de/lakshadweep2007/logs/logsearch.php", False
  X.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  X.send "keywords=***"
  
    Set Stm = New ADODB.Stream
    Stm.open
    Stm.Type = adTypeBinary
    Stm.Write X.responseBody

    Stm.position = 0
    Stm.Type = adTypeText
    Stm.Charset = "iso-2022-jp" 'バイトデータの文字コードを指定
    S = Stm.ReadText()   'String型のデータとして取り出す
  
    Text1.Text = S
    Stm.Close
    Set Stm = Nothing

End Sub


魔界の仮面弁士  2007-05-24 06:29:05  No: 136481

何故 iso-2022-jp を使っているのかが気になりますが、
それはとりあえずおいといて…。

> 下記の様に  [ option value ] があります。
application/x-www-form-urlencoded でのポストということなので、
たとえば mycall=VU7RG などを一緒に送信しておけば良いのでは。


natu  2007-05-24 06:45:46  No: 136482

魔界の仮面弁士さん、何時もありがとうございます。

> 何故 iso-2022-jp を使っているのかが気になりますが、

最初に試していたコードで文字化けしたので変換の為とかに
使用していました。

Open strPath & "VU7RG.txt" For Output As #f_o

    Dim X  As Object
    Set X = CreateObject("MSXML2.XMLHTTP")
    X.open "GET", "http://www.dx-pedition.de/lakshadweep2007/logs/logsearch.php", False
    X.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    X.send "mycall = VU7RG+callsign=***"
    Print #f_o, X.responseText
    Close #f_o

上記などでは欲しい情報がとれません。

> たとえば mycall=VU7RG などを一緒に送信しておけば良いのでは。

具体的なコードを教えていただけないでしょうか、お願いします。


natu  2007-05-24 06:53:39  No: 136483

最初のコードとは異なってしまいましたが

callsign=VU7RG として
「VU7RG Log Search Results for VU7RG」のデータを
入手したいのです。


魔界の仮面弁士  2007-05-24 19:05:35  No: 136484

> 最初に試していたコードで文字化けしたので変換の為とかに
iso-2022-jp は日本語 JIS なので、くだんのサイトが解釈できるとも
思えないんですよ。

で。送るべき文字列がすべて ASCII の範囲内に収まるのであれば、
コード変換は不要です。そのまま、URL エンコードするだけで十分です。

一方、漢字等を送信しなければならないのであれば、URL エンコードを
しかける前に、文字列の符号化に伴う文字コード変換が必要になりますが、
このとき、どの文字コードにすれば良いのかは、サーバ側の実装次第です。

また、受信側にしても、responseText では文字コード判定がうまくいかない
ケースがあります。その場合は、responseBody でバイナリデータを受け取り、
適切な文字コード変換を施す必要がありますのでご注意あれ。

> X.open "GET", "http://www.dx-pedition.de/lakshadweep2007/logs/logsearch.php", False
これ、指定する URL が間違っていませんか?
Web サイト側の HTML モドキを見てみると、
  <form action=logsearch.php method=post>
ではなく、
  <form action=logsearch.php?cmd=search method=post>
になっているようでしたし。

> X.send "mycall = VU7RG+callsign=***"
「&」を使いましょう。「+」は区切文字ではなく、空白文字です。
(application/x-www-form-urlencoded の仕様についてしらべてみましょう)
それに、「mycall = VU7RG」と「mycall=VU7RG」は別物ですよ。
あと、送信ボタン「submit=Search」も入れておいた方が無難かと。

> のデータを入手したいのです。
大抵の場合は XMLHTTP でうまく送受信できるのですが、サーバ側の
実装によっては、IE とは異なる結果となってしまう場合もあります。
(とはいえ、今回のサーバがどうであるかについては知りませんが)

たとえばサーバ側が、Referer ヘッダからリンク元 URL を調べていたり、
User-Agent でブラウザ判定を行っていたり、Cookie が使用されていたり
した場合です。

状況次第では、追加の setRequestHeader を加えるだけで対処できるものも
ありますが、直接変更できない情報(User-Agent 等)が参照されている場合は、
XMLHTTP の使用をあきらめ、WebBrowser コントロール等を使っての通信に
切り替えるか、MSWinSock 等でごりごり書くなどといった代替策を講じねば
ならない場合もあります。いろいろと試した上で判断してみてください。


natu  2007-05-24 19:56:36  No: 136485

魔界の仮面弁士さん、再度ありがとうございます。

>> X.open "GET", "http://www.dx-pedition.de/lakshadweep2007/logs/logsearch.php", False
>これ、指定する URL が間違っていませんか?

ご指摘を受けてURLを変更しました。

下記の様に修正してデータの保存が出来る様になりました。
大変ありがとうございました。

Set X = CreateObject("MSXML2.XMLHTTP")
  X.open "POST", "http://www.dx-pedition.de/lakshadweep2007/logs/logsearch.php?cmd=search", False   'OK
  X.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  X.Send "mycall=VU7RG&callsign=" & key_call & "&submit%21=Search"       'OK


魔界の仮面弁士  2007-05-24 20:10:37  No: 136486

> X.Send "mycall=VU7RG&callsign=" & key_call & "&submit%21=Search"       'OK
あれ、%20 が付いていますね。HTML を見る限りでは、
  <input type="submit" name="submit " value="Search">
ではなく、
  <input type="submit" name="submit" value="Search">
とあるように見えましたけれども…。

> 下記の様に修正してデータの保存が出来る様になりました。
解決したのであれば、掲示板投稿時に解決のチェックボックスを
on にしてくださると助かります。


natu  2007-05-24 20:58:15  No: 136487

魔界の仮面弁士さん、再度のフォローありがとうございます。
%21  をつけて見ましたが動作したのでそのままにしてあります。
今、削除してテストしましたが結果は同じでしたので消しておきます。

iso-2022-jp  の件は
送るべき文字列がすべて ASCII の範囲内に収まるのですが
コード修正がまだ不明なので下記のままにしています。

    Set Stm = New ADODB.Stream
    Stm.open
    Stm.Type = adTypeBinary
    Stm.Write X.responseBody

    Stm.position = 0
    Stm.Type = adTypeText
    Stm.Charset = "iso-2022-jp" 'バイトデータの文字コードを指定
    S = Stm.ReadText()   'String型のデータとして取り出す
    Text1.Text = S

iso-2022-jp  の件を解決するにはまだ努力が必要ですが
最初の希望動作はさせる事が出来ましたので「解決」にチェックしておきます。

大変ありがとうございました。


魔界の仮面弁士  2007-05-24 21:23:26  No: 136488

> iso-2022-jp  の件を解決するにはまだ努力が必要ですが
問題点はそこでは無いような。

> 送るべき文字列がすべて ASCII の範囲内に収まるのですが
ASCII なら、文字コード変換(String をバイナリ化する作業)は不要です。

しかし、そのデータを application/x-www-form-urlencoded で送るための
URL エンコードの変換処理は常に必要です(重要なのはこっち)。
たとえ ASCII の範囲であっても、たとえば「&」「=」「+」「%」などは、
無変換で送信するわけにもいきませんよね。


natu  2007-05-24 22:08:58  No: 136489

魔界の仮面弁士さん、度々のフォローありがとうございます。
返信内容を何回か読み直して考えてみました。
結果、下記のようにして同じデータが取れました。
Set Stm = New ADODB.Stream  関係は無くてもOKでした。

Set X = CreateObject("MSXML2.XMLHTTP")
  X.open "POST", "http://www.dx-pedition.de/lakshadweep2007/logs/logsearch.php?cmd=search", False   'OK
  X.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  X.Send "mycall=VU7MY&callsign=" & key_call & "&submit=Search"       'OK
  
    S = X.responseText
    Text1.Text = S


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

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






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