tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルAxWebBrowserで Post
記事No2124
投稿日: 2005/09/14(Wed) 00:04
投稿者火星の砂
[OSのVer]:Windows xp    [VBのVer]:VB.NET2003
VB6からの転向組です
アップグレードウイザードが思ったより役に立たずに苦戦しています
AxWebBrowserでpostを使いユーザー名等を送りたいのですが上手くいきません
サンプル等をさがして書いてみたのですがなかなかAxWebBrowserを使ったサンプルがなくて
迷い込んでしまいました以下が私が書いたコードです
間違え個所等、ご指摘いただければ助かります
よろしくお願いします

AxWebBrowser1.Navigate("hhttp://www.。。。。")
        URL = "hhttp://www。。。。"
        Flags = 0
        TargetFrame = "_top"

        PostData = "uname=" + TextBox3.Text + "&pass=" + TextBox4
.Text + "&op=" + "login"

        Dim postDataBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(PostData)

        Headers = "Content-Type: application/x-www-form-urlencoded" & vbCrL
f
        AxWebBrowser1.Navigate(URL, Flags, TargetFrame, postDataBytes, Headers)

  

[ツリー表示へ]
タイトルRe: AxWebBrowserで Post
記事No2129
投稿日: 2005/09/14(Wed) 09:50
投稿者なおこ(・∀・)
お世話になります。

hhttp://support.microsoft.com/?scid=kb;ja;313068&spid=2073&sid=186
↑を見ると、Navigate2を使用するようですね。

[ツリー表示へ]
タイトルRe: AxWebBrowserで Post
記事No2131
投稿日: 2005/09/14(Wed) 10:25
投稿者ふもふも
ポストするデータは、WEB用の特別な?エンコードを使用します。
エンコード後のデータを文字列に直すと
%AE%CA%F3
このようなものとなり、URLエンコードというらしいです。
VB6以前ではこのようなエンコードを行ってくれるメソッドはなかったと思いまが、
VB.NETには用意されており
System.Web.HttpUtility.UrlEncode
が、URLエンコードを行ってくれるメソッドです。
詳細は
hhttp://www.atmarkit.co.jp/fdotnet/dotnettips/212urlencode/urlencode.html
こちらを参照してください。
上記の記事に書かれているように、主要な半角文字は変換されませんが、
半角の"="は変換されてしまいますので注意が必要です。
ですので、書くそれぞれの項目の変数部分?"user="や、"pass="といったものはUR
Lエンコードしないほうがいいでしょう。
また、すべて半角ですむのでしたら、別にURLエンコードをせずともいいと思いますがね。

使用方法は
'URLエンコードでエンコードを行う。
'UrlEncodeメソッドのデフォルトのエンコードがUTF-8なのでUTF-8を使用する場合は、エンコードする
文字列のみでOK
Dim postData As String =
    "uname=" & System.Web.HttpUtility.UrlEncode(TextBox3.Text) &
    "&pass=" & System.Web.HttpUtility.UrlEncode(TextBox4.Text) &
    "&op=login"
'UTF-8以外の場合は第2引数に用意したエンコーディングクラスを設定し実行する
'例ではシフトJISを使用。EUCの場合はSystem.Text.Encoding.GetEncoding("euc-jis")でOK(なはずw)
'Dim postData As String =
'    "uname=" & System.Web.HttpUtility.UrlEncode(TextBox3.Text, System.Text.Encoding.GetEncoding("shift-jis")) &
'    "&pass=" & System.Web.HttpUtility.UrlEncode(TextBox4.Text, System.Text.Encoding.GetEncoding("shift-jis")) &
'    "&op=login"
'あとは、エンコードされた文字列をバイト配列に変換して
System.Text.Encoding.ASCII.GetBytes(PostData)
'ヘッダーを設定後
Headers = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
'WebBrowserのNavigateメソッドのそれぞれの引数を設定して実行
AxWebBrowser1.Navigate(URL, Flags, TargetFrame, postDataBytes, Headers)

とすればうまくいくはずですが。

