VB6 SP6を使用しています。
掲示板の[CGIのPOSTによるデータ取得]を参考にして
Webページから情報を取得しているのですが
http://www.dx-pedition.de/lakshadweep2007/logs/logsearch.php
のページには下記の様に [ option value ] があります。
これを選択・指定してpost、sendをするには
どうしたら良いでしょうか? ご指導をお願いします。
Log Search for <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
何故 iso-2022-jp を使っているのかが気になりますが、
それはとりあえずおいといて…。
> 下記の様に [ option value ] があります。
application/x-www-form-urlencoded でのポストということなので、
たとえば mycall=VU7RG などを一緒に送信しておけば良いのでは。
魔界の仮面弁士さん、何時もありがとうございます。
> 何故 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 などを一緒に送信しておけば良いのでは。
具体的なコードを教えていただけないでしょうか、お願いします。
最初のコードとは異なってしまいましたが
callsign=VU7RG として
「VU7RG Log Search Results for VU7RG」のデータを
入手したいのです。
> 最初に試していたコードで文字化けしたので変換の為とかに
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 等でごりごり書くなどといった代替策を講じねば
ならない場合もあります。いろいろと試した上で判断してみてください。
魔界の仮面弁士さん、再度ありがとうございます。
>> 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
> 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 にしてくださると助かります。
魔界の仮面弁士さん、再度のフォローありがとうございます。
%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 の件を解決するにはまだ努力が必要ですが
最初の希望動作はさせる事が出来ましたので「解決」にチェックしておきます。
大変ありがとうございました。
> iso-2022-jp の件を解決するにはまだ努力が必要ですが
問題点はそこでは無いような。
> 送るべき文字列がすべて ASCII の範囲内に収まるのですが
ASCII なら、文字コード変換(String をバイナリ化する作業)は不要です。
しかし、そのデータを application/x-www-form-urlencoded で送るための
URL エンコードの変換処理は常に必要です(重要なのはこっち)。
たとえ ASCII の範囲であっても、たとえば「&」「=」「+」「%」などは、
無変換で送信するわけにもいきませんよね。
魔界の仮面弁士さん、度々のフォローありがとうございます。
返信内容を何回か読み直して考えてみました。
結果、下記のようにして同じデータが取れました。
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
ツイート | ![]() |