その前に、プログラムを見るとログインを行いたいのですよね?
Private Sub AxWebBrowser1_BeforeNavigate2(ByVal sender As Object, ByVal e As
AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2Event) Handles AxWebBrowser1.BeforeNavigate2
    System.Diagnostics.Debug.WriteLine(System.Text.Encoding.UTF8.GetString(CType(e.postData, Byte()))
End Sub
を追加して、BeforeNavigate2イベントを拾い、
ログインのページにいき、手入力で実際にユーザー名とパスワードを入力してログインしてみてくださ
い。
すると、出力ウィンドウにポストされるデータが表示されますので、
どのようなデータがポストされているのかが確認できますので、このデータとプログラムで作成した
postData(変数)の
データを比較すると、ポストするデータに不足がないか、使用している文字コード(エンコーディング)は正しいかがわかると思います。

[ツリー表示へ]
タイトルAxWebBrowserで Post再質問と経過
記事No2134
投稿日: 2005/09/14(Wed) 16:57
投稿者火星の砂
なおこさん情報ありがとうございました
ふもふもさん細かくご指導いただきありがとうございます

おかげさまでエラーがでなくなりましたが、ログオンがまだできません
教えていただいた
Private Sub AxWebBrowser1_BeforeNavigate2( 以下省略
を試したいのですが、申し訳ございません
その使い方がわかりません
出力ウィンドウとしてテキストボックス等を用意するのでしょうか
引き続き面倒を見ていただければ幸いです
よろしくお願いします

後からこの掲示板を見た方の為に気がついた点を少し書いておきたいと思います
System.Web.HttpUtility.UrlEncodeを使うためには
system web.dllを参照追加する必要がありました
これに気が付くのに時間がかかりました
それと、EUCエンコードはeuc-jisではエラーになりました
euc-jpを使うようです

[ツリー表示へ]
タイトルRe: AxWebBrowserで Post再質問と経過
記事No2136
投稿日: 2005/09/14(Wed) 19:19
投稿者ふもふも
ごめんなさい。euc-jisは私の間違いでした。
あと出力ウィンドウですが、
コンパイルすると下のほうでガリガリとなんか書き込まれていますよね?
このウィンドウです。
もし、わからない場合は、CTL+ALT+O(オー)を押すと、出力ウィンドウが
ない場合は表示され、ある場合は、アクティブになりますので、これで確認できます。

[ツリー表示へ]
タイトルRe^2: AxWebBrowserで Post経過2
記事No2137
投稿日: 2005/09/15(Thu) 12:06
投稿者火星の砂
ログオンに失敗しています
送信しているpostDataは
uname=*****&pass=*******&op=login となっています
*は全て半角アルファベットが入っています
全て半角アルファベットということでエンコードはいらないのかもしれない
と思い、VB6で作ったソフトと比べてみることにしました

するとVB6で送っているpostDataは
?????#慰?椽??潮???? となっていました これだとログオンできます

VB6のコードは
PostData = "uname=" + IDname + "&pass=" + Passname + "&op=&q
uot; + "login"
PostData = StrConv(PostData, vbFromUnicode)

Headers = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
WebBrowser1.Navigate URL, Flags, TargetFrame, PostData, Headers
です

vbFromUnicodeについては.netでは相当する定数はないようですね

.netではエンコードの種類をUTF-8 shift-jis EUCと試してみましたが
半角アルファベットだからという事なのでしょうかPostDataに変化はありませんでした
(試しに全角文字を入れてみましたがweb用にエンコードされました)
エンコードの方法を変えなくてはならないのでしょうか

何度も申し訳ございませんが引き続きお伺いします

[ツリー表示へ]
タイトルRe^3: AxWebBrowserで Post経過2
記事No2138
投稿日: 2005/09/15(Thu) 13:54
投稿者魔界の仮面弁士
私も、AxWebBrowser での POST 処理を行っていますが、
その手順自体は、大きく間違ってはいないと思いますよ。

ただ、送信するデータについては、相手がByRef定義なので、
  Dim postDataBytes() As Byte = 送信するバイト配列
ではなく、
  Dim postDataBytes As Object = 送信するバイト配列
で渡した方が無難かと思いますけれども。(他の引数のデータ型にも注意)


> 送信しているpostDataは
> uname=*****&pass=*******&op=login となっています
VBから送信した時点のデータではなく、むしろ、Web側に届いている結果を
確認した方が良いかと思いますよ。

さしあたり、サーバ側のログを確認する事はできますか? できないようであれば、
フリーソフトの「InetSpy」などを使って、通信内容を比較してみてください。


> するとVB6で送っているpostDataは
> ?????#慰?椽??潮???? となっていました これだとログオンできます
これ、SJISデータやASCIIテキスト、UTF-16とみなして表示した場合の化け方に似ていますね。
Unicodeバイナリではなく、SJISバイナリを、MsgBoxやDebug.Print等で確認してはいませんか?

送信するデータは、最終的には String ではなく、Byte() として渡されるのですから、
文字列ではなく、バイナリの値として比較チェックされた方が良いかと。


> vbFromUnicodeについては.netでは相当する定数はないようですね
意味として近いのは、System.Text.Encoding.Default.GetBytes() でしょうかね。


> エンコードの方法を変えなくてはならないのでしょうか
IEから/VB6から/VB.NETから送信されるデータが、それぞれまったく同質であるなら、
Webサーバから得られる結果も、本来は同等の物となるはずですよね。
(逆に、異なるデータを送っていたなら、結果もおのずと変わるでしょうけれども)

つまり、エンコードの手法はどうあれ、最終的に生成した『バイト配列の内容』が、
VB6版とVB.NET版とで同じになっていれば、POST処理は成功するはずです。

なのでまずは、「どのようにエンコードするか」という点については後回しにして、
> uname=*****&pass=*******&op=login
を表す『バイト配列』を固定的に作成し、それを WebBrowser.Navigate して、
それが VB6 と VB.NET とで同じ結果になるのかを確認した方が良いでしょう。

同じデータをNavigateに渡した時に、同じ結果が得られるのであれば、あとは
そのエンコード方法のみを調査すれば済むわけですし、逆に、同じデータでも
結果が異なってしまうなら、エンコード方法以外の部分――たとえば引数の渡し方や
データ型、あるいはタイプライブラリの内容など――を見直す必要がありますよね。

[ツリー表示へ]
タイトルRe^4: AxWebBrowserで Post経過2
記事No2143
投稿日: 2005/09/16(Fri) 15:36
投稿者火星の砂
魔界の仮面弁士さんレスありがとうございます
「InetSpy」を使って、通信内容を比較しました
最初に気がついたことは.netからの送信はGETを使用していることでした
method=postをどこかに入れなければと思いpostDataの中に入れてみましたが
状況は変わりませんでした(VB6ではこの方式を使ったこともあったので)
ググっていたら「AxWebBrowserの定数を使うと」という一文を見つけましたが
手がかりはありませんでした

それと、postDataの内容ですが全く違っていました
VB6で送ったpostDataはuname=*****&pass=*******&op=loginとなっていましたが
.netからの送信内容は 離 の全角1字。。。
昨日教えていただいた『バイト配列』を固定的に作成という下りが理解できませんでした
少し頭が煮詰まってきてしまいました
あと少し面倒を見ていただけると助かります
よろしくお願いします

[ツリー表示へ]
タイトルRe^5: AxWebBrowserで Post経過2
記事No2147
投稿日: 2005/09/16(Fri) 17:26
投稿者魔界の仮面弁士
> 最初に気がついたことは.netからの送信はGETを使用していることでした
少なくとも、当方ではPOSTでの送信もできているのですけれどね……。
ちなみに、当方でチェックしたコードはこんなイメージです。参考になれば。

  Dim URL As String = "http://〜〜"
  Dim postDataBytes As Object = 「POST内容のバイト配列」
  Dim Flags As Object = 0
  Dim TargetFrame As Object = "_top"
  Dim Headers As Object = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
  AxWebBrowser1.Navigate(URL, Flags, TargetFrame, postDataBytes, Headers)


> method=postをどこかに入れなければと思いpostDataの中に入れてみましたが
POSTメソッドになるかGETメソッドになるかは、PostData引数に依存しています。
ちなみに、WebBrowserコントロールの仕様では、このようになっています。

  PostData

  Optional.  Data to send to the server during the HTTP POST transaction. For example,
  the POST transaction is used to send data gathered by an HTML form to a program or script.
  If this parameter does not specify any post data, the Navigate method issues an HTTP GET
  transaction. This parameter is ignored if URL is not an HTTPURL.


> VB6で送ったpostDataはuname=*****&pass=*******&op=loginとなっていましたが
> .netからの送信内容は 離 の全角1字。。。
メソッドのみならず、送信しているデータまで間違っているのなら、
結果が異なっても仕方ないですね……。(^^;


> 昨日教えていただいた『バイト配列』を固定的に作成という下りが理解できませんでした
では、現在はVB6からの送信はできているようなので、VB6と絡めた形で説明してみますと。


VB6で送信データを作る時は、たとえばVB6のUnicode文字列をそのまま渡すのではなく、
  Dim B() As Byte
  B = StrConv("uname=abc", vbFromUnicode)
のようにして、StrConvを使ってASCIIテキストのバイナリにしてから送信していませんでしたか?

この場合、エンコードをプログラムで行う(StrConv等で変換して生成する)のではなく、
  ReDim B(9) As Byte
  B(0) = 117
  B(1) = 110
  B(2) = 97
   :
   :
のような形式で書いていっても、同一の送信データを作成できますよね。
このように、配列の内容を手動で作ってしまう、という事です。
# VB.NET でいえば、
#    Dim B() As Byte = New Byte() {117, 110, 97, 109, 101, 61, 97, 98, 99}
# のような形式でしょうか。


もちろん、代入するバイナリ値については、別途調べなければなりませんが、
先の No.2137 の段階では、エンコードの手順などに問題があったのか、
『PostDataに変化はありませんでした』という発言をされていましたので、
ならばエンコード部の作りこみは後回しにして、それよりも、正しいデータを
固定的に用意して、それを送信した時、IE6 や VB6 の場合と同じ結果が得られるように
尽力する方が先決かと思った次第です。

[ツリー表示へ]
タイトル解決報告と まとめ
記事No2183
投稿日: 2005/09/20(Tue) 15:32
投稿者火星の砂
魔界の仮面弁士さん、ふもふもさんpost送信成功しました
何度もご指導いただき、ありがとうございました

Dim URL As String
Dim Flags As Short
Dim TargetFrame As String
Dim Headers As String

URL = "   "
Flags = 0
TargetFrame = ""
Dim postData As String = 送信データ
Dim postDataBytes As Object = System.Text.Encoding.ASCII.GetBytes(postData)
Headers = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
AxWebBrowser1.Navigate(URL, Flags, TargetFrame, postDataBytes, Headers)

何度もやり直しているので分からなくなってしまいましたが
このパターンも試していたはずなのですが...とにかく出来ました
重々お礼もうしあげます

[ツリー表示へ